我尝试在Java程序中实现RSA算法。我面临“ BadPaddingException:数据必须以零开头”的问题。以下是用于加密和解密我的数据的方法:
public byte[] encrypt(byte[] input) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");//
cipher.init(Cipher.ENCRYPT_MODE, this.publicKey);
return cipher.doFinal(input);
}
public byte[] decrypt(byte[] input) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");///
cipher.init(Cipher.DECRYPT_MODE, this.privateKey);
return cipher.doFinal(input);
}
通过以下方式从文件中读取privateKey和publicKey属性:
public PrivateKey readPrivKeyFromFile(String keyFileName) throws IOException {
PrivateKey key = null;
try {
FileInputStream fin = new FileInputStream(keyFileName);
ObjectInputStream ois = new ObjectInputStream(fin);
BigInteger m = (BigInteger) ois.readObject();
BigInteger e = (BigInteger) ois.readObject();
RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
key = fact.generatePrivate(keySpec);
ois.close();
}
catch (Exception e) {
e.printStackTrace();
}
return key;
}
私钥和公钥的创建方式如下:
public void Initialize() throws Exception
{
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(2048);
keyPair = keygen.generateKeyPair();
KeyFactory fact = KeyFactory.getInstance("RSA");
RSAPublicKeySpec pub = fact.getKeySpec(keyPair.getPublic(), RSAPublicKeySpec.class);
RSAPrivateKeySpec priv = fact.getKeySpec(keyPair.getPrivate(), RSAPrivateKeySpec.class);
saveToFile("public.key", pub.getModulus(), pub.getPublicExponent());
saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent());
}
然后保存在文件中:
public void saveToFile(String fileName, BigInteger mod, BigInteger exp) throws IOException {
FileOutputStream f = new FileOutputStream(fileName);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(mod);
oos.writeObject(exp);
oos.close();
}
我不知道问题是怎么来的。任何帮助将不胜感激!
提前致谢。
原则上,代码看起来还可以-
我将进行一些登录以确保所生成的密钥是真正从文件中读取的密钥(您所做的事情并不像使用新密钥生成数据那样愚蠢,然后例如尝试用旧的阅读它?)
我用RSA实现了数据加密/解密。如果我只是在本地加密/解密,它可以工作,但是如果我发送加密的数据,我会得到BadPaddingException:数据必须从零开始。 为了通过网络发送数据,我需要在客户端将数据从字节数组改为字符串(我以报头的形式发送),然后在服务器端检索数据并将其改回字节数组。 这里是我的本地加密/解密代码(我使用私钥加密,使用公钥解密): DecryptedString和mess
问题内容: 嘿,我不断出现错误: 索引(从零开始)必须大于或等于零且小于参数列表的大小。 我的代码: 问题答案: 你的第二个用途是一个占位符,但你只传递一个参数,所以你应该使用来代替。 更改此: 对此:
JSONException:JSONObject文本必须以字符6处的{开头。
我有一个来自REST服务的JSON: 我正在使用java-json.jar来解析这个JSON,这是我试图传递到JSON字符串上方的简单片段: 但我得到了下面的例外: 首先,我假设这是因为JSON中的和字符,并尝试替换如下: 但即便如此,我也遇到了同样的例外。谁能指导我知道我做错了什么吗?
我正在尝试解析一些json,这样我就可以得到json的不同部分。当我使用以下代码时 我得到了一个错误: 你知道为什么我会犯这个错误吗?我能够用在线json验证器验证json
我正在JSBin上玩ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,它就不起作用。 例如,以下内容不会呈现: 但只要我用替换它就会呈现。 我不能用小字母开始标签有什么原因吗?
问题内容: 我有一个JSON文件,我正在尝试处理,但出现以下错误: 线程“主” org.json.JSONException中的异常:JSONObject文本必须在org.json.JSONObject的org.json.JSONTokener.syntaxError(JSONTokener.java:433)的1 [字符2行1]处以“ {”开头。(JSONObject.java:195)位于or
问题内容: 我正在使用JSBin上的ReactJS框架。 我注意到,如果我的组件名称以小写字母开头,那么它将不起作用。 例如,以下内容不呈现: 但是,一旦我替换为,它就会渲染。 我不能以小写字母开头的标签有原因吗? 问题答案: 在JSX中,小写标签名称被认为是HTML标签。但是,带点号(属性访问器)的小写标记名称不是。 参见HTML标签与React组件。 编译为(html标记) 编译为 编译为