为什么RSA使用相同的密钥和消息产生不同的结果?

时间:2013-07-05 22:05:31

标签: java arrays encryption character-encoding rsa

我会发布我的代码。对困惑感到抱歉。

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

1 个答案:

答案 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的这一故意功能可防止攻击者识别何时发送相同的消息。