■11508 / inTopicNo.1) |
複合化で「データが正しくありません」のエラー |
□投稿者/ どみにか (1回)-(2007/12/16(Sun) 22:14:34)
|
分類:[VB.NET/VB2005]
どみにかと申します。
VB2005 Express Edition にて、パスワード文字列の暗号化、複合化を行いたいと思っています。 マイクロソフトのサイト(http://www.microsoft.com/japan/msdn/thisweek/10lines/encrypt_vb.aspx) にあるサンプルモジュールを使って試したところ、何か良く分からないエラーが発生し、困っています。 エラー内容は、 System.Security.Cryptography.CryptographicException :データが正しくありません です。 他のアルゴリズム(DES, RC2)も同様の現象が発生します。
正しく複合できる場合もあり、暗号化前の文字列と違う文字列に複合される場合もあります。 特定の文字列がそうなるわけでもなく、いろいろな文字列を試している内に、間違った複合がされたり、例外が発生したりします。 ネットで検索しても同様の現象を見つけることができなかったので、私の環境のような気はするのですが、 サンプルそのままですし、現象に法則が見えないもので、いまいち原因が掴めません。 試した文字は半角の英数字のみですし、一度複合に失敗した後にエラーが発生するわけでもなく、 1回目から例外が発生することもあれば、1回目から複合に失敗することもあります。 暗号化サービスプロバイダのクラスに、何か制限があるのかも調べてみたのですが、特に見当たらず。
どなたかお分かりになる方、いらっしゃいませんでしょうか?
環境の詳細は VB2005 Express Edition Ver 8.0.50727.762 (SP.050727-7600) .NET Framework Ver 2.0.50727 Windows XP Pro Sp2
-- 現在のソース ---------------------------
Imports System.IO Imports System.Text Imports System.Security.Cryptography
Public Class Form1
Private TDES As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider Private DesKey As Byte() Private DesIV As Byte()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load DesKey = TDES.Key DesIV = TDES.IV End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox2.Text = GetEncryptString(TextBox1.Text) End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click TextBox3.Text = GetDecryptString(TextBox2.Text) End Sub
Private Function GetEncryptString(ByVal text As String) As String
' 文字列を byte 配列に変換します Dim source As Byte() = Encoding.Unicode.GetBytes(text) Dim ms As MemoryStream = New MemoryStream Dim cs As CryptoStream = New CryptoStream(ms, TDES.CreateEncryptor(DesKey, DesIV), CryptoStreamMode.Write)
' ストリームに暗号化するデータを書き込みます cs.Write(source, 0, source.Length) cs.Close()
' 暗号化されたデータを byte 配列で取得します Dim destination As Byte() = ms.ToArray() ms.Close()
' byte 配列を文字列に変換して表示します Return Encoding.Unicode.GetString(destination) End Function
Private Function GetDecryptString(ByVal text As String) As String ' 暗号化された文字列を byte 配列に変換します Dim source As Byte() = Encoding.Unicode.GetBytes(text) ' 入出力用のストリームを生成します Dim ms As MemoryStream = New MemoryStream Dim cs As CryptoStream = New CryptoStream(ms, TDES.CreateDecryptor(DesKey, DesIV), CryptoStreamMode.Write)
' ストリームに暗号化されたデータを書き込みます cs.Write(source, 0, source.Length) cs.Close()
' 復号化されたデータを byte 配列で取得します Dim destination As Byte() = ms.ToArray() ms.Close()
' byte 配列を文字列に変換して表示します Return Encoding.Unicode.GetString(destination) End Function
End Class
|
|