【C#,PHP】文字列->AES暗号化->[PHP~GET:POST]->復号化->文字列な処理コード
関連記事
- なんと!今週の土曜日も仕事してますた.来週の土曜日も仕事臭い.TCPソケット通信をゴリゴリ書いてる 【2025年08月30日(土)】
- 【ChatGPT o4】祝日なのに仕事ーバテすぎー今夜こそ絶命だーモルモルモル 【2025年03月20日(木)】
- 【#ChatGPT】WordPressサーバにバイナリファイルをアップするシステムをChatGPTさんに聞きまくりじゃった 【2025年03月04日(火)】
- 【#CSharp】制御系が動き出したべ 【2025年02月20日(木)】
- 【#CSharp】ひっさしぶりにガッツリなC#案件をやっているぞー 【2025年02月19日(水)】
いや,怪しい次プロジェクトのための下準備?
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して,暗号電文とセットでサーバーに渡せば大丈夫じゃろ?
いつもどおり,バグってたらスマンこってす
特に,このサンプルに,でっかいデータを食わしてないので,どういう挙動するか,判らんしなぁ
ターゲットな,でっかいデータは画像級サイズ?(笑

コメント
【クマ】クマによる人的被害、生活圏7割 環境省まとめ、出没は最多2万件
「ニュウハクシミ」紙を食べる害虫 生息19都道府県に拡大
文化の日な祭日らしい.文化的に休むもうず?
【#HTVX】新型宇宙輸送船HTV-X 油井さんがロボットアームでキャッチ
【冬】来週11℃予想とか出てきてる.秋があったのか,今年(25/10/23)
【ツル】出水平野に冬の訪れを告げるツル第一陣・今季初飛来 鹿児島(25/10/21)
都城でプロ野球・ロッテ1軍が春季キャンプ実施へ
山形で開催の映画祭 監督など国内外の参加者が“芋煮”味わう
連休なんで生駒高原でコスモスを愛でてきた
連休の中日ですの.天気は良くなる方向じゃげ