我相信我这样做是对的。我如何看到使用RSA解密文件:
String
cipher.init(Cipher.DECRYPT_MODE, privateKey)
char[]
Hex.decodeHex(String.toCharArray())
cipher.doFinal(x)
这听起来不错吗?我这样做但它不起作用,DecryptedFile.txt
只是2行“null”。
我能够使用几乎完全相同的过程进行加密,但显然使用cipher.init(Cipher.ENCRYPT_MODE, publicKey)
加密。
这是我的代码
try {
BufferedReader inStream = new BufferedReader (new FileReader(cryptoFile));
int k = 0;
fileContents.add(inStream.readLine());
while(fileContents.get(k) != null) {
k++;
fileContents.add(inStream.readLine());
}
inStream.close();
try {
PrivateKey privateKey = kp.getPrivate();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
int j = 0;
while(fileContents.get(j) != null) {
String text = fileContents.get(j);
try {
x = Hex.decodeHex(text.toCharArray());
y = cipher.doFinal(x);
} catch (DecoderException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}
try (PrintWriter file = new PrintWriter(
new BufferedWriter(
new FileWriter("DecryptedFile.txt", true)))) {
file.println(y);
} catch (IOException e) {
System.err.println("IOERROR: " + e.getMessage() + "\n");
}
j++;
}
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) {
Logger.getLogger(Crypto.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException e) {
System.err.println("IOERROR: File NOT Found: " + cryptoFile + "\n");
} catch ( IOException e ) {
System.err.println("IOERROR: " + e.getMessage() + "\n");
} finally {
messagePane.setText(messagePane.getText() + "\n\n"
+ cryptoFile + "is done being decrypted.");
messagePane.setText(messagePane.getText() + "\n"
+ "Decrypted file saved to \'DecryptedFile.txt\'.");
cryptoFile = "";
pathTextField.setText(cryptoFile);
encryptButton.setEnabled(false);
decryptButton.setEnabled(false);
}
答案 0 :(得分:1)
您在从FileContents派生的String派生的字符数组上使用密码 - 这可能会搞砸其编码。而是从文件中读取一个字节数组,并将其用作密码的输入。
如有必要,最好填充输入 - 使用Cipher.getInstance("RSA/ECB/PKCS1Padding")
在将字符串转换为字节时,请始终指定字符编码(例如str.getBytes("UTF-8")
),反之亦然 - 不同的JVM使用不同的默认字符编码。