仕事があまりにも忙しく、すっかり更新する機会を逸していました。今回は、前回の内容をあまり読んでいただかなくても大丈夫なように書きたいと思います。
まずは、テキストボックス上に書かれたテキストデータを、暗号化してファイルにセーブするための処理を考えたいと思います。
流れとしては、以下のようにしてみました。
さて、上記の流れのうち、4の暗号化の部分がポイントになってきますが、ここでは変数の内容(8ビット)を1ビット、右か左にローテーション(シフトして、はみ出したビットを空き部分に入れる)することで、そのままでは文字として表示できないようにする方法を取ります。この部分は別途関数を作ることで、全体を分かりやすいものにしたいと思います。
public static void my_rotate(ref byte target, string direction) { if (direction.ToLower() == "right") { int onebit = (int)target & 0x0001; target = (byte)((int)target >> 1); if (onebit != 0) target = (byte)((int)target | 0x0080); else target = (byte)((int)target & 0x007f); } else //left { int onebit = (int)target & 0x0080; target = (byte)(target << 1); if (onebit != 0) target = (byte)((int)target | 0x0001); else target = (byte)((int)target & 0x00fe); } }この関数は、第一引数に、ローテーションしたい変数(Byte型)を渡し、第二引数には"left"か"right"を渡すことで右ローテートなのか左ローテートなのかを指定します。
それでは全体の処理です。
for (int i = 0; i < buf.Length; i++) { ushort a = buf[i]; byte high_8 = (byte)((a & 0xFF00) >> 8); byte low_8 = (byte)(a & 0x00FF); my_rotate(ref high_8, "right"); my_rotate(ref low_8, "left"); ushort out_16 = low_8; out_16 = (ushort)((out_16 << 8) | high_8); bw.Write(out_16); } bw.Close();