用CryptoJS 實現js端3des加密和解密,用openssl_encrypt實現php的3des加密解密,相容java和C#和c++等
因為要開發社交平臺,涉及到聊天內容,這些敏感內容想用3des加密傳輸,百度了好多資料,測試了好多次,終於實現了功能,可以直接使用,這裡寫下來,希望幫助到其他朋友。
聽說微信小程式需要資料加密,相信這個能幫到大家。
這裡說一下,iv向量一般是8位,我的php版本是5.5.12
我原來用mcrypt_decrypt的時候,有的iv長度要8位,有的要16位,折騰了好久都沒搞定和JS通用,加上聽說php7以後要廢棄,所以直接用了openssl_encrypt
//3des加密 OPENSSL_RAW_DATA 為Pkcs7填充模式 function des_encrypt($data,$key = ENCRYPT_KEY, $iv = ENCRYPT_IV) { $key = md5($key); //32位長度 $iv = substr(md5($iv),0,8); //取前8位 $str = openssl_encrypt($data, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv); return base64_encode($str); } //3des解密 OPENSSL_RAW_DATA 為Pkcs7填充模式 function des_decrypt($data,$key = ENCRYPT_KEY, $iv = ENCRYPT_IV) { $data = base64_decode($data); $key = md5($key); //32位長度 $iv = substr(md5($iv),0,8); //取前8位 $str = openssl_decrypt($data, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv); return ($str); }
下面是js實現3des加密和解密
function des_encrypt(str,key,iv) { var key = CryptoJS.MD5(key).toString(); var iv = CryptoJS.MD5(iv).toString(); var crypto_key = CryptoJS.enc.Utf8.parse(key); var crypto_iv = CryptoJS.enc.Utf8.parse(iv.substr(0,8)); //console.log(crypto_key.toString(CryptoJS.enc.Utf8)); //console.log(crypto_iv.toString(CryptoJS.enc.Utf8)); var encode_str = CryptoJS.TripleDES.encrypt(str, crypto_key, { iv: crypto_iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}); return encode_str.toString(); } function des_decrypt(str,key,iv) { var key = CryptoJS.MD5(key).toString(); var iv = CryptoJS.MD5(iv).toString(); var crypto_key = CryptoJS.enc.Utf8.parse(key); var crypto_iv = CryptoJS.enc.Utf8.parse(iv.substr(0,8)); var decrypt_str = CryptoJS.TripleDES.decrypt(str, crypto_key, { iv: crypto_iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7}); return decrypt_str.toString(CryptoJS.enc.Utf8); }
這裡要說一下,如果傳的資料是中文,php解密後的資料會是utf8編碼的,如果你的頁面是gbk,要轉一下。
如果你是php加密,js解密,也要考慮編碼問題。
下面我把我寫的轉碼程式碼也貼上來,不單可以轉字元,還可以轉陣列和物件。
function convert_to_encoding($str, $old_encoding, $new_encoding) { if (function_exists('iconv')) { $str = @iconv($old_encoding, $new_encoding, $str); } else { return false; } return $str; } //gbk轉utf8 function foreach_to_utf8($string, $encoding = 'gbk') { if (is_array($string) ) { foreach($string as $key => $val) { $string[$key] = foreach_to_utf8($val,$encoding); } } else if( is_object($string) ) { foreach($string as $key => $val) { $string->$key = foreach_to_utf8($val,$encoding); } } else { $string = convert_to_encoding($string, $encoding,'UTF-8'); } return $string; } //utf8轉gbk function foreach_to_gbk($string, $encoding = 'utf-8') { if (is_array($string) ) { foreach($string as $key => $val) { $string[$key] = foreach_to_gbk($val,$encoding); } } else if( is_object($string) ) { foreach($string as $key => $val) { $string->$key = foreach_to_gbk($val,$encoding); } } else { $string = convert_to_encoding($string, $encoding,'GBK//IGNORE'); } return $string; }
如果你不是Php語言,是java或者C#或C++
只要加解密方式為3des,模式為CBC,填充方式為Pkcs7,應該是通用的。要注意一點就是加密後會base64_encode,解碼的時候要先base64_decode再解密,不然會出錯。
AES加密CBC模式相容互通四種程式語言平臺【PHP、Javascript、Java、C#】
另外,歡迎大家加入我個人建立的QQ群交流,群裡的朋友都很熱心幫忙解決問題。
1000人群,快滿了
這也是1000人群,也有幾百人了