java RSA 2048 加密解密 - 异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13990181/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
RSA 2048 Encryption Decryption - Exception
提问by Reddy
I am trying to encrypt and decrypt the data with RSA 2048.
我正在尝试使用 RSA 2048 加密和解密数据。
We have one public key and private key and will be using same throughout. but the problem is, when I decrypt, I am getting javax.crypto.BadPaddingException: Data must start with zero
我们有一个公钥和私钥,并将始终使用相同的密钥。但问题是,当我解密时,我收到 javax.crypto.BadPaddingException: Data must start with zero
File file = new File("C:\temp-ldi\pubkey.txt");
FileWriter writer = new FileWriter(file);
file.createNewFile();
encryptedText = RSACrypto.encrypt("PLAIN TEXT"); //no argument of pub-key, generate key pair
writer.write(new BASE64Encoder().encode(RSACrypto.pubKeyToBytes(RSACrypto.publicKey)));
writer.close();
file = new File("C:\temp-ldi\privkey.txt");
writer = new FileWriter(file);
file.createNewFile();
writer.write(new BASE64Encoder().encode(RSACrypto.privKeyToBytes(RSACrypto.privateKey)));
writer.close();
then I am using below code to decrypt the data
然后我使用下面的代码来解密数据
File privfile = new File("C:\temp-ldi\privkey.txt");
File pubfile = new File("C:\temp-ldi\pubkey.txt");
FileReader reader = new FileReader(pubfile);
// file.createNewFile();
BufferedReader br = new BufferedReader(reader);
StringBuilder sb = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
reader.close();
this.encryptedText = RSACrypto.encrypt("PLAIN TEXT", sb.toString());
reader = new FileReader(privfile);
br = new BufferedReader(reader);
sb = new StringBuilder();
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
reader.close();
System.out.println(RSACrypto.decrypt(this.encryptedText, sb.toString()));
all the encryption/decryption string will return in Base64Encoder/Base64Decoder format.
所有加密/解密字符串将以 Base64Encoder/Base64Decoder 格式返回。
How do I pass the private key from file/simple string so that the key is not modified.
如何从文件/简单字符串传递私钥,以便不修改密钥。
UpdateRSACrypto class : http://sebsauvage.net/paste/?83517f2b3db94d24#Sdu12/vXPuxa5AxO95FPgKSF6N40R2DzD6lwQkvroyE=
更新RSACrypto 类:http://sebsauvage.net/paste/?83517f2b3db94d24#Sdu12/vXPuxa5AxO95FPgKSF6N40R2DzD6lwQkvroyE =
采纳答案by user1516873
OK, problem in RSACrypto. When you encrypt file, it creates every time new keypair (in encrypt
). Just remove new keypair generation from encrypt, call newKeyPair
direcly, when you need it.
And that static variables does no good for multi-thread environment.
好的,RSACrypto 中的问题。当您加密文件时,它每次都会创建新的密钥对(in encrypt
)。只需从加密中删除新的密钥对生成newKeyPair
,在需要时直接调用。并且静态变量对多线程环境没有好处。
I'll suggest to throw RSACrypto class, or rewrite it at least. I don't know why you so afraid of using byte[] type and why you need everything be BASE64 encoded. Code will a lot simple without additional encoding/decoding.
我会建议抛出 RSACrypto 类,或者至少重写它。我不知道你为什么这么害怕使用 byte[] 类型,为什么你需要所有的东西都是 BASE64 编码的。无需额外的编码/解码,代码就会简单很多。
Here is working example (without RSACrypto), you can use it as template:
这是工作示例(没有 RSACrypto),您可以将其用作模板:
File file = new File("C:\temp-ldi\pubkey.txt");
FileWriter writer = new FileWriter(file);
file.createNewFile();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
KeyPair keyPayr = generator.generateKeyPair();
writer.write(new BASE64Encoder().encode(keyPayr.getPublic().getEncoded()));
writer.flush();
writer.close();
file = new File("C:\temp-ldi\privkey.txt");
writer = new FileWriter(file);
file.createNewFile();
writer.write(new BASE64Encoder().encode(keyPayr.getPrivate().getEncoded()));
writer.flush();
writer.close();
File privfile = new File("C:\temp-ldi\privkey.txt");
File pubfile = new File("C:\temp-ldi\pubkey.txt");
FileReader reader = new FileReader(pubfile);
BufferedReader br = new BufferedReader(reader);
StringBuilder sb = new StringBuilder();
String s;
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
reader.close();
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(new BASE64Decoder().decodeBuffer(sb.toString())));
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
String encryptedText = new BASE64Encoder().encode(cipher.doFinal("PLAIN TEXT".getBytes("UTF-8")));
System.out.println("encrypted: " + encryptedText);
reader = new FileReader(privfile);
br = new BufferedReader(reader);
sb = new StringBuilder();
while ((s = br.readLine()) != null) {
sb.append(s);
}
br.close();
reader.close();
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(sb.toString())));
cipher.init(Cipher.DECRYPT_MODE, privateKey);
System.out.println( new String(cipher.doFinal (new BASE64Decoder().decodeBuffer(encryptedText))));