2012-11-13 31 views
2

我有這個問題 我想爲一個字符串兩次使用此代碼加密:Java的RSA得到相同的代碼兩次

KeySpec keySpec = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray()); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
Key decodedPublicKey = keyFactory.generatePublic(keySpec); 
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, decodedPublicKey);  
byte a1[] = cipher.doFinal(z.getBytes()); 

KeySpec keySpec2 = new X509EncodedKeySpec(new BigInteger(publicKey, 36).toByteArray()); 
KeyFactory keyFactory2 = KeyFactory.getInstance("RSA"); 
Key decodedPublicKey2 = keyFactory2.generatePublic(keySpec2); 
Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 
cipher2.init(Cipher.ENCRYPT_MODE, decodedPublicKey2); 
byte a2[] = cipher.doFinal(z.getBytes()); 

兩者都使用相同publicKey,以及相同的輸入z但每兩個塊的代碼創建一個不同的字節數組(a1!=a2) 我希望它是平等的,但我不知道如何做到這一點(試圖尋找它,但無法找到答案還)。

會很感激,如果有人可以幫助我。

感謝

編輯:

好吧,既然我對數據進行加密是非常小(僅使用密碼)

我有一個客戶端和服務器,我沒有使用AES加密,當有人連接到客戶端時,我想確認他的密碼(他的加密密碼在android sdcard中的文件中),所以我想比較真實密碼和用戶在登錄頁面輸入的密碼。

I沒有私人的在客戶端上的關鍵,所以我不能解密加密的口令這已經是在設備上,所以我試圖比較加密的密碼(我認爲將是相同的,我現在才知道他們是不是)

也許你有一個想法我可以做什麼?如何比較一個密碼和加密的密碼,我只有公鑰

感謝

+1

爲什麼你會想他們是平等的嗎?這在處理加密時聽起來不是什麼好事。 – Austin

+2

你的最後一行代碼是不是應該使用'cipher2'而不是'cipher'? – david

回答

1

你可能想看看爲this question最多的回答。簡短版本是每次使用公鑰加密時,生成的加密數據都會有所不同。如果使用私鑰加密,則每次都會得到相同的結果。

2

PKCS#1填充被用於確保相同的明文不加密,以相同的密文。 PKCS#1是一種最佳非對稱加密填充形式,它是described on wikipedia。對相同的純文本使用不同的密文是一件好事。

如果你想毀了一個好密碼,您可以指定「NoPadding」而不是「PCKS1Padding」。這個缺點是填充也會負責指定消息的長度。使用「NoPadding」,你會發現當你解密你的密文時,你的消息已經有很多零字節的前綴。

我也評論說,這是不是你如何加密與RSA的消息。 RSA僅適用於短小的數據。例如,一個1024位的RSA密碼只能加密117個字節。使用RSA加密消息的正確方法是生成一次性AES密碼密鑰,使用RSA加密AES密碼密鑰,並使用AES加密消息。這使您可以安全地發送任何長度的消息。

相關問題