- - PR -
暗号化/復号化について。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-13 15:57
お世話になります。
イノキイズムと申します。 暗号化/復号化のプログラムを作成しているのですが、 暗号化したデータによって復号化時にエラーが発生してしまいます。 エラーの発生場所は復号化時のMemoryStreamのClose()メソッドでした。 エラーが発生したときの暗号化前の文字列は fafafa でした。 ※ただし、毎回発生するわけではなく、プログラムを起動すると正常に動作する 場合もあります。 何度か適当に羅列したアルファベットを暗号化、復号化という具合に動作させて いるとエラーが発生するという状態です。 作成したプログラムは以下のものを利用しました。 MSDN Online = 10 行シリーズ 〜 10 行でズバリ !! 暗号化 (C#) 〜 http://www.microsoft.com/japan/msdn/thisweek/10lines/encrypt_cs.asp ---------エラー内容 ここから--------- System.Security.Cryptography.CryptographicException 復号化するデータの長さが無効です。 ---------エラー内容 ここまで--------- ご存知の方ご教授願います。 以下環境です。 Windows XP Pro VS 2005 C# | ||||||||
|
投稿日時: 2006-01-13 16:13
それは判ったのですが、肝心な変更点が判りません。 それとも、そのまま流用してダメだったのですか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-13 16:24
イノキイズムです。
じゃんぬねっと様ご指摘ありがとうございました。
そのまま流用しております。 | ||||||||
|
投稿日時: 2006-01-13 16:30
VS2005... C#2.0 ですか。 リンク先の記事は C#1.1 時代のものですね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2006-01-13 17:51
2005版の方を見ると、復号化のときはテキストボックスから値を取っているんじなくて、
暗号化したバイト配列をそのまま使ってますね。 #分りづらくなるから復号化処理の1STEP目は消して欲しいなぁ テキストボックスを経由するとおかしくなるのかな? stringに変換するとダメってことは流石にないとは思いますが... なんかバグ臭いですけど、こっちもBeta2のころの記事だし。うーん? | ||||||||
|
投稿日時: 2006-01-13 18:02
暗号化されたバイト列をわざわざUnicodeで文字列に変換してるからですね。
UnicodeEncoding.GetString(byte[])メソッドは、上位/下位サロゲート(0xD800-0xDFFF)がペアを伴わず単独で出現した(或いは上下逆に並んでいた)場合、これを無視します。 ですから、入力のbyte配列と出力のstringは必ずしも等価ではありません。再変換したら別のbyte配列になる可能性があります(元が真っ当な文字列の場合は問題ないでしょうが)。 暗号化されたbyte配列はそれぞれ16進文字列に変換してそのまま表示するとか、何らかの工夫が必要でしょう。 | ||||||||
|
投稿日時: 2006-01-13 19:19
MemoryStream で、長さが足りない、っうことだったら、これかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4155&forum=7 なつかしい... 検索文字列: 「暗号 memorystream」をすべて含む、Insider.NET 会議室内 ___________________________________ □ written by Jitta on 2006/01/13 | ||||||||
|
投稿日時: 2006-01-16 11:13
イノキイズムです。
じゃんぬねっと様、でっち6号様、Hongliang様、Jitta様 ご回答ありがとうございました。
リンク参考にさせて頂きました。 じっくり読んでみたのですが、あまり理解できませんでした。すみません…。 解決策としては以下の処理を追加すれば良いということなのでしょうか? 「ICryptoTransform.InputBlockSizeに満たないサイズのブロックを最後に出力したい場合は、crypto.FlushFinalBlock();をすればいいです。 」 もし、そうだとした場合、”ICryptoTransform.InputBlockSizeに満たないサイズ” とはどういうことなのでしょうか? |