Java RSA 2048加密解密-异常
我正在尝试用RSA 2048加密和解密数据 我们有一个公钥和一个私钥,并且将始终使用相同的密钥。 但问题是,当我解密时,我得到了javax.crypto.BadPaddingException:数据必须以零开始Java RSA 2048加密解密-异常,java,encryption,rsa,public-key-encryption,private-key,Java,Encryption,Rsa,Public Key Encryption,Private Key,我正在尝试用RSA 2048加密和解密数据 我们有一个公钥和一个私钥,并且将始终使用相同的密钥。 但问题是,当我解密时,我得到了javax.crypto.BadPaddingException:数据必须以零开始 File file = new File("C:\\temp-ldi\\pubkey.txt"); FileWriter writer = new FileWriter(file); file.createNewFile(); encryptedText = RSACrypto.encr
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();
然后我使用下面的代码来解密数据
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()));
所有加密/解密字符串将以Base64Encoder/Base64Decoder格式返回
如何从文件/简单字符串传递私钥,以便不修改密钥
更新
rsacypto类:好的,rsacypto有问题。加密文件时,它会在每次创建新密钥对时(在
encrypt
中)创建新密钥对。只需从encrypt中删除新密钥对生成,需要时直接调用newKeyPair
。
静态变量对多线程环境没有好处
我建议抛出rsacypto类,或者至少重写它。我不知道为什么你这么害怕使用byte[]类型,为什么你需要所有的东西都是BASE64编码的。代码将非常简单,无需额外的编码/解码
下面是一个工作示例(没有RSACypto),您可以将其用作模板:
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))));
请显示RSACrypto类的代码。您将私钥保存在文件
prikey.txt
中,但从privkey.txt
中读取私钥,粘贴时只需键入即可。从同一个文件读取。假设该文件夹没有其他文件