我将发布我的代码。对困惑感到抱歉。
StringBuilder texto1 = new StringBuilder("LALALLA");
byte[] x = texto1.toString().getBytes();
try {
Cipher cifrado = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cifrado.init(Cipher.ENCRYPT_MODE, key1.getPublic());
x = cifrado.doFinal(x);
String texto;
texto = new String(x, "UTF-8");
JOptionPane.showInputDialog(publicKey.toString());
String teste = "";
for (int i = 0; i < x.length; i++) {
teste += x[i];
}
jTextPane1.setText(teste);
//cifrado.init(Cipher.DECRYPT_MODE, privatekey);
byte[] y;
// x= texto.getBytes();
//y = cifrado.doFinal(texto.getBytes());
//texto = new String(y,"UTF-8");
jTextPane2.setText(x.toString());
} ...
这是按钮操作中的代码。每次我使用相同的 key 运行此代码时,加密时的 texto1 都会返回不同的结果,例如 [B@52a0b1e1
或 [B@3e55abb3
最佳答案
Java 中数组的 toString()
方法不显示数组的内容。相反,它根据数组在内存中的位置显示组件类型和标识符。
如果你想查看数组的内容,你必须迭代它的元素。而且,在这种情况下,您必须决定如何将字节元素编码为文本。看起来您正在尝试使用变量 teste
执行此操作,但我建议这样做:
StringBuilder buf = new StringBuilder();
for (byte b : x)
buf.append(String.format("%02X", b));
String teste = buf.toString();
这将生成密文的十六进制表示形式。当您尝试使用变量 texto
时,无法从随机 8 位值创建 String
,因为这些字节通常不会形成有效的 UTF-8 编码序列。您最终会在文本中得到很多替换字符 (�)。
使用十六进制(或 base-64)编码,您将看到密文仍然随机变化。这是因为 RSA 的 PKCS #1 填充方案在加密之前使用随机数据来填充消息。 RSA 的这一特意功能可防止攻击者识别何时发送相同的消息。
关于java - 为什么 RSA 使用相同的 key 和消息会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17497426/