3

私が実際にやろうとしているのは、JACOB を介して Java アプリケーション内から VB.NET で AES を使用することであるため、私の問題は実際には VB.NET で AES を使用する方法よりも少し複雑です。しかし今のところ、私が注目する必要があるのは、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 コードに戻ったら、バイト配列を 16 進数の String に変換します。

さて、プロセスを逆にするために、これが私の復号化コードです

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

復号化コードを実行すると、次のエラー メッセージが表示されます

パディングが無効であり、削除できません。

4

1 に答える 1

0

OK、元のコードにはいくつか問題がありました。

1つは、デバッグなしです。コードを Java でラップする前に、コードを暗号化および復号化できることを確認する内部テストを追加する必要がありました。それは私の愚かでした。

2: 暗号化オブジェクトと復号化オブジェクトの両方の 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% 正常に動作するようになるまで追加する準備ができていなかったレベルの複雑さが実装に追加されます。

私の問題にコメントしてくれたすべての人に感謝します。

于 2009-04-07T00:52:54.517 に答える