不同编程语言中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的我就不转了。