java - 为什么 RSA 使用相同的 key 和消息会产生不同的结果?

标签 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());
} ...

这是按钮操作中的代码。每次我使用相同的 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/

相关文章:

java - 祖尔 : How to get path variables from request

c - 我将如何合并这两个数组? C

c++ - 在对字符串进行排序时在 C++ 中使用 sort()

javascript - 向 javascript 数组的 n 种组合添加计数器

java - 如何将 Observable<Observable<List<T>>> 转换为 Observable<List<T>>

java - 使用 API 读取写入 Google 电子表格是免费或付费的

java - RSA 签名异常 : Signature length not correct

java - 在java中进行加密的正确方法

c# - Silverlight C# 中的 MD5 或其他加密

java - 如何仅使用私钥文件创建 java keystore ?