最近需要在做的東西,php返回一個3des加密的url給.net,然後.net端解密。php的實現一直無法和.net端匹配起來,先記在這裡,希望看到的大神指點。網上無數照抄照搬的人,根本沒有親身驗證過,希望大家以後能夠秉承著嚴謹的方式。
PHP加密擴充庫Mcrypt對資料加密和解密之前,首先建立了一個初始化向量,簡稱為iv。由 $iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher,$modes),MCRYPT_RAND);可見建立初始化 向 量需要兩個參數:size指定了iv的大小;source為iv的源,其中值MCRYPT_RAND為系統隨機數。
函數mcrypt_get_iv_size($cipher,$modes)返回初始化向量大小,參數cipher和mode分別指演算法和加 密模式。
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; }
function pkcs5_pad ($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); }
.net側的代碼實現如下:
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的另一種實現方式,皆不可。
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進位 }
網上無數照抄照搬的人,根本沒有親身驗證過,希望大家以後能夠秉承著嚴謹的方式。