我会发布我的代码。对困惑感到抱歉。
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());
} ...
这是按钮操作中的代码。每次运行此代码时,使用相同的密钥,texto1 on encryption会返回不同的结果,如[B@52a0b1e1
或[B@3e55abb3
答案 0 :(得分:6)
Java中的toString()
数组方法不显示数组的内容。相反,它显示组件类型和基于数组在内存中的位置的标识符。
如果要查看数组的内容,则必须迭代其元素。而且,在这种情况下,您必须决定如何将字节元素编码为文本。看起来您正在尝试使用变量teste
执行此操作,但我建议使用以下内容:
StringBuilder buf = new StringBuilder();
for (byte b : x)
buf.append(String.format("%02X", b));
String teste = buf.toString();
这将生成密文的十六进制表示。在尝试使用变量String
时,无法从随机的8位值创建texto
,因为字节通常不会形成有效的UTF-8编码序列。你最终会在文本中找到很多替换字符( )。
使用十六进制(或base-64)编码,您将看到密文仍然随机变化。这是因为RSA的PKCS#1填充方案在加密之前使用随机数据填充消息。 RSA的这一故意功能可防止攻击者识别何时发送相同的消息。