|
不同编程语言中DES加解密结果要保持一致要注意以下一些要点:
1、工作模式CBC,填充模式PKCS5,不同语言要保持一致。
2、向量要一致,默认使用'\x12\x34\x56\x78\x90\xAB\xCD\xEF'
3、密钥要一致,DES密钥为8位,3DES可以使用24位密钥
4、使用的文本编码要一致,同一个字符串,使用UTF8或GBK编码在内存中存储的实际数据可能是不一样的。在aardio中使用 string.fromto进行转换。
5、如果加密后返回的密文用了BASE64或16进制编码,那么在解密时同样也先做对应的逆向解码。
首先看aardio加解密
- import console;
- import crypt.des;
- var des = crypt.des();
- des.setPassword("abcd1234" )
- //加密
- var sstr = des.encrypt("测试字符串");
- //解密
- var str = des.decrypt(sstr);
- console.log( str, sstr )
- console.pause(true);
复制代码 PHP版本:
- <?
- class CryptDes
- {
- public $key = "";
- public $iv = "\x12\x34\x56\x78\x90\xAB\xCD\xEF";
- public function init_crypt($key)
- {
- $this->key = $key;
- }
- public function encrypt($str)
- {
- $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC);
- $str = $this->pkcs5Pad($str, $size);
- $hexString = bin2hex(mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv));
- return strtoupper($hexString);
- }
- public function decrypt($str)
- {
- $strBin = $this->hex2bin(strtolower($str));
- $str = mcrypt_cbc(MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv);
- $str = $this->pkcs5Unpad($str);
- return $str;
- }
- public function hex2bin($hexData)
- {
- $binData = '';
- for ($i = 0; $i < strlen($hexData); $i += 2) {
- $binData .= chr(hexdec(substr($hexData, $i, 2)));
- }
- return $binData;
- }
- public function pkcs5Pad($text, $blocksize)
- {
- $pad = $blocksize - strlen($text) % $blocksize;
- return $text . str_repeat(chr($pad), $pad);
- }
- public function pkcs5Unpad($text)
- {
- $pad = ord($text[strlen($text) - 1]);
- if ($pad > strlen($text)) {
- return false;
- }
- if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
- return false;
- }
- return substr($text, 0, -1 * $pad);
- }
- }
- $des = new CryptDes();
- $des->init_crypt("abcd1234");
- $sstr = $des->encrypt("def测试"); //加密
- $str = $des->decrypt($sstr); //解密
- echo $sstr;
- ?>
复制代码
注意上面的PHP版本将加密结果转换为了16进制字符,
在aardio中使用 string.unhex() 函数转回来, 注意aardio10使用UTF8编码,上面的PHP文件也应该存为UTF8编码,如果PHP使用GBK编码,那么相应的在aardio中也要做GBK编码转换。
import console;
import crypt.des;
var des = crypt.des();
des.setPassword("abcd1234" )
var phpsstr = "077E5E400A140170";//服务端返回的加密数据
phpsstr = string.unhex( phpsstr,"" ); //十六进制解码
var str = des.decrypt(phpsstr) ; //DES解码
str = string.fromto(str,0,65001) //PHP页面使用了UTF8,用这句转回来
console.log( str )
console.pause()
|
|