- PR -

暗号化/復号化について。

投稿者投稿内容
元イノキイズム
常連さん
会議室デビュー日: 2005/12/05
投稿数: 24
投稿日時: 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#
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-13 16:13
引用:

イノキイズムさんの書き込み (2006-01-13 15:57) より:

作成したプログラムは以下のものを利用しました。
MSDN Online = 10 行シリーズ 〜 10 行でズバリ !! 暗号化 (C#) 〜


それは判ったのですが、肝心な変更点が判りません。
それとも、そのまま流用してダメだったのですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
元イノキイズム
常連さん
会議室デビュー日: 2005/12/05
投稿数: 24
投稿日時: 2006-01-13 16:24
イノキイズムです。
じゃんぬねっと様ご指摘ありがとうございました。

引用:

じゃんぬねっとさんの書き込み (2006-01-13 16:13) より:
引用:

イノキイズムさんの書き込み (2006-01-13 15:57) より:

作成したプログラムは以下のものを利用しました。
MSDN Online = 10 行シリーズ 〜 10 行でズバリ !! 暗号化 (C#) 〜


それは判ったのですが、肝心な変更点が判りません。
それとも、そのまま流用してダメだったのですか?




そのまま流用しております。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-13 16:30
引用:

イノキイズムさんの書き込み (2006-01-13 15:57) より:

以下環境です。
Windows XP Pro
VS 2005
C#


VS2005... C#2.0 ですか。
リンク先の記事は C#1.1 時代のものですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2006-01-13 17:51
2005版の方を見ると、復号化のときはテキストボックスから値を取っているんじなくて、
暗号化したバイト配列をそのまま使ってますね。
#分りづらくなるから復号化処理の1STEP目は消して欲しいなぁ

テキストボックスを経由するとおかしくなるのかな?
stringに変換するとダメってことは流石にないとは思いますが...
なんかバグ臭いですけど、こっちもBeta2のころの記事だし。うーん?
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-01-13 18:02
暗号化されたバイト列をわざわざUnicodeで文字列に変換してるからですね。
UnicodeEncoding.GetString(byte[])メソッドは、上位/下位サロゲート(0xD800-0xDFFF)がペアを伴わず単独で出現した(或いは上下逆に並んでいた)場合、これを無視します。
ですから、入力のbyte配列と出力のstringは必ずしも等価ではありません。再変換したら別のbyte配列になる可能性があります(元が真っ当な文字列の場合は問題ないでしょうが)。
暗号化されたbyte配列はそれぞれ16進文字列に変換してそのまま表示するとか、何らかの工夫が必要でしょう。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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
元イノキイズム
常連さん
会議室デビュー日: 2005/12/05
投稿数: 24
投稿日時: 2006-01-16 11:13
イノキイズムです。
じゃんぬねっと様、でっち6号様、Hongliang様、Jitta様
ご回答ありがとうございました。

引用:

Jittaさんの書き込み (2006-01-13 19:19) より:
MemoryStream で、長さが足りない、っうことだったら、これかな?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4155&forum=7


リンク参考にさせて頂きました。
じっくり読んでみたのですが、あまり理解できませんでした。すみません…。

解決策としては以下の処理を追加すれば良いということなのでしょうか?

「ICryptoTransform.InputBlockSizeに満たないサイズのブロックを最後に出力したい場合は、crypto.FlushFinalBlock();をすればいいです。 」

もし、そうだとした場合、”ICryptoTransform.InputBlockSizeに満たないサイズ”
とはどういうことなのでしょうか?

スキルアップ/キャリアアップ(JOB@IT)