Quantcast
Channel: 吟遊詩人の戯言
Viewing all articles
Browse latest Browse all 17710

【C#,PHP】文字列->AES暗号化->[PHP~GET:POST]->復号化->文字列な処理コード

$
0
0

いや,怪しい次プロジェクトのための下準備?
C#から,サーバーへPOSTなりGETなりのメソッドで,URL-APIを呼び出して,な話

ただし,電文はAES暗号化しちゃおう,と(笑

(HTTPSでやりゃいいじゃん!って聞こえた気がするが,HTTPSはなぁ...:GRB爆)

なお,今回の実装,POST or GET部は作りこんで無いっす(爆
別途,「HttpWebRequest@C#」クラスあたりでも使って,実装してくださいませ.今回は,単品での稼働のみっす(暗号化後BASE64が出来ますので,その復号まで)

参考にしたページはこちら(このページにあったコードに清書加筆してみました)
「Rijndael 256 Encrypt/decrypt between c# and php?」@stackoverflow

作戦的には
Rijndaelな暗号化256ビットブロックモードにて,C# <-> PHP相互で,暗号電文を投げ合おうか,と

C#側

  1. public partial class Form1 : Form
  2. {
  3.  
  4.     //http://stackoverflow.com/questions/3431950/rijndael-256-encrypt-decrypt-between-c-sharp-and-php
  5.  
  6.     private const string KEYSTR = "qwertyuiopasdfghjklzxcvbnmqwerty";               //32文字
  7.     private const string IVSTR  = "12345678901234567890123456789012";               //32文字
  8.  
  9.     public Form1()
  10.     {
  11.         InitializeComponent();
  12.     }
  13.  
  14.     private void button1_Click(object sender, EventArgs e)
  15.     {
  16.  
  17.         string st = EncryptString("能年玲奈~ホットロード", KEYSTR, IVSTR);
  18.         //string st = EncryptString("橋本愛~ハードナッツ", KEYSTR, IVSTR);
  19.  
  20.         textBox1.Text = st;
  21.     }
  22.  
  23.     private void button2_Click(object sender, EventArgs e)
  24.     {
  25.  
  26.         string st = DecryptString(textBox1.Text, KEYSTR, IVSTR);
  27.         label1.Text = st;
  28.     }
  29.  
  30.     //暗号化
  31.     public static string EncryptString(string message, string KeyString, string IVString)
  32.     {
  33.         byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
  34.         byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
  35.  
  36.         string encrypted = null;
  37.         RijndaelManaged rj = new RijndaelManaged();
  38.         rj.BlockSize = 256;
  39.         rj.Key = Key;
  40.         rj.IV = IV;
  41.         rj.Mode = CipherMode.CBC;
  42.         rj.Padding = PaddingMode.Zeros;                 //このプロパティを設定しないと調子が悪い
  43.  
  44.         try
  45.         {
  46.             MemoryStream ms = new MemoryStream();
  47.  
  48.             using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write))
  49.             {
  50.                 using (StreamWriter sw = new StreamWriter(cs))
  51.                 {
  52.                     sw.Write(message);
  53.                     sw.Close();
  54.                 }
  55.                 cs.Close();
  56.             }
  57.             byte[] encoded = ms.ToArray();
  58.             encrypted = Convert.ToBase64String(encoded);
  59.  
  60.             ms.Close();
  61.         }
  62.         catch (Exception e)
  63.         {
  64.             Console.WriteLine("An error occurred: {0}", e.Message);
  65.         }
  66.         finally
  67.         {
  68.             rj.Clear();
  69.         }
  70.  
  71.         return encrypted;
  72.     }
  73.  
  74.     //復号化
  75.     public static string DecryptString(string encstr, string KeyString, string IVString)
  76.     {
  77.         byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
  78.         byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
  79.  
  80.         RijndaelManaged rj = new RijndaelManaged();
  81.         rj.BlockSize = 256;
  82.         rj.Key = Key;
  83.         rj.IV = IV;
  84.         rj.Mode = CipherMode.CBC;
  85.         rj.Padding = PaddingMode.Zeros;                             //このプロパティを設定しないと調子が悪い
  86.  
  87.  
  88.         byte[] ary = Convert.FromBase64String(encstr);
  89.  
  90.         string result = "";
  91.  
  92.         try
  93.         {
  94.             using (var msDecrypt = new MemoryStream(ary))
  95.             {
  96.                 using (var csDecrypt = new CryptoStream(msDecrypt, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
  97.                 {
  98.                     using (var srDecrypt = new StreamReader(csDecrypt))
  99.                     {
  100.                         result = srDecrypt.ReadToEnd();
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.         catch (Exception e)
  106.         {
  107.             Console.WriteLine("An error occurred: {0}", e.Message);
  108.         }
  109.         finally
  110.         {
  111.             rj.Clear();
  112.         }
  113.  
  114.         return result;
  115.     }
  116.  
  117. }

サーバー側@PHP
  1. <?php
  2.  
  3. //本ファイル,S-JISで保存すると調子が悪いかも?
  4. //UTF8な文字コードで保存してください
  5.  
  6. class classEncryptDecrypt {
  7.   protected $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
  8.   protected $mcrypt_mode = MCRYPT_MODE_CBC;
  9.  
  10.   //暗号化
  11.   public function encrypt($key, $iv, $message)
  12.   {
  13.     $iv_utf      = mb_convert_encoding($iv, 'UTF-8');
  14.     $key_utf     = mb_convert_encoding($key, 'UTF-8');
  15.  
  16.     $encstr = mcrypt_encrypt($this->mcrypt_cipher, $key_utf, $message, $this->mcrypt_mode, $iv_utf);
  17.  
  18.     return base64_encode($encstr);
  19.   }
  20.  
  21.   //復号化
  22.   public function decrypt($key, $iv, $encrypted)
  23.   {
  24.     $iv_utf      = mb_convert_encoding($iv, 'UTF-8');
  25.     $key_utf     = mb_convert_encoding($key, 'UTF-8');
  26.     return mcrypt_decrypt($this->mcrypt_cipher, $key_utf, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);
  27.   }
  28. }
  29.  
  30.  
  31.  
  32. $key = "qwertyuiopasdfghjklzxcvbnmqwerty";
  33. $iv  = "12345678901234567890123456789012";
  34.  
  35. $encstr = "YzY57+91kIIGS0uJxzmsJ8Y8CJ7dTCu041SiPGcVbEZ6Zm1vjxXAVO45BFUwOcsYgxhmNqYcZ09T5iQkdL6Qrw==";   //能年玲奈~ホットロード  の暗号化文字列BASE64
  36. $messagestr = "橋本愛~ハードナッツ";
  37. //$messagestr = "能年玲奈~ホットロード";
  38.  
  39. $obj = new classEncryptDecrypt;
  40.  
  41. $encbase64 = $obj->encrypt($key, $iv, $messagestr);
  42.  
  43. $decstr    = $obj->decrypt($key, $iv, $encbase64);
  44. //$decstr    = $obj->decrypt($key, $iv, $encstr);
  45.  
  46. echo '元の文字列->'       . $messagestr . '<br><br>';
  47. echo '暗号化した文字列->' . $encbase64  . '<br><br>';
  48. echo '復号化した文字列->' . $decstr     . '<br><br>';
  49.  
  50.  
  51. ?>

IV(初期化ベクトル値)は,毎回変えたほうがいいらしい@ PHPで AES方式 (Rijndael-128)で暗号化するメモ@floatingdaysさん

でも,C#側とPHP側で,勝手にめちゃくちゃな値作ったら,復号できないし...む~んじゃったんじゃが
IV値は,公開しても構わないっぽい.今回は固定しておりますが,IV値も毎回作って,BASE64して,暗号電文とセットでサーバーに渡せば大丈夫じゃろ?

いつもどおり,バグってたらスマンこってす
特に,このサンプルに,でっかいデータを食わしてないので,どういう挙動するか,判らんしなぁ

ターゲットな,でっかいデータは画像級サイズ?(笑

Viewing all articles
Browse latest Browse all 17710

Trending Articles