用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再解密,不然会出错。

其他语言请参考 这个链接内容  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   

                                          用CryptoJS 实现js端3des加密和解密,用openssl_encrypt实现php的3des加密解密,兼容java和C#和c++等_第1张图片   

                                         1000人群,快满了

 

                                       互联网专业人才招聘群 QQ群号232185168

                                        用CryptoJS 实现js端3des加密和解密,用openssl_encrypt实现php的3des加密解密,兼容java和C#和c++等_第2张图片

                                         这也是1000人群,也有几百人了

 

 

 

 

 

    

你可能感兴趣的:(php,js,安全)