2013-07-05 57 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的這種有意識的功能可以防止攻擊者識別何時發送相同的消息。

相關問題