AES 字符串加密"Invalid IV block size"



我正在尝试使用下面的代码对字符串进行加密。问题是我遇到了这个错误,我没有任何线索(我只是学习加密)该怎么做甚至在哪里看。共享关键和IV已作为十六进制值提供。共享关键为64个字节,IV为32个字节。

system.security.cryptography.cryptographicexception:"指定的初始化向量(IV)不匹配此算法的块大小。'

   Public Function Encrypt(ByVal strValue As String) As String
    'Create instance of a Rijndael Managed object
    Dim aes As New RijndaelManaged
    'Set appropriate values of object
    aes.Padding = PaddingMode.PKCS7
    aes.KeySize = 256
    aes.Mode = CipherMode.CBC
    'Create streams to work with encryption process
    Dim msEncrypt As New MemoryStream()
    'SharedKey = "64 byte string"
    'IV = "32 byte string"
    Dim SharedKey As Byte() = Encoding.GetEncoding(1252).GetBytes(strSharedKey)
    Dim IV As Byte() = Encoding.GetEncoding(1252).GetBytes(strIV)
    Dim csEncrypt As New CryptoStream(msEncrypt, aes.CreateEncryptor(SharedKey, IV), CryptoStreamMode.Write)
    'Convert string value to byte array
    Dim toEncrypt As Byte() = Encoding.GetEncoding(1252).GetBytes(strValue)
    toEncrypt = Encoding.Convert(Encoding.GetEncoding(1252), Encoding.UTF8, toEncrypt)
    'Perform encryption
    csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)
    csEncrypt.FlushFinalBlock()
    'Return Base64 string
    Return Convert.ToBase64String(msEncrypt.ToArray())
    'Dim u As System.Text.UnicodeEncoding = System.Text.Encoding.Unicode
    'Dim a As System.Text.ASCIIEncoding = System.Text.Encoding.ASCII
    'Return a.GetByteCount(SharedKey)  '64 bytes
End Function

对于CBC模式(和大多数其他模式),IV长度必须与块长度相同。默认情况下,带有.net clr rijndaelman的密码,块长度为128位(16个字节)。您可以用

设置此

aes.blocksize = 256

将允许32个字节IV,但也使用32个字节的块。

另外,您的评论表明您正在使用64个字节(512位)键。那应该是32个字节(256位)键。

这些是我使用的。返回值是否正确,我还不知道。

Public Function Encrypt(ByVal strValue As String) As String
        'Create instance of a Rijndael Managed object
        Dim aes As New RijndaelManaged
        'Set appropriate values of object
        aes.Padding = PaddingMode.PKCS7
        aes.KeySize = 256
        aes.Mode = CipherMode.CBC
        'Create streams to work with encryption process
        Dim msEncrypt As New MemoryStream()
        Dim SharedKey As Byte()
        'SharedKey = ""
        'IV = ""
        SharedKey = StringToByteArray(strSharedKey)
        Dim IV As Byte()
        IV = StringToByteArray(strIV)
        Dim csEncrypt As New CryptoStream(msEncrypt, aes.CreateEncryptor(SharedKey, IV), CryptoStreamMode.Write)
        'Convert string value to byte array
        Dim toEncrypt As Byte() = Encoding.GetEncoding(1252).GetBytes(strValue)
        toEncrypt = Encoding.Convert(Encoding.GetEncoding(1252), Encoding.UTF8, toEncrypt)
        'Perform encryption
        csEncrypt.Write(toEncrypt, 0, toEncrypt.Length)
        csEncrypt.FlushFinalBlock()
        'Return Base64 string
        Return Convert.ToBase64String(msEncrypt.ToArray())
End Function
Function StringToByteArray(text As String) As Byte()
        Dim bytes As Byte() = New Byte(text.Length  2 - 1) {}
        For i As Integer = 0 To text.Length - 1 Step 2
            bytes(i  2) = Byte.Parse(text(i).ToString() & text(i + 1).ToString(), System.Globalization.NumberStyles.HexNumber)
        Next
        Return bytes
End Function

任何其他想法都会非常有用

最新更新