Поддержка шифрования AES - PullRequest
       2

Поддержка шифрования AES

0 голосов
/ 11 февраля 2020

У меня есть шестнадцатеричная строка из 116 символов, которую нужно зашифровать AES, а затем преобразовать в Base64. Я нашел следующий код шифрования AES здесь, в StackOverflow, и из тестирования он работает так, как должен, по крайней мере, я получаю тот же результат, что и поставщик. Проблема, с которой я столкнулся, в соответствии с инструкциями поставщика, заключается в том, что «результирующая строка должна иметь длину 88 символов и заканчиваться двумя символами заполнения». Я заканчиваю с 172 символьной строкой Base64, и я понятия не имею, где проблема. Любая помощь будет принята с благодарностью

Function EncryptFromStringToBytes(ByVal plainText As String) As Byte()
    Dim encrypted As Byte()
    'Create AES object
    Using AES As RijndaelManaged = New RijndaelManaged()
        AES.Padding = PaddingMode.PKCS7
        AES.KeySize = 256
        AES.Mode = CipherMode.CBC
        AES.Key = StringToByteArray(strSharedKey)
        AES.IV = StringToByteArray(strIV)
        'create an encryptor to perform stream transform
        Dim encryptor As ICryptoTransform = AES.CreateEncryptor(AES.Key, AES.IV)
        'create the streams used for encryption
        Using msEncrypt As MemoryStream = New MemoryStream()
            Using csEncrypt As CryptoStream = New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
                'write all data to the stream. Streamwriter will use the default UTF8 encoding if not specified.
                Using swEncrypt As StreamWriter = New StreamWriter(csEncrypt) ', System.Text.Encoding.ASCII)
                    swEncrypt.Write(plainText)
                End Using
                encrypted = msEncrypt.ToArray()
            End Using
        End Using
    End Using
    'return encrypted bytes from the memory stream and convert to Base64
    Return Convert.ToBase64String(encrypted)
    'TextBox3.Text = Len(encrypted)
    'Return encrypted

End Function

@ Люк Джошуа Парк: IV, SharedKey и SharedSecret даны мне в нотации Hx. Инструкции производителей: 1. Преобразовать UT C Дата / Время из UTF8 в нотацию Hx (длина результирующей строки составляет 50 Hx символов.) - это правильно 2. Конкатенация step1 + "7 c" + SharedSecret (результирующая строка длиной 116 хх символов) - это правильно 3. Шифрование AES step2 - я думаю вот в чем проблема, но я получаю то же значение теста, полученное поставщиком 4. Преобразование шага 3 в Base64

Это функция StringToByteArray ():

    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) = Convert.ToByte(text.Substring(i, 2), 16)
    Next
    Return bytes
End Function

Как примечание, как я могу просмотреть зашифрованную строку в текстовом поле? Если я использую EncryptFromStringToBytes (CVr2.Text) .ToString, он возвращает system.byte [] вместо фактического значения.

1 Ответ

1 голос
/ 12 февраля 2020

Не шифруйте шестнадцатеричную строку из 116 символов, вместо этого шифруйте 58 байтов, которые они представляют.

Затем эти 58 байтов дадут 64 байта зашифрованных данных. 64 байта равны 512 битам, и поскольку base64 кодирует 6 битов на символ, вам нужно 512/6 ~ 86 символов для его кодирования. Поскольку base64 кодирует в блоках по 4 символа, вам потребуется 2 символа заполнения, и это заканчивается с 88-символьной строкой в ​​кодировке base64.

...