Visual Basicで暗号化されたメッセージングプログラムを作成しているので、バックストーリーがありません。メッセージが送信されると、Base 64にエンコードされ(暗号化されてバイト配列に変換された後)、Base 64はUnicodeを使用した文字列として表示されます(データは実際には変更されません)メッセージの種類、文字列が他のコンピュータに送信されます(私はチェックし、送信されたデータは受信したデータと正確に一致しないので問題はありません)。 Base64/Unicode文字列が受信されると、通常のUnicode文字列に戻され(このデータは送信されたデータと完全に一致します)、データは復号化されます。これは問題が開始したとき、たいていの場合は動作しますが、特定の文字シーケンスを送信すると、受信側で別の表示をします(アジア文字の場合と同じように)。今いくつかの例のために:Visual BasicのUnicodeエンコーディングエラー:一部の文字が正しくエンコードされない
これは、暗号化された後のデータは、ベース64に変換され、パディングを加えた:
{/} C/1rcE9CwYDEnoaxNVT2Xme/pky6yDRGo3lcG12G/h8= {\}
これはrecived、再エンコードされたデータである。
{/} C/1rcE9CwYDEnoaxNVT2Xme/pky6yDRGo3lcG12G/h8= {\}
あなたはエラーがありません見ることができるように、これは暗号化されたデータ(文字列を暗号化する「EncryptionTest」)である:
Encrypt: EncryptionTest with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got ﴋ火䉏胁黄놆吵延뽧䲦좺䘴禣᭜虝῾
これは、受信および復号化されたデータである。
Decrypt: ﴋ火䉏胁黄놆吵延뽧䲦좺䘴禣᭜虝῾ with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got EncryptionTest
それは私がこれは何が起こるかである文字列「ワンダフル」を送信ただし場合、完璧に働いた:
Encrypt: Wonderful with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got 폮斚䢹뱊袗櫮㓟翔ǔ劇辑頭뷳ﭤ�
Decrypt: 폮斚䢹뱊袗櫮㓟翔ǔ劇辑頭뷳ﭤ� with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got Wonderf牏匢否喏幙‥
間違って何かが、私は削除する場合"Wondeful"の最後の "l":
Encrypt: Wonderfu with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got 폮斚䢹뱊袗櫮㓟팾甎ᑁᗺ寑핕杷
Decrypt: 폮斚䢹뱊袗櫮㓟팾甎ᑁᗺ寑핕杷 with 0K2V4Y0/aXrnGpcVP1d2JEGKAZDWZWuffXA1Iv0gFbc= got Wonderfu
もう一度うまくいきます。エラーは、base64からのメッセージのデコードとそれを表示する間に発生しているので、解読機能が責任を負うことを意味する必要があります。ここで私の暗号化と解読機能が役に立ちます。
Function EncryptAESString(data As String, key As String)
Dim keybytes() As Byte = Convert.FromBase64String(key)
Dim ivbytes() = Convert.FromBase64String(HashString("TestIV2", "MDA5"))
Dim encrypted() As Byte
Using aesAlg As Aes = Aes.Create()
aesAlg.Padding = PaddingMode.Zeros
aesAlg.Key = keybytes
aesAlg.IV = ivbytes
Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV)
Using msEncrypt As New MemoryStream()
Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)
Using swEncrypt As New StreamWriter(csEncrypt, uni)
swEncrypt.Write(data)
End Using
encrypted = msEncrypt.ToArray()
End Using
End Using
End Using
DebugPrint("Encrypt: " + data + " with " + key + " got " + uni.GetString(encrypted))
Return uni.GetString(encrypted)
End Function
Function DecryptAESString(data As String, key As String)
Dim databyte() As Byte = uni.GetBytes(data)
Dim keybytes() As Byte = Convert.FromBase64String(key)
Dim ivbytes() = Convert.FromBase64String(HashString("TestIV2", "MDA5"))
Dim plaintext As String = Nothing
Using aesAlg As Aes = Aes.Create()
aesAlg.Padding = PaddingMode.Zeros
aesAlg.Key = keybytes
aesAlg.IV = ivbytes
Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV)
Using msDecrypt As New MemoryStream(databyte)
Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)
Using srDecrypt As New StreamReader(csDecrypt, uni)
plaintext = srDecrypt.ReadToEnd()
End Using
End Using
End Using
End Using
databyte = Nothing
keybytes = Nothing
ivbytes = Nothing
DebugPrint("Decrypt: " + data + " with " + key + " got " + plaintext)
Return plaintext
End Function
任意のバイナリデータを表すためにUnicodeを使用しないでください。人間が消費するために印刷したい場合は、HexまたはBase64でエンコードして、何が起こっているのかを確認してください。 –
uni.GetString()はバグです。* encrypted *はutf-16でエンコードされたテキストではありません。より早くbase64に変換する必要があります。 @ArtjomB。 –
暗号化の後、データはbase64としてエンコードされます。 –