ОК, поэтому с моим исходным кодом произошла пара ошибок.
Во-первых, без отладки. Мне пришлось добавить внутренний тест, чтобы убедиться, что мой код может зашифровать и расшифровать, прежде чем обернуть его в 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% времени.
Спасибо всем, кто прокомментировал мою проблему.