我正在研究客戶端 - 服務器安全協議,因爲密鑰必須發送到服務器,所以我需要使用Java中的RSA加密SecretKey以獲取HMAC摘要。加密有兩個階段;首先,我需要使用公共非對稱密鑰對對稱密鑰進行加密,然後使用私有非對稱密鑰加密該加密消息。用Java中的RSA加密SecretKey
爲此我生成SecretKey的是:
public SecretKey generate(){
KeyGenerator generator = KeyGenerator.getInstance("HMACSHA256");
k = generator.generateKey();
return k;
}
後來,我使用此代碼的任何字節數組使用公鑰加密:
public byte[] encryptPublic(PublicKey key, byte[] array){
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(array);
return encrypted;
}
的加密與私人碼密鑰是相同的,但使用私鑰。
對於我使用的是1024位長的非對稱密鑰的RSA加密,所以我有兩個主要問題:
- 我怎樣才能把我的SecretKey的字節數組,以便將它與RSA和公開加密鍵?
- 由於公鑰加密產生128字節的字節數組,如果密鑰長度爲1024位,並且只能加密117字節長的消息,如何使用私鑰再次加密該消息?
一些評論。 1)不要在任何地方使用密碼學中的默認值。在你的'getInstance()'方法中,總是指定完整的三部分轉換字符串。 2)。不要使用私鑰進行加密,而是執行*簽署*。你使用'Signature'類。 3)密鑰,包括SecretKeys,有'getEncoded()'方法返回一個字節數組,代表某種標準格式的密鑰。對於對稱密鑰,即'SecretKey'實例,'getEncoded()'返回的字節數組就是原始密鑰字節。 –
對於Q2:您可以使用隨機AES密鑰加密密文,然後使用另一輪RSA加密新的AES密鑰,但您爲什麼要這樣做? –