2013-07-05 22 views
2

我会发布我的代码。对困惑感到抱歉。为什么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返回不同的结果像[[email protected][[email protected]

+3

首先:**是**,加密是**应该**做到这一点。第二:你打印的字符串是'byte []'的'toString()',它的内容完全不相关。 –

+1

PKCS#1v1.5填充是危险的;如果可能,请考虑使用OAEP。 – ntoskrnl

回答

6

阵列的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编码序列。您最终会在文本中添加大量替换字符(&#xFFFD;)。

使用十六进制(或base-64)编码,您将看到密文仍随机变化。这是因为RSA的PKCS#1填充方案使用随机数据在加密之前填充消息。 RSA的这种有意识的功能可以防止攻击者识别何时发送相同的消息。

相关问题