Расшифровка AES работает в python, но не в. NET - PullRequest
0 голосов
/ 22 марта 2020

Этот код python работает отлично и расшифровывает зашифрованный текст:

import sys, hexdump, binascii
from Crypto.Cipher import AES
class AESCipher:
def __init__(self, key):
     self.key = key

def decrypt(self, iv, data):
     self.cipher = AES.new(self.key, AES.MODE_CBC, iv)
     return self.cipher.decrypt(data)

key = binascii.unhexlify("0602000000a400005253413100040000")
iv = binascii.unhexlify("0100010067244F436E6762F25EA8D704")
hex_str_cipher = "d690a9d0a592327f99bb4c6a6b6d4cbe" 
ciphertext = binascii.unhexlify(hex_str_cipher)
raw_un = AESCipher(key).decrypt(iv, ciphertext)
password = raw_un.decode('utf-16')
print(password)

, но пытается воссоздать его в VB. NET примерно так:

Sub Main()
    Dim AesEnc = System.Security.Cryptography.Aes.Create()
    AesEnc.Mode = CipherMode.CBC
    AesEnc.KeySize = 128
    AesEnc.Key = HexToBytes("0602000000a400005253413100040000")
    AesEnc.IV = HexToBytes("0100010067244F436E6762F25EA8D704")
    Dim EncryptedBytes As Byte() = HexToBytes("d690a9d0a592327f99bb4c6a6b6d4cbe")
    Using MemStrm As New IO.MemoryStream(EncryptedBytes)
        Using CryptStrm As New CryptoStream(MemStrm, AesEnc.CreateDecryptor(), CryptoStreamMode.Read)
            Dim PlaintextBytes(EncryptedBytes.Length - 1) As Byte
            CryptStrm.Read(PlaintextBytes, 0, PlaintextBytes.Length)
            Console.WriteLine(System.Text.Encoding.Unicode.GetString(PlaintextBytes))
        End Using
    End Using
End Sub

Public Function HexToBytes(HexString As String) As Byte()
    Dim ByteLength = HexString.Length \ 2
    Dim Bytes(ByteLength - 1) As Byte
    For i = 0 To ByteLength - 1
        Bytes(i) = Convert.ToByte(HexString.Substring(i * 2, 2), 16)
    Next
    Return Bytes
End Function

Всегда терпит неудачу при вызове CryptStrm.Read с ошибкой «Заполнение недопустимо и не может быть удалено»

Я выполнял шифрование / дешифрование AES в. NET много раз, прежде чем использовать вышеописанную процедуру, поэтому я могу Я не понимаю, почему это не так, как если бы ключ / IV был неправильным, если он идентичен тому, что использует скрипт python. Любые идеи?

1 Ответ

0 голосов
/ 22 марта 2020

Спасибо @OguzOzgul за его комментарий о заполнении, я попытался добавить эту строку в мой код. NET, и теперь он отлично работает

AesEnc.Padding = PaddingMode.Zeros
...