1. 程式人生 > >用CryptoJS 實現js端3des加密和解密,用openssl_encrypt實現php的3des加密解密,相容java和C#和c++等

用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人群,也有幾百人了