Heim >Backend-Entwicklung >PHP-Tutorial >Implementierung des PHP 3DES-Verschlüsselungsalgorithmus

Implementierung des PHP 3DES-Verschlüsselungsalgorithmus

巴扎黑
巴扎黑Original
2016-11-21 13:49:362574Durchsuche

Was ich in letzter Zeit tun muss, ist, dass PHP eine 3des-verschlüsselte URL an .net zurückgibt und sie dann von der .net-Seite entschlüsselt wird. Die Implementierung von PHP konnte nie mit der von .net mithalten. Ich werde es hier zuerst aufschreiben und hoffe, einige Ratschläge von Experten zu erhalten. Es gibt unzählige Leute im Internet, die es kopieren, ohne es persönlich zu überprüfen. Ich hoffe, dass sich in Zukunft jeder an die strenge Methode halten kann.

Bevor die PHP-Verschlüsselungserweiterungsbibliothek Mcrypt Daten verschlüsselt und entschlüsselt, erstellt sie zunächst einen Initialisierungsvektor, kurz iv genannt. Aus $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND); ist ersichtlich, dass zum Erstellen eines Initialisierungsvektors zwei Parameter erforderlich sind: size gibt die Größe von iv an; source ist die Quelle von iv, und der Wert ist MCRYPT_RAND die Zufallszahl des Systems.

Die Funktion mcrypt_get_iv_size($cipher,$modes) gibt die Initialisierungsvektorgröße zurück. Die Parameter cipher und mode beziehen sich auf den Algorithmus bzw. den Verschlüsselungsmodus.

PHP-Code

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-Code

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

Der Code auf der .net-Seite ist implementiert als folgt:

C#-Code

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));

Ich habe eine andere Möglichkeit gefunden, PHP zu implementieren, aber es funktioniert nicht.

PHP-Code

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进制  
  
       }


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn