AES(Advanced Encryption Standard)是取代DES而成为新标准的一种对称加密算法。在全世界提交的众多对称加密算法的候选中,其中有一个名为Rijndael的对称加密算法,将其命名为AES。
整体流程
- 分组长度
在AES中,分组长度固定位128位。 - 密钥长度
在AES中密钥长度有128位、192位和256位三种。
密钥扩展
- 根据原始密钥生成一组轮密钥。这些轮密钥将在加密过程中使用。
- 对于128位密钥,扩展出10轮密钥;192位密钥扩展出12轮密钥;256位密钥扩展出14轮密钥。
初始变换
将初始数据块与第一轮密钥进行逐位异或(XOR)运算,得到变换后的16字节块。
轮循环运算
(重复 9, 11, 或 13 次,具体取决于密钥长度)
- SubBytes:每个字节被替换为另一个字节,替换表称为S-Box。
- ShiftRows:数据行进行循环移位。
- MixColumns:对每列进行混合,增加数据的扩散性。
- AddRoundKey:将数据与当前轮的轮密钥进行异或运算。
最终轮
- SubBytes:进行字节替换。
- ShiftRows:进行行移位。
- AddRoundKey:与最后一轮的轮密钥进行异或运算。
最终轮的输出就是加密后的数据块,也就是密文。
Python调用
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
key = '0123456789abcdef'
data = "Bileton"
paded_data = pad(data.encode("UTF-8"),16)
cipher = AES.new(key.encode("UTF-8"), AES.MODE_ECB)
data_encrypt = cipher.encrypt(paded_data).hex()
print(data_encrypt)
>>> cef043b604dfa84449dd3a1e5bf117e6
加上iv向量
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad
key = '0123456789abcdef'
data = "Bileton"
iv = '0123456789abcdef'
paded_data = pad(data.encode("UTF-8"),16)
cipher = AES.new(key.encode("UTF-8"), AES.MODE_CBC,iv.encode("UTF-8"))
data_encrypt = cipher.encrypt(paded_data).hex()
print(data_encrypt)
>>> 95e9660e32eaf61a1873afdd9dac4757
Java调用
String data = "Bileton";
String Stringkey = "0123456789abcdef";
Key key = new SecretKeySpec(Stringkey.getBytes(),"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,key);
cipher.update(data.getBytes());
byte[] encrypteddata = cipher.doFinal();
String encodeencryptedata = Base64.getEncoder().encodeToString(encrypteddata);
System.out.println(encodeencryptedata);
>>> zvBDtgTfqERJ3ToeW/EX5g==
加上IV向量
String data = "Bileton";
String Stringkey = "0123456789abcdef";
Key key = new SecretKeySpec(Stringkey.getBytes(),"AES");
String stringIV = "0123456789abcdef";
IvParameterSpec iv = new IvParameterSpec(stringIV.getBytes());
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,key,iv);
cipher.update(data.getBytes());
byte[] encrypteddata = cipher.doFinal();
String encodeencryptedata = Base64.getEncoder().encodeToString(encrypteddata);
System.out.println(encodeencryptedata);
>>> zvBDtgTfqERJ3ToeW/EX5g==
Android Studio
String data = "Bileton";
String string_key = "0123456789abcdef";
Key key = new SecretKeySpec(string_key.getBytes(),"AES");
String string_iv = "0123456789abcdef";
IvParameterSpec iv = new IvParameterSpec(string_iv.getBytes());
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE,key,iv);
cipher.update(data.getBytes());
byte[] encryptedata = cipher.doFinal();
String encodeencryptedata = Base64.encodeToString(encryptedata,Base64.DEFAULT);
Toast.makeText(MainActivity.this,encodeencryptedata,Toast.LENGTH_SHORT).show();