Использование AesCryptoServiceProvider в VB.NET - PullRequest
3 голосов
/ 07 апреля 2009

Моя проблема на самом деле немного сложнее, чем просто использование AES в VB.NET, поскольку я действительно пытаюсь использовать AES в VB.NET из приложения Java через JACOB. Но сейчас я должен сосредоточиться на самой реализации AES.

Вот мой код шифрования

Public Function EncryptAES(ByVal toEncrypt As String, ByVal key As String) As Byte()
    Dim keyArray = Convert.FromBase64String(key)
    Dim toEncryptArray = Encoding.Unicode.GetBytes(toEncrypt)

    Dim aes = New AesCryptoServiceProvider
    aes.Key = keyArray
    aes.Mode = CipherMode.ECB
    aes.Padding = PaddingMode.ISO10126
    Dim encryptor = aes.CreateEncryptor()

    Dim encrypted = encryptor.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length)
    aes.Clear()

    Return encrypted
End Function

Вернувшись в код Java, я превращаю массив байтов в шестнадцатеричную строку.

Теперь, чтобы изменить процесс, вот мой код расшифровки

Public Function DecryptAES(ByVal toDecrypt As String, ByVal key As String) As Byte()
    Dim keyArray = Convert.FromBase64String(key)
    Dim toDecryptArray = Convert.FromBase64String(toDecrypt)

    Dim aes = New AesCryptoServiceProvider
    aes.Key = keyArray
    aes.Mode = CipherMode.ECB
    aes.Padding = PaddingMode.ISO10126
    Dim decryptor = aes.CreateDecryptor()

    Dim decrypted = decryptor.TransformFinalBlock(toDecryptArray, 0, toDecryptArray.Length)
    aes.Clear()
    Return decrypted
End Function

Когда я запускаю код дешифрования, я получаю следующее сообщение об ошибке

Заполнение недействительно и не может быть удалено.

1 Ответ

0 голосов
/ 07 апреля 2009

ОК, поэтому с моим исходным кодом произошла пара ошибок.

Во-первых, без отладки. Мне пришлось добавить внутренний тест, чтобы убедиться, что мой код может зашифровать и расшифровать, прежде чем обернуть его в Java. Это было глупо с моей стороны.

Два: метод TransformFinalBlock объектов зашифрования и расшифровщика, похоже, не работает так, как объявлено.

Хватит разговоров. Вот код

Public Function EncryptAES(ByVal clearText As String, ByVal key As String) As String

    ' prepare input
    Dim keyBytes = Convert.FromBase64String(key)
    Dim sourceBytes = Encoding.Unicode.GetBytes(clearText)

    ' prepare encryption provider
    Dim aes = New AesCryptoServiceProvider
    aes.Key = keyBytes
    aes.Mode = CipherMode.ECB
    aes.Padding = PaddingMode.ISO10126
    Dim encryptor = aes.CreateEncryptor()

    Dim ms = New MemoryStream
    Dim cs = New CryptoStream(ms, encryptor, CryptoStreamMode.Write)
    cs.Write(sourceBytes, 0, sourceBytes.Length)
    cs.FlushFinalBlock()
    Dim encrypted = Convert.ToBase64String(ms.ToArray())

    'Dim decrypted = DecryptAES(encrypted, key)
    'If Not EventLog.SourceExists("CryptoBridge") Then
    '   EventLog.CreateEventSource("CryptoBridge", "CryptoBridge")
    'End If
    'Dim log As New EventLog
    'log.Source = "CryptoBridge"
    'log.WriteEntry(clearText & ":" & decrypted)

    aes.Clear()
    cs.Dispose()
    ms.Dispose()

    Return encrypted
End Function

Public Function DecryptAES(ByVal base64Cipher As String, ByVal key As String) As String
    Dim keyBytes = Convert.FromBase64String(key)
    Dim cipherBytes = Convert.FromBase64String(base64Cipher)

    ' prepare decryption provider
    Dim aes = New AesCryptoServiceProvider
    aes.Key = keyBytes
    aes.Mode = CipherMode.ECB
    aes.Padding = PaddingMode.ISO10126
    Dim decryptor = aes.CreateDecryptor()

    Dim ms = New MemoryStream(cipherBytes)
    Dim cs = New CryptoStream(ms, decryptor, CryptoStreamMode.Read)

    Dim decryptedBytes As Byte()
    ReDim decryptedBytes(cipherBytes.Length)

    Dim readByteCount = cs.Read(decryptedBytes, 0, decryptedBytes.Length)
    Dim decrypted = Encoding.Unicode.GetString(decryptedBytes, 0, readByteCount)

    aes.Clear()
    cs.Dispose()
    ms.Dispose()

    Return decrypted
End Function

Далее я модифицирую этот код, чтобы повысить алгоритм AES до 256-битного режима и шифрования CBC, для которого требуется начальное значение вектора (IV). Это добавляет к реализации уровень сложности, который я не был готов добавить, пока все остальное не будет работать 100% времени.

Спасибо всем, кто прокомментировал мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...