加密 - 对称密钥

时间:2011-09-13 10:51:28

标签: vb.net encryption key aes rijndael

我正在使用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位密钥对值进行加密。

2 个答案:

答案 0 :(得分:1)

如果您将加密密钥与加密数据一起传递,这相当于根本不对数据进行加密(除了用普通的眼睛无法读取它之外,然后简单的Base64编码或类似的将执行相同的操作

要使用对称加密算法,发送方和接收方必须共享一个秘密(对称密钥,或者可以从中导出密钥的东西)。如果无法做到这一点,您可能希望使用混合对称/非对称加密方案:此处发件人使用公钥算法加密密钥,并将其与对称加密数据一起发送。 (在这种情况下,发件人必须知道与接收者私钥对应的公钥。)

也就是说,对于分组密码(如CBC)的链接操作模式,发送方通常会将初始化向量与数据一起传递。

答案 1 :(得分:1)

IV非常简单,只需按原样发送即可。通常的做法是将其添加到密文中,以便接收器在需要时将其剥离。没有必要保密IV。

关键不是那么简单,因为必须保密。有两种通用解决方案:

  1. 每次需要向收件人发送加密文件时,请使用Diffie-Hellman与收件人商定新的密钥。

  2. 使用他们的RSA公钥加密AES密钥并以这种方式发送给他们。

  3. 您可能还想调查使用HMAC以确保文件在传输过程中未被篡改。