因为要开发社交平台,涉及到聊天内容,这些敏感内容想用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再解密,不然会出错。
其他语言请参考 这个链接内容 https://my.oschina.net/Jacker/blog/86383 他这个是AES加密方式的
AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
对了,贴一下cryptojs 下载地址 https://www.oschina.net/p/crypto-js
另外,欢迎大家加入我个人建立的QQ群交流,群里的朋友都很热心帮忙解决问题。
网络编程开发-交流QQ群号49184341
1000人群,快满了
互联网专业人才招聘群 QQ群号232185168
这也是1000人群,也有几百人了