2012-08-13 83 views
4

我試圖實現一個變異的加密算法(理論上由我開發)和作爲需求的一部分,我需要生成一個RSA密鑰對並將其存儲在數據庫中,以便稍後可以將其作爲加密的一部分進行檢索進程(僅用於加密會話密鑰,以便可以使用加密的消息安全發送)。如何創建一個RSA密鑰對,以便它可以存儲在數據庫中?

我試圖生成一個RSA密鑰對似乎可以工作,但它會一直重複生成相同的值,而不是每次運行代碼時都給出新的對。我做錯了什麼? 如果這些值依賴於機器本身(因此顯示相同的值),那麼有沒有辦法將密鑰對生成鏈接到提供的電子郵件地址,以便每當輸入新的電子郵件地址時,不同的RSA密鑰對輸出?

下面的代碼是我嘗試生成密鑰對

import java.security.*; 
import java.security.*; 
/** 
* @author Speedy gonzales 
*/ 
public class test { 

    public static void main(String[] args) throws NoSuchAlgorithmException,  NoSuchProviderException { 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
     keyGen.initialize(1024); 

     byte[] publicKey = keyGen.genKeyPair().getPublic().getEncoded(); 
     StringBuffer retString1 = new StringBuffer(); 
     retString1.append("["); 

     for (int puk = 0; puk < publicKey.length; ++puk) { 
      retString1.append(publicKey[puk]); 
      // retString1.append(", "); 
     } 
     retString1 = retString1.delete(retString1.length()-2,retString1.length()); 
     retString1.append("]"); 
     System.out.println(retString1); 

      byte[] privateKey = keyGen.genKeyPair().getPrivate().getEncoded(); 
     StringBuffer retString2 = new StringBuffer(); 
     retString2.append("["); 

     for (int pri = 0; pri < privateKey.length; ++pri) { 
      retString2.append(privateKey[pri]); 
      // retString2.append(", "); 
     } 
     retString2 = retString2.delete(retString2.length()-2,retString2.length()); 
     retString2.append("]"); 
     System.out.println(retString2); 
    } 
} 

感謝

+4

我所知道的關於編寫加密算法的知識是,除非你是一位密碼數學天才,否則你不應該嘗試它。 – Bobulous 2012-08-13 18:25:16

+0

@ user1515834:這不是他要求的。堅持提供的問題。 – Wug 2012-08-13 18:28:35

+0

我對這個特定的實現並不瞭解,但是如果每次運行都得到相同的結果,我的第一個停靠點就是檢查rng種子。 – Charles 2012-08-13 18:35:17

回答

4

那麼,你的第一個問題是:

keyGen.genKeyPair().getPublic().getEncoded(); 
keyGen.genKeyPair().getPrivate().getEncoded(); 

你不保存密鑰對,所以你正在生成不匹配的公鑰和私鑰。從javadocs,genKeyPair()行爲如下:

這將在每次調用時生成一個新的密鑰對。

其次,getEncoded()只是返回鍵作爲字節數組。如果你的數據庫可以存儲二進制值,只需要以這種方式存儲。否則,你可能會有更好的運氣將它轉換爲字符串。你可以,例如,基部64這個整潔的小把戲(可能是更可靠的,你在做什麼)進行編碼:

String keyAsString = new BigInteger(publicKey.getEncoded()).toString(64); 

可以隨後得到原始字節回來:

byte[] bytes = new BigInteger(keyAsString, 64).toByteArray(); 

你說你每次跑步都會得到相同的價值(並且確保你在此之前不打擾),並且我不是100%確定爲什麼。您應該能夠訪問算法參數(您可能必須將該鍵轉換爲其他類型),請嘗試打印這些參數以查看它們是否相同。有人提到檢查你的隨機數發生器,這也可能是一個好主意。

+0

在原始問題中看到我的評論 - 我相信OP正在從方法獲得*類似*的輸出,並假設它們是相同的。實際上,它們看起來很相似,因爲'getEncoded()'返回的ASN.1對象具有幾個必需的標題/字段。 – 2012-08-13 19:23:36

+0

很可能。 OP可能是afk什麼的,自問問題以來一直沒有活躍 – Wug 2012-08-13 19:25:50

相關問題