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