いや,怪しい次プロジェクトのための下準備?
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#側
- public partial class Form1 : Form
- {
- //http://stackoverflow.com/questions/3431950/rijndael-256-encrypt-decrypt-between-c-sharp-and-php
- private const string KEYSTR = "qwertyuiopasdfghjklzxcvbnmqwerty"; //32文字
- private const string IVSTR = "12345678901234567890123456789012"; //32文字
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- string st = EncryptString("能年玲奈~ホットロード", KEYSTR, IVSTR);
- //string st = EncryptString("橋本愛~ハードナッツ", KEYSTR, IVSTR);
- textBox1.Text = st;
- }
- private void button2_Click(object sender, EventArgs e)
- {
- string st = DecryptString(textBox1.Text, KEYSTR, IVSTR);
- label1.Text = st;
- }
- //暗号化
- public static string EncryptString(string message, string KeyString, string IVString)
- {
- byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
- byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
- string encrypted = null;
- rj.BlockSize = 256;
- rj.Key = Key;
- rj.IV = IV;
- rj.Mode = CipherMode.CBC;
- rj.Padding = PaddingMode.Zeros; //このプロパティを設定しないと調子が悪い
- try
- {
- {
- {
- sw.Write(message);
- sw.Close();
- }
- cs.Close();
- }
- byte[] encoded = ms.ToArray();
- encrypted = Convert.ToBase64String(encoded);
- ms.Close();
- }
- catch (Exception e)
- {
- Console.WriteLine("An error occurred: {0}", e.Message);
- }
- finally
- {
- rj.Clear();
- }
- return encrypted;
- }
- //復号化
- public static string DecryptString(string encstr, string KeyString, string IVString)
- {
- byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString);
- byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString);
- rj.BlockSize = 256;
- rj.Key = Key;
- rj.IV = IV;
- rj.Mode = CipherMode.CBC;
- rj.Padding = PaddingMode.Zeros; //このプロパティを設定しないと調子が悪い
- byte[] ary = Convert.FromBase64String(encstr);
- string result = "";
- try
- {
- {
- using (var csDecrypt = new CryptoStream(msDecrypt, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read))
- {
- {
- result = srDecrypt.ReadToEnd();
- }
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine("An error occurred: {0}", e.Message);
- }
- finally
- {
- rj.Clear();
- }
- return result;
- }
- }
サーバー側@PHP
- <?php
- //本ファイル,S-JISで保存すると調子が悪いかも?
- //UTF8な文字コードで保存してください
- class classEncryptDecrypt {
- protected $mcrypt_cipher = MCRYPT_RIJNDAEL_256;
- protected $mcrypt_mode = MCRYPT_MODE_CBC;
- //暗号化
- public function encrypt($key, $iv, $message)
- {
- }
- //復号化
- public function decrypt($key, $iv, $encrypted)
- {
- return mcrypt_decrypt($this->mcrypt_cipher, $key_utf, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf);
- }
- }
- $key = "qwertyuiopasdfghjklzxcvbnmqwerty";
- $iv = "12345678901234567890123456789012";
- $encstr = "YzY57+91kIIGS0uJxzmsJ8Y8CJ7dTCu041SiPGcVbEZ6Zm1vjxXAVO45BFUwOcsYgxhmNqYcZ09T5iQkdL6Qrw=="; //能年玲奈~ホットロード の暗号化文字列BASE64
- $messagestr = "橋本愛~ハードナッツ";
- //$messagestr = "能年玲奈~ホットロード";
- $obj = new classEncryptDecrypt;
- $encbase64 = $obj->encrypt($key, $iv, $messagestr);
- $decstr = $obj->decrypt($key, $iv, $encbase64);
- //$decstr = $obj->decrypt($key, $iv, $encstr);
- echo '元の文字列->' . $messagestr . '<br><br>';
- echo '暗号化した文字列->' . $encbase64 . '<br><br>';
- echo '復号化した文字列->' . $decstr . '<br><br>';
- ?>
IV(初期化ベクトル値)は,毎回変えたほうがいいらしい@ PHPで AES方式 (Rijndael-128)で暗号化するメモ@floatingdaysさん
でも,C#側とPHP側で,勝手にめちゃくちゃな値作ったら,復号できないし...む~んじゃったんじゃが
IV値は,公開しても構わないっぽい.今回は固定しておりますが,IV値も毎回作って,BASE64して,暗号電文とセットでサーバーに渡せば大丈夫じゃろ?
いつもどおり,バグってたらスマンこってす
特に,このサンプルに,でっかいデータを食わしてないので,どういう挙動するか,判らんしなぁ
ターゲットな,でっかいデータは画像級サイズ?(笑