AES对称加密算法

发布于:2024-10-16 ⋅ 阅读:(9) ⋅ 点赞:(0)

  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();

在这里插入图片描述