2011-09-13 170 views
1

我使用Rijndael(作爲AES算法)進行加密。我加密值(對象屬性)並將對象序列化爲xml,然後通過Web服務將xml發送到接收器。我想傳遞我用來加密數據的加密對稱密鑰。但我應該傳遞什麼關鍵? 我的解密算法看起來像這樣(vb.net):加密 - 對稱密鑰

Public Function Encrypt(ByVal stringToEncrypt As String) As String 

    Dim textConverter As New ASCIIEncoding() 
    Dim myRijndael As New RijndaelManaged() 
    Dim encrypted() As Byte 
    Dim stringToEncryptAsByte() As Byte 
    Dim encryptedAsString As String 
    Dim key() As Byte 
    Dim IV() As Byte 

     ' Set symetric key size og chiper mode 
     myRijndael.Mode = CipherMode.CBC 
     myRijndael.KeySize = 128 

     ' Create a new key and initialization vector. 
     myRijndael.GenerateKey() 
     myRijndael.GenerateIV() 

     ' Get the key and IV. 
     key = myRijndael.Key 
     IV = myRijndael.IV 

     ' Get an encryptor. 
     Dim encryptor As ICryptoTransform = myRijndael.CreateEncryptor(key, IV) 

     ' Encrypt the data. 
     Dim msEncrypt As New MemoryStream() 
     Dim csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) 

     ' Convert the data to a byte array. 
     stringToEncryptAsByte = textConverter.GetBytes(stringToEncrypt) 

     ' Write all data to the crypto stream and flush it. 
     csEncrypt.Write(stringToEncryptAsByte, 0, stringToEncryptAsByte.Length) 
     csEncrypt.FlushFinalBlock() 

     ' Get encrypted array of bytes. 
     encrypted = msEncrypt.ToArray() 
     encryptedAsString = Convert.ToBase64String(encrypted) 

     Return encryptedAsString 
End Function 

如果我希望解密的加密字符串我必須使用兩個密鑰和IV,但我想我已經傳遞下去只有一個鍵值。我是否必須以另一種方式來做這件事,或者我應該傳遞什麼? 我的規範說,值必須使用AES和128位密鑰進行加密。

回答

1

如果與加密數據一起傳遞的加密密鑰,這相當於在所有(其他未加密的數據比一個不能與普通眼讀它,但隨後一個簡單的Base64編碼或類似的會做相同。

要使用對稱加密算法,發送者和接收者必須共享一個祕密(對稱密鑰,或者說,其中的關鍵,可以得出)。如果這是不可能的,你可能想使用混合對稱/非對稱加密方案:這裏發送方使用公鑰算法對密鑰進行加密,並將其與對稱加密的數據一起發送(在這種情況下,發送方必須知道與接收方私鑰對應的公鑰)。

這就是說,與鏈接塊密碼(如CBC)操作模式中,發送器通常通過與數據一起初始化向量。

1

IV是簡單,只需把它原樣。通常的做法是把它放在密文上,以便接收器在需要時將其剝離。沒有必要保持IV的祕密。

關鍵是沒有那麼簡單,因爲它必須保密。一般有兩種解決方案:

  1. 使用Diffie-Hellman同意與每次需要向他們發送加密的文件時,您的收件人一個新的密鑰。

  2. 使用他們的RSA公鑰來加密AES密鑰並將其發送給他們的方式。

您可能還想調查使用HMAC來確保文件在傳輸過程中未被篡改。

+0

感謝您的回覆!我想用PKI(X509證書)加密我的對稱密鑰。我無法弄清楚接收者需要什麼,只是鑰匙或鑰匙和IV。在我的關於如何加密數據的規範(來自接收者部分)中,它說我必須傳遞我的加密對稱密鑰,但是我找不到關於IV的任何信息。我怎麼知道接收機也使用IV,或者期望我通過IV? – Liss

+0

@Liss:告訴你的接收器你發送的主文件的前16個字節是IV。那麼這取決於他們如何處理它。 IVs不需要安全。只有關鍵需要安全。 – rossum

+0

@Liss:CBC(實際上除ECB以外的所有模式)總是使用IV,問題只會是如何轉移它。通常的方法是簡單地將它加入到加密數據中。 –