2009-04-06 49 views
3

私の問題は実際にはVB.NETでAESを使用する方法よりも少し複雑です。私が実際にやっていることは、Javaアプリケーション内のVB.NETでAESを使用することですJACOB。しかし今のところ、私が焦点を当てる必要があるのは、AESの実装自体です。VB.NETでAesCryptoServiceProviderを使用する

はここでいったん戻ってJavaコードで自分の暗号化コード

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 

だ、私は、16進数の文字列にバイト配列を回します。

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

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 

私は復号化コードを実行すると、私は次のエラーメッセージ

パディングは無効であり、削除することはできませんを取得します。

+0

暗号化されたデータをどこかに保存してから、その保存されたデータをJavaで渡した後に解読関数の呼び出しと比較しようとしましたか? –

+0

また、どのバージョンのvb.net/visual studio? –

+0

Visual Studio 2008 Pro 解読からテストへの戻り値が得られないため、提案しているテストを実行できません。私のVB復号化機能によってエラーがスローされています。 –

答えて

0

OK、元のコードに問題が2つありました。

1つで、デバッグはありません。 Javaでラップする前に、自分のコードが暗号化と復号化できることを検証するための内部テストを追加する必要がありました。それは私の愚かだった。

2つ:encryptorオブジェクトとdecryptorオブジェクトの両方の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 

次だ、私は初期ベクトル(IV)値を必要とする256ビットとCBC暗号モードにAESアルゴリズムを、つり上げるためにこのコードを変更することがあります。これにより、残りの部分が100%時間を費やすまで、追加する準備ができていないレベルの複雑さが実装に追加されます。

私の問題についてコメントしたすべての方々に感謝します。

+0

好奇心 - なぜあなたはJavaに含まれているAES暗号を使用しないのですか? JACOBを横断するのとは対照的に? – Cheeso

関連する問題