【C#,PHP】文字列->AES暗号化->[PHP~GET:POST]->復号化->文字列な処理コード
関連記事
- 【#CSHARP】次の案件のスケルトン書いてgitサーバに登録するなどと 【2023年05月16日(火)】
- 生成AI「仕事で利用」2割 正確性などに懸念(23/5/7) 【2023年05月07日(日)】
- 【#RaspberryPI】ラズパイでsudo起動の.Net6アプリがデバグできない件 【2023年04月22日(土)】
- 【#PostgreSQL】テーブルから取得したレコードセットをCSVへ落とそうとすると,空ファイルが出来る...ドロドロドロ 【2023年03月08日(水)】
- 【#git】TortiseGit ver2.14のGitWCRev.exeを動かすとErrorCD:10を出力して,動かない 【2023年02月08日(水)】
いや,怪しい次プロジェクトのための下準備?
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; RijndaelManaged rj = new RijndaelManaged(); rj.BlockSize = 256; rj.Key = Key; rj.IV = IV; rj.Mode = CipherMode.CBC; rj.Padding = PaddingMode.Zeros; //このプロパティを設定しないと調子が悪い try { MemoryStream ms = new MemoryStream(); using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) { using (StreamWriter sw = new StreamWriter(cs)) { 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); RijndaelManaged rj = new RijndaelManaged(); 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 msDecrypt = new MemoryStream(ary)) { using (var csDecrypt = new CryptoStream(msDecrypt, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) { using (var srDecrypt = new StreamReader(csDecrypt)) { 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) { $iv_utf = mb_convert_encoding($iv, 'UTF-8'); $key_utf = mb_convert_encoding($key, 'UTF-8'); $encstr = mcrypt_encrypt($this->mcrypt_cipher, $key_utf, $message, $this->mcrypt_mode, $iv_utf); return base64_encode($encstr); } //復号化 public function decrypt($key, $iv, $encrypted) { $iv_utf = mb_convert_encoding($iv, 'UTF-8'); $key_utf = mb_convert_encoding($key, 'UTF-8'); 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して,暗号電文とセットでサーバーに渡せば大丈夫じゃろ?
いつもどおり,バグってたらスマンこってす
特に,このサンプルに,でっかいデータを食わしてないので,どういう挙動するか,判らんしなぁ
ターゲットな,でっかいデータは画像級サイズ?(笑
コメント
【@SHARP_JP】X68000 Zの製品版がAmazonで予約開始、グラディウス付きで価格は29,535円から
【#温泉】ちろっと温泉旅に行ってきた.北郷温泉!
高速道路、有料2115年まで 半永久化へ改正法成立
【#梅雨】西日本各地が梅雨入り(23/5/29)
ガソリン補助金、9月末終了 6月から段階的に圧縮―経産省
Intel、64ビット専用アーキテクチャ「x86S」のビジョンを公開
はしか、国内で複数の感染者確認 同じ新幹線車両に乗り合わせ
宮崎の高校で491人がインフルエンザ集団感染15日から休校(23/5/18)