【C#,PHP】文字列->AES暗号化->[PHP~GET:POST]->復号化->文字列な処理コード
関連記事
- 【#apache #PHP】apacheが立ち上がらなくなったー「アクセス許可で禁じられた方法でソケットにアクセスしようとしました」エラー発生 【2024年04月16日(火)】
- 【#Laravel #PHP】久しぶりにLaravelと格闘しておるがすっかり忘れちょる(汗 【2024年04月12日(金)】
- 【#CSHARP】ソリューション内でサービス,Winformアプリを混在で作成させ,バイナリ出力先を同じにするとサービスが起動しない 【2024年02月08日(木)】
- 【#PHP】謎な #Laravel 案件 引き渡したじ 【2024年01月11日(木)】
- 【PHP】PHPのバージョンをアップしたら,「tcpdf」フレームワークがエラー吐きまくりで,こっちまで吐きそうになった 【2024年01月10日(水)】
いや,怪しい次プロジェクトのための下準備?
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して,暗号電文とセットでサーバーに渡せば大丈夫じゃろ?
いつもどおり,バグってたらスマンこってす
特に,このサンプルに,でっかいデータを食わしてないので,どういう挙動するか,判らんしなぁ
ターゲットな,でっかいデータは画像級サイズ?(笑
コメント
【訃報】俳優 火野正平さん死去 75歳
【地震】日向灘でM4.4の地震
【#第三次世界大戦】ウクライナ空軍 “ICBM1発がロシア南部から発射された”
司法省 “グーグルはクローム売却を” 裁判所に要求へ 米報道
最近,仕事がずっと激しい...ドロドロドロ
今日は謎の宴会らしい...スーツが入るのかっ!?(GRB爆
「侍ジャパン」宮崎県入り 「プレミア12」向け きょうから合宿
【#総選挙】 衆議院選挙 きょう投票 ...ドロドロドロ(24/10/27)
【#線状降水帯】宮崎 延岡「土砂崩れで家がつぶれている」通報 1人不明(24/10/23)
【冬】お~日本海に筋雲が出ちょる!冬がキター