C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 25 を表示中)
■11508 / )  複合化で「データが正しくありません」のエラー
□投稿者/ どみにか (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

返信 編集キー/


管理者用

- Child Tree -