2

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

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 都会返回不同的结果,例如[B@52a0b1e1[B@3e55abb3

4

1 回答 1

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 的这一刻意特性可防止攻击者识别出同一消息何时发送。

于 2013-07-05T22:18:19.733 回答