技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

暗号化と復号化してみる

オーソドックスに DES 暗号を使ってみる。
使う namespace

using System.Security.Cryptography;
using System.IO;

で、他に使いそうなもので、以下のメソッドを用意

private static byte[] ResizeBytesArray ( byte[] bytes, int newSize )
{
   byte[] newLine = new byte[newSize];
   if (bytes.Length<=newSize)
   {
      for (int i=0; i<bytes.Length; i++)
         newLine[i] = bytes[i];
   }
   else
   {
      int pos = 0;
      for (int i=0; i<bytes.Length; i++)
      {
         newLine[pos++] ^= bytes[i];
         pos = (pos>=newLine.Length)?0:pos;
      }
   }
   return newLine;
}

で、使い方は

/* 暗号化したい文字列とパスワード */
byte[] val = System.Text.Encoding.UTF8.GetBytes("HOHOHO");
byte[] key = System.Text.Encoding.UTF8.GetBytes("password");

/* DES暗号化オブジェクト */
DESCryptoServiceProvider des = new DESCryptoServiceProvider();

/* 共通鍵設定 */
des.Key = ResizeBytesArray(key,des.Key.Length);
des.IV  = ResizeBytesArray(key,des.IV.Length);

/* メモリ中にバッファを用意 */
MemoryStream msOut = new MemoryStream();
ICryptoTransform descrypt = des.CreateEncryptor();
CryptoStream cryptStreem = 
    new System.Security.Cryptography.CryptoStream(
         msOut
        ,descrypt
        ,CryptoStreamMode.Write);

/* 実際に暗号化 */
cryptStreem.Write(val,0,val.Length);
cryptStreem.FlushFinalBlock();

/* 暗号化済みデータ取得 */
byte[] Out = msOut.ToArray();

/* 後始末 */
cryptStreem.Close();
msOut.Close();

/* 文字列に再度変換 */
string base64_data = System.Convert.ToBase64String(Out);

暗号化に関しては以上。
結局バイナリファイル暗号化できることを前提にしているため、直接文字列を突っ込めないのが痛いか、、、。