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 位密钥对这些值进行加密。

4

2 回答 2

1

如果您将加密密钥与加密数据一起传递,这相当于根本不加密数据(除了无法用普通的眼睛读取它,但是简单的 Base64 编码或类似的编码会做同样的事情。

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

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

于 2011-09-13T11:08:40.963 回答
1

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

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

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

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

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

于 2011-09-13T11:09:45.000 回答