2011-03-28 158 views
4

通過一些我已經peiced在一起了一些加密/解密方法是利用Rfc2898DeriveBytes獲得密鑰和初始化向量的例子細算。我擔心接收我的加密內容的一方必須能夠解密它。由於我有過什麼樣的語言,但使用沒有控制權(可能成爲Java,PHP,C等。)我怎麼確保他們能夠獲得的密鑰和初始化向量(IV),因爲我已經使用在Rfc2898DeriveBytes類。淨?這裏是我正在使用的加密和解密方法。跨平臺的加密/解密 - 處理密鑰和初始化向量(IV)

Public Shared Function EncryptText(ByVal plainText As String, ByVal password As String) As String 

    Dim aesCrypto As Rijndael = Nothing 
    Dim plainTextBytes As Byte() 
    plainTextBytes = Encoding.Default.GetBytes(plainText) 

    Dim rfc2898 As Rfc2898DeriveBytes 
    rfc2898 = New Rfc2898DeriveBytes(password, GenerateSalt(password)) 
    aesCrypto = Rijndael.Create() 
    aesCrypto.Padding = PaddingMode.ISO10126 
    Dim tx As ICryptoTransform 
    tx = aesCrypto.CreateEncryptor(rfc2898.GetBytes(32), rfc2898.GetBytes(16)) 
    Dim encryptedBytes As Byte() 
    encryptedBytes = tx.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length) 
    Return Convert.ToBase64String(encryptedBytes) 

End Function 

Public Shared Function DecryptText(ByVal encryptedText As String, ByVal password As String) As String 

    Dim aesCrypto As Rijndael = Nothing 
    Dim encryptedTextBytes As Byte() 
    encryptedTextBytes = Convert.FromBase64String(encryptedText) 

    Dim rfc2898 As Rfc2898DeriveBytes 
    rfc2898 = New Rfc2898DeriveBytes(password, GenerateSalt(password)) 
    aesCrypto = Rijndael.Create() 
    aesCrypto.Padding = PaddingMode.ISO10126 
    Dim tx As ICryptoTransform 
    tx = aesCrypto.CreateEncryptor(rfc2898.GetBytes(32), rfc2898.GetBytes(16)) 
    Dim decryptedBytes As Byte() 
    decryptedBytes = tx.TransformFinalBlock(encryptedTextBytes, 0, encryptedTextBytes.Length) 
    Return Encoding.Default.GetString(decryptedBytes) 

End Function 

回答

4

你會告訴收件人實現PBKDF2,這是RFC2898PKCS #5定義的標準。 Microsoft's documentation說,它們的功能使用HMAC-SHA-1作爲僞隨機函數,以及1000作爲迭代的默認數量。這是他們需要的信息。

但是,您還需要爲發送與GenerateSalt()在發送端產生的鹽。收件人不能自己調用​​GenerateSalt() - 應該爲每封郵件隨機生成。

+0

謝謝!這是我需要知道的。我將發送「salt」和加密文本。 – webworm 2011-03-29 12:05:07