Шифрование строки AES "Неверный размер блока IV" - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь зашифровать строку, используя код ниже.Проблема в том, что я получаю эту ошибку, и я понятия не имею (я только изучаю шифрование), что делать или даже где искать.SharedKey и IV были предоставлены в виде шестнадцатеричных значений.SharedKey составляет 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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Это то, что я использовал.Является ли возвращаемое значение правильным, я пока не знаю.

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

Любые другие идеи были бы очень полезны

0 голосов
/ 25 февраля 2019

Для режима CBC (и большинства других режимов) длина IV должна быть равна длине блока.По умолчанию с шифром .NET CLR RijndaelManaged длина блока составляет 128 бит (16 байтов).Вы можете установить это с помощью

aes.BlockSize = 256

, что позволит 32-байтовому IV, но также использовать блоки по 32 байта.

Кроме того, ваши комментарии предполагают, чтоВы используете 64-битный (512-битный) ключ.Это должен быть 32-битный (256-битный) ключ.

...