VB.Net AES Зашифрованное значение не совпадает с http://extranet.cryptomathic.com/aescalc/index - PullRequest
0 голосов
/ 26 июня 2019

Я пишу код в VB.Net для AES, зашифровываю строку из шестнадцатеричных байтов длиной 16 и ожидаю такой же длины результата.

Я нашел код C # с веб-сайта Microsoft (https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.aes?view=netframework-4.8) и использовал https://codeconverter.icsharpcode.net/, чтобы преобразовать его в VB.Net, ofcourse сделал несколько изменений, чтобы заставить его работать в VB.Net

Ниже приведен модифицированный код для вызова, а также шифрования и дешифрования. Я пропускаю что-то, что приводит к 16 (что отправлено) зашифрованному значению +48 байт. Мне нужно 16-байтовое шестнадцатеричное значение, зашифрованное с использованием AES, режим ECB

Ниже указан телефонный код

Private Sub ProcessData()
    Dim original As String = sKi
    Dim encryptedKi() As Byte
    Dim KeyBytes() As Byte = {"&h" & Mid(sK4, 1, 2), "&h" & Mid(sK4, 3, 2), "&h" & Mid(sK4, 5, 2), "&h" & Mid(sK4, 7, 2), "&h" & Mid(sK4, 9, 2), "&h" & Mid(sK4, 11, 2), "&h" & Mid(sK4, 13, 2), "&h" & Mid(sK4, 15, 2), "&h" & Mid(sK4, 1, 2), "&h" & Mid(sK4, 3, 2), "&h" & Mid(sK4, 5, 2), "&h" & Mid(sK4, 7, 2), "&h" & Mid(sK4, 9, 2), "&h" & Mid(sK4, 11, 2), "&h" & Mid(sK4, 13, 2), "&h" & Mid(sK4, 15, 2)}
    j = 0
    Using myAes As Aes = Aes.Create()
        myAes.Key = KeyBytes
        encryptedKi = clsCryptoDES.EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV)
        For x = 0 To encryptedKi.Length - 1
            sKi = sKi & Mid("0" & Hex(encryptedKi(x)), Len(Hex(encryptedKi(x))), 2)
        Next x
    End Using
End Sub

'Ниже приведены коды для шифрования и дешифрования

Public Shared Function EncryptStringToBytes_Aes(ByVal plainText As String, ByVal Key As Byte(), ByVal IV As Byte()) As Byte()
    If plainText Is Nothing OrElse plainText.Length <= 0 Then Throw New ArgumentNullException("plainText")
    If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key")
    If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("IV")
    Dim encrypted As Byte()

    Using aesAlg As Aes = Aes.Create()
        aesAlg.Key = Key
        aesAlg.IV = IV
        aesAlg.KeySize = 128
        aesAlg.Mode = CipherMode.ECB
        Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)

        Using msEncrypt As MemoryStream = New MemoryStream()

            Using csEncrypt As CryptoStream = New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)

                Using swEncrypt As StreamWriter = New StreamWriter(csEncrypt)
                    swEncrypt.Write(plainText)
                End Using

                encrypted = msEncrypt.ToArray()
            End Using
        End Using
    End Using

    Return encrypted
End Function

Public Shared Function DecryptStringFromBytes_Aes(ByVal cipherText As Byte(), ByVal Key As Byte(), ByVal IV As Byte()) As String
    If cipherText Is Nothing OrElse cipherText.Length <= 0 Then Throw New ArgumentNullException("cipherText")
    If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key")
    If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("IV")
    Dim plaintext As String = Nothing

    Using aesAlg As Aes = Aes.Create()
        aesAlg.Key = Key
        aesAlg.IV = IV
        Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)

        Using msDecrypt As MemoryStream = New MemoryStream(cipherText)

            Using csDecrypt As CryptoStream = New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)

                Using srDecrypt As StreamReader = New StreamReader(csDecrypt)
                    plaintext = srDecrypt.ReadToEnd()
                End Using
            End Using
        End Using
    End Using

    Return plaintext
End Function

Ожидаемый результат

878CB02AA535DB9BEA77FA9107F4A29B

http://extranet.cryptomathic.com/aescalc/index?key=0123456789ABCDEF0123456789ABCDEF&iv=00000000000000000000000000000000&input=6E67229083422AD33A096657F0D01761&mode=ecb&action=Encrypt&output=

Фактический результат (16-байтовая простая строка + 48-байтовый зашифрованный результат) 6E67229083422AD33A096657F0D01761E03A1ED32270B4E934017D8429871CC7F78392C21477DD25BF1C633E146071063D844DC896DD1B285351FC8BE5C7CB42

...