Java RSA解密打印空
我相信我做得对。如何使用RSA解密文件:Java RSA解密打印空,java,cryptography,rsa,bufferedreader,printwriter,Java,Cryptography,Rsa,Bufferedreader,Printwriter,我相信我做得对。如何使用RSA解密文件: 以字符串形式读入文件的每一行 设置cipher.init(cipher.DECRYPT\u模式,私钥) 使用Hex.decodeChex(String.tocharray())将字符串转换为char[] 最后做cipher.doFinal(x) 这听起来对吗?我正在这样做,但它不起作用,DecryptedFile.txt只有两行“null” 我可以使用几乎相同的过程进行加密,但显然是使用cipher.init(cipher.encrypt\u MODE,
字符串形式读入文件的每一行
cipher.init(cipher.DECRYPT\u模式,私钥)
Hex.decodeChex(String.tocharray())将字符串转换为char[]
cipher.doFinal(x)
DecryptedFile.txt
只有两行“null”
我可以使用几乎相同的过程进行加密,但显然是使用cipher.init(cipher.encrypt\u 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);
}
您正在对从FileContents派生的字符串派生的字符数组使用密码-这可能会破坏其编码。相反,从文件中读取一个字节数组,并将其用作密码的输入 如果需要,最好填充输入-使用
Cipher.getInstance(“RSA/ECB/PKCS1Padding”)
在将字符串转换为字节时,请始终指定字符编码(例如,
str.getBytes(“UTF-8”)
),反之亦然-不同的JVM使用不同的默认字符编码。RSA实际上是一种缓慢的算法-通常您不会使用它来加密文件,相反,你要用AES加密一个文件,然后用RSA加密AES密钥。@Zim-ZamO'Pootertoot我必须为我班的最后一个项目编写一个我选择的程序,我们被告知必须在其中使用RSA。明白了,在这种情况下,不用担心-只是不要在生产代码中这样做OK谢谢你的提醒如果我告诉你我逐行加密了文件然后保存了这个更改,这取决于你如何保存数据。如果您获取一个字符串,将其转换为字节[],对其进行加密,并将其保存到一个文件中,那么您需要读入与解密函数的输入完全相同的字节[]。我不知道最好的方法是什么;您可能需要更改输出函数,以便更容易地读回数据,例如,将字符串转换为字节[],对其进行加密,保存其长度,然后保存字节数组,这样您的文件将是例如120[120字节数组];现在您可以读取120个字节,然后读取接下来的120个字节,然后对它们进行解密。最好将长度字段设置为固定大小,可能需要两个字节,因此它将是[0][120][120字节的数据]。别忘了字节是用Java签名的,所以如果不小心的话,[0][128][128字节的数据]将作为-127字节的数据读入。我将每一行作为单独的字节数组保存到文本文件中,其中字节数组的长度在数组之前。例如,第一行是“128”[B@30479402第二个是“128”[B@2b462811“。在这种情况下,将数据读入字节数组应该没有问题。可能最简单的方法是通过ByteArrayInputStream(FileInputStream)将整个内容读入字节数组,然后将生成的字节数组解析为可以解密的子数组。