不同编程语言中AES加解密结果要保持一致要注意以下一些要点:
不同编程语言中AES加解密结果要保持一致要注意以下一些要点:
1、工作模式CBC,填充模式PKCS5,不同语言要保持一致。 2、在下面的示例中,加密向量统一设为与密钥相同。
3、不同编程语言使用的文本编码要一致,同一个字符串,使用UTF8或GBK编码在内存中存储的实际数据可能是不一样的。在aardio中默认编码为UTF-8,使用 string.fromto进行转换为其他编码。
4、如果加密后返回的密文用了BASE64或16进制编码,那么在解密时同样也先做对应的逆向解码。
先看aardio实现AES加密、解密的代码:
import console; import crypt.bin; import crypt.aes; //创建AES加密算法容器 var aes = crypt.aes(); //设置密钥(最大32个字节) aes.setPassword("1234567812345678"); //加密 var str = aes.encrypt("Test String"); //BASE64编码加密结果 console.log( crypt.bin.encodeBase64( str ) ); //解密 str = aes.decrypt(str); console.log(str); 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中使用 crypt.bin.decodeHex() 函数转回来, 注意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()
转帖于:http://bbs.aardio.com/forum.php?mod=viewthread&tid=13148&extra=page%3D1
后面c#的,java的我就不转了。