- PR -

2バイト文字列の暗号化→複合化で文字化け

1
投稿者投稿内容
O-Nadegata
会議室デビュー日: 2004/10/20
投稿数: 13
投稿日時: 2004-12-13 12:49
2バイト文字列の暗号化→複合化で文字化けが起こってしまいます。

暗号化の仕方は、
文字の1バイト目をプラス1して暗号化しています。
複合化は逆に
文字の1バイト目をマイナス1します。

現象としては、
暗号化した文字列を
bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(str)
でバイト取得した時に、まったく違った文字コード取れてくるようです。

また、全ての文字列で文字化けが起こるわけではなく、
2バイト文字の文字記号で文字化けが起こっているようです。

どなたか、この問題の解決策をご存知の方はご教授お願いします。

開発環境
VB.NET
WindowsXP

'-------------------------------------------------------------
Dim str As String = "−"
Dim bytesData As Byte()
ReDim bytesData(1)
'1バイト目:129、2バイト目:64
bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(str)
'1バイト目をプラス1して暗号化
'1バイト目:130、2バイト目:64
bytesData(0) += 1
'"・"となる
str = System.Text.Encoding.GetEncoding(932).GetString(bytesData)

'復号
'何故か 1バイト目:129、2バイト目:69 となってしまう
bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(str)
bytesData(0) -= 1
'"
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2004-12-13 14:05
'"・"となる
str = System.Text.Encoding.GetEncoding(932).GetString(bytesData)

↑これがいけないのではないでしょうか?
Stringって文字列クラスですから、代入した瞬間に、「何らかの文字コードを使用したCharで構成された文字列」として処理されて、勝手に何かしらの変換が行われてるのだと思います。
文字列を暗号化してバイト列にしたのなら、複合化するまでバイト列として保持しないといけないんではないでしょうか?
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2004-12-13 14:26
すみません。自己レスです。後で読み返してみたら、あまりにおおざっぱな回答でしたもので。私自身、そんなに知識があるわけではないので、ご勘弁を。m(_ _)m
一応つたない知識の範囲内で補足すると、やっぱりStringは文字列用のクラスですから、暗号化した結果コードページ932上に存在しない文字コードになってしまっていることが現象の原因だと思われます。
あくまで暗号化後のデータを文字列データとして扱いたいのなら、暗号化後のデータがコードページ932上に存在する文字コードになるようなロジックを考えてやんないといけないと思うんです。
しかし、そもそも文字の1バイト目をプラス1するだけだと例えば"abcd"は"bcde"になってしまうわけで、暗号化ロジックとしてはあまりに陳腐ではないでしょうか。勉強用の個人プロジェクトならともかく、本物のシステムで使おうとしてるなら、もっとちゃんとロジックを考えるべきだと思います。
O-Nadegata
会議室デビュー日: 2004/10/20
投稿数: 13
投稿日時: 2004-12-13 15:21
ぼのぼのさん、貴重なご意見ありがとうございます。

----------------------------------------------------------------
やっぱりStringは文字列用のクラスですから、暗号化した結果コードページ932上に存在しない文字コードになってしまっていることが現象の原因だと思われます。
----------------------------------------------------------------
なるほど、やはりこの暗号の仕方はうまい方法ではありませんね。
別の方法を考えてみます。

ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-13 21:02
 符号付き、符号無し辺りを勉強すると、幸せになれるような気がします。2進数に直してみましょう。

 さらに、こんなところを見てみるのもいいかも。
引用:

.NET Framework 開発者ガイド
暗号化クラスの設定



_________________
1

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