AES加解密简述
AES密钥为对称密钥,为分组密码,密钥的长度可以为128位(16字节)、192位(24字节)、256位(32字节)。
对称密钥的意思就是加密和解密使用的是同一个密钥串。加解密流程如下:
明文P
要被加密的数据。
密钥K
用来加密明文的AES密钥,可以是128位、192位或256位,加密和解密
的密钥是相同的,密钥可以是发送方与接收方协商产生,但不可以直接以明文的方式在网络上传递,否则会导致密钥泄露,通常是通过非对称密钥加密保护对称密钥,然后进行网络传输。
AES加密函数
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密
文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
密文C
经过加密后的数据。
AES解密函数
设AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明
文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。
AES的基本结构
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:
AES | 密钥长度 | 分组长度 | 加密轮数 |
AES-128 | 128位(16字节) | 128位(16字节) | 10 |
AES-192 | 192位(24字节) | 128位(16字节) | 12 |
AES-256 | 256位(32字节) | 128位(16字节) | 14 |
此处使用BC进行一个代码展示:
public static SecretKey getKey() throws NoSuchAlgorithmException {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyAes = secretKey.getEncoded();
return secretKey;
}
public static byte[] enc(String plainText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = getInstance("AES/ECB/NoPadding","BC"); //使用BC
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(Base64.decode(plainText));
}
public static byte[] dec(byte[] cipherText, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
Cipher cipher = getInstance("AES/ECB/NoPadding","BC"); //使用BC
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(cipherText);
}
至于加密轮数,与细节,下章继续,加密细节,其实对于我们使用而言,并不需要了解解密的细节,只需要知道怎么使用即可。
欢迎点赞转发,谢谢~
文章转载自闲来无去,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。