ホームページ  >  記事  >  バックエンド開発  >  PHP 3DES 暗号化アルゴリズムの実装

PHP 3DES 暗号化アルゴリズムの実装

巴扎黑
巴扎黑オリジナル
2016-11-21 13:49:362509ブラウズ

最近行う必要があるのは、php が 3des で暗号化された URL を .net に返し、.net 側でそれを復号化することです。 php の実装は .net の終わりに匹敵するものではありません。まずここに書き留めておき、専門家のアドバイスを期待します。インターネット上には個人的に確認せずにコピーする人が無数にいますが、今後は誰もがこの厳格な方法を遵守することを願っています。

PHP 暗号化拡張ライブラリ Mcrypt がデータを暗号化および復号化する前に、まず初期化ベクトル (略して iv と呼ばれます) を作成します。 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); から、初期化ベクトルの作成には 2 つのパラメーターが必要であることがわかります。size は iv のサイズを指定し、source は iv のソースであり、値 MCRYPT_RAND は次のとおりです。システム乱数。

関数 mcrypt_get_iv_size($cipher,$modes) は、初期化ベクトルのサイズを返します。パラメーター cipher と mode は、それぞれアルゴリズムと暗号化モードを参照します。

Php コード

function encrypt($input){//数据加密  
 $key=md5("XXXXXXXXX",TRUE);  
 $key=base64_encode($key);  
 $size = mcrypt_get_block_size(MCRYPT_3DES,MCRYPT_MODE_ECB);  
 $input = $this->pkcs5_pad($input, $size);  
 //$key = str_pad($this->key,24,'0');  
 $key = str_pad($key,24,'0');  
 $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');  
// $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//初始化向量  
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_3DES,MCRYPT_MODE_ECB), MCRYPT_RAND);  
 @mcrypt_generic_init($td, $key, $iv);  
 $data = mcrypt_generic($td, $input);  
 mcrypt_generic_deinit($td);  
 mcrypt_module_close($td);  
 //    $data = base64_encode($this->PaddingPKCS7($data));  
 $data = base64_encode($data);  
 return  $data;  
 }

Php コード

function pkcs5_pad ($text, $blocksize) {  
$pad = $blocksize - (strlen($text) % $blocksize);  
return $text . str_repeat(chr($pad), $pad);  
}

.net 側のコードは次のように実装されています:

C# コード

var des = new TripleDESCryptoServiceProvider();  
             var hashMd5 = new MD5CryptoServiceProvider();  
  
             des.Key = hashMd5.ComputeHash(Encoding.Default.GetBytes(strKey));  
             des.Mode = CipherMode.ECB;  
             des.Padding = PaddingMode.Zeros;  
  
             var desEncrypt = des.CreateEncryptor();  
             var buffer = Encoding.Default.GetBytes(strString);  
             return Convert.ToBase64String(desEncrypt.TransformFinalBlock(buffer, 0, buffer.Length));

php を実装する別の方法を見つけましたが、どれも機能しません。

PHPコード

function encrypt($string) {  
  
              //加密用的密钥文件   
  
               $key=md5("XXXXXXXXXXXX",TRUE);  
               $key=base64_encode($key);  
  
              //加密方法   
  
              $cipher_alg = MCRYPT_TRIPLEDES;  
  
              //初始化向量来增加安全性   
  
              $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher_alg,MCRYPT_MODE_ECB), MCRYPT_RAND);   
  
                 
  
              //开始加密   
  
              $encrypted_string = mcrypt_encrypt($cipher_alg, $key, $string, MCRYPT_MODE_ECB, $iv);   
  
              return base64_encode($encrypted_string);//转化成16进制  
  
       }


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。