aardio,PHP,C#,Java 等不同编程语言中 AES 加解密结果要保持一致要注意以下一些要点:
import console;
import crypt.bin;
import crypt.aes;
//创建AES加密算法容器
var aes = crypt.aes();
//设置密钥(最大32个字节)
aes.setPassword("1234567812345678");
//不指定加密向量时默认设为密钥的值
//aes.setInitVector("1234567812345678")
//加密
var str = aes.encrypt("Test String");
//BASE64编码加密结果
console.log( crypt.bin.encodeBase64( str ) );
//解密
str = aes.decrypt(str);
console.log(str);
console.pause(true);
using System;
using System.Text;
using System.Security.Cryptography;
namespace TestApp
{
class Aes
{
static void Main(string[] args)
{
String str = "Test String";
String encryptData = Aes.Encrypt(str, "1234567812345678", "1234567812345678");
Console.WriteLine(encryptData);
String dstr = Aes.Decrypt("xL1eEwu9WCDRiscUbPPPSA==", "1234567812345678", "1234567812345678");
Console.WriteLine(dstr);
Console.ReadKey();
}
public static string Encrypt(string toEncrypt, string key, string iv)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rm = new RijndaelManaged();
rm.Key = keyArray;
rm.IV = ivArray;
rm.Mode = CipherMode.CBC;
rm.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rm.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string Decrypt(string toDecrypt, string key, string iv)
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(iv);
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rm = new RijndaelManaged();
rm.Key = keyArray;
rm.IV = ivArray;
rm.Mode = CipherMode.CBC;
rm.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rm.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return UTF8Encoding.UTF8.GetString(resultArray);
}
}
}
import console;
import php;
php.code =/***
//AES加密
function aes_encrypt($encryptKey,$encryptStr) {
$localIV = $encryptKey;
$encryptKey = $encryptKey;
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $encryptKey, $localIV);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $block - (strlen($encryptStr) % $block);
$encryptStr .= str_repeat(chr($pad), $pad);
$encrypted = mcrypt_generic($module, $encryptStr);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return base64_encode($encrypted);
}
//AES解密
function aes_decrypt($encryptKey,$encryptStr) {
$localIV = $encryptKey;
$encryptKey = $encryptKey;
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $encryptKey, $localIV);
$encryptedData = base64_decode($encryptStr);
$encryptedData = mdecrypt_generic($module, $encryptedData);
$e = ord($encryptedData[strlen($encryptedData)-1]);
if($e<=16)$encryptedData=substr($encryptedData, 0,strlen($encryptedData)-$e);
return $encryptedData;
}
$result = aes_encrypt("1234567812345678",'Test String');
$decryptString = aes_decrypt("1234567812345678",$result);
echo $result;
echo $decryptString;
因为 PHP7.1 废弃了mcrypt,所以写法不一样, 要保持加解密结果与上面的aardio代码一致,需要这样写:
<?php
//AES加密
function aes_encrypt($key,$str)
{
return base64_encode( openssl_encrypt($str, 'AES-128-CBC',$key,OPENSSL_RAW_DATA,$key) );;
}
//AES解密
function aes_decrypt($key,$str)
{
return openssl_decrypt(base64_decode($str), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $key);
}
$result = aes_encrypt("1234567812345678",'Test String');
$str = aes_decrypt("1234567812345678",$result);
echo $result."<br>";
echo $str;
?>
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class AESCrypt {
public static String encrypt(String source, String key) throws Exception {
byte[] sourceBytes = source.getBytes("UTF-8");
byte[] keyBytes = key.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, "AES"),ivParameterSpec);
byte[] decrypted = cipher.doFinal(sourceBytes);
return new sun.misc.BASE64Encoder().encode(decrypted);
}
public static String decrypt(String encryptStr, String key) throws Exception {
byte[] sourceBytes = new sun.misc.BASE64Decoder().decodeBuffer(encryptStr);
byte[] keyBytes = key.getBytes("UTF-8");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, "AES"),ivParameterSpec);
byte[] decoded = cipher.doFinal(sourceBytes);
return new String(decoded, "UTF-8");
}
}