好的,RSACrypto中的问题.加密文件时,它每次都会创建新的密钥对(用于加密).只需从加密中删除新的密钥对生成,然后在需要时直接调用newKeyPair.
而且静态变量对多线程环境不利.
我建议抛出RSACrypto类,或者至少重写它.我不知道为什么您如此害怕使用byte []类型,以及为什么您需要所有内容都进行BASE64编码.如果没有其他编码/解码,代码将非常简单.
这是工作示例(没有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))));