共计 2355 个字符,预计需要花费 6 分钟才能阅读完成。
AES
表一:
算法 | 秘钥长度 | 秘钥长度默认值 | 工作模式 | 填充模式 | 备注 |
---|---|---|---|---|---|
AES | 128,192,256 | 128 | ECB,CBC,PCBC,CTR,CTS,CFB,CFB8 至 CFB128,OFB,OFB8 至 OFB128 | NoPadding,PKCS5Padding,ISO10126Padding | Java6 实现若应用 256 位秘钥须要取得无政策限度权限文件 (Unlimited Strength Jurisdiction Policy Files) |
AES | 同上 | 同上 | 同上 | PKCS7Padding,ZeroBytePadding | Bouncy Castle 实现 |
表二:
AES | 秘钥长度 (比特) | 分组长度 (比特) | 向量长度 (比特) | 加密轮数 |
---|---|---|---|---|
AES-128 | 128 | 128 | 128 | 10 |
AES-192 | 192 | 128 | 128 | 12 |
AES-256 | 256 | 128 | 128 | 14 |
-
1
依据密钥长度不同,分为 AES128、AES192、AES256
- 1. 特点
- ECB 模式和 CBC 模式的区别
- 对称加密算法里,应用 NOPadding,加密的明文必须等于分组长度倍数,否则报错
- 如果应用 PKCS5Padding,会对加密的明文填充 1 字节 - 1 个分组的长度
- 没有指明加密模式和填充形式,示意应用默认的 AES/ECB/PKCS5Padding
- 加密后的字节数组能够编码成 Hex、Base64
- AES 算法明文按 128 位进行分组加密,能够调用 cipher.getBlockSize() 来获取
- 要复现一个对称加密算法,须要失去明文、key、iv、mode、padding
- 明文、key、iv 须要留神解析形式,而且不肯定是字符串模式
- 如果加密模式是 ECB,则不须要加 iv,加了的话会报错
- 如果明文中有两个分组的内容雷同,ECB 会失去齐全一样的密文,CBC 不会
- 加密算法的后果通常与明文等长或者更长,如果变短了,那可能是 gzip、protobuf
-
2. 代码实现
public static String encryptAES(String plaintext) throws Exception { // 初始化秘钥 和加密算法 秘钥为 16 位 SecretKeySpec keySpec = new SecretKeySpec("0123456789abcdef".getBytes(StandardCharsets.UTF_8),"AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec("hengdinghengding".getBytes(StandardCharsets.UTF_8)); // 失去 Cipher 的实例 026fcbe02f76529d0a5bb3904aa6efdc C5sV2ktEoPUVHc/EwB811b8xuRnjiS3cO1khLWp7EeY= Cipher des = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 对 Cipher 实例进行初始化,des.init(Cipher.ENCRYPT_MODE,keySpec,ivParameterSpec); // update 并不会每次都减少要加密的字符串的长度,并不牢靠。现实中的状态是 xiaojianbang +hengdi 解密发现只有 banghengdi // des.update("xiaojianbang".getBytes(StandardCharsets.UTF_8)); // 加密 由字符串 失去的 byte[] byte[] res=des.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); Log.d("hengdi","AES byte test" + Arrays.toString(res)); // 将 byte[] 实例化为 ByteString 对象 ByteString bty= ByteString.of(res); // hex 编码 String str_hex= bty.hex(); // base64 编码 String str_base64 = bty.base64(); return str_hex + "||" + str_base64; } public static String decryptAES(String cipherText) throws Exception {// 将加密后 base64 编码的字符串 解码,并还原成 byte[] // byte[] cipherTextBytes = ByteString.decodeHex(cipherText).toByteArray(); byte[] cipherTextBytes = ByteString.decodeBase64(cipherText).toByteArray(); SecretKeySpec keySpec = new SecretKeySpec("0123456789abcdef".getBytes(StandardCharsets.UTF_8),"AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec("hengdinghengding".getBytes(StandardCharsets.UTF_8)); // 失去 Cipher 的实例 026fcbe02f76529d0a5bb3904aa6efdc Am/L4C92Up0KW7OQSqbv3A== Cipher des = Cipher.getInstance("AES/CBC/PKCS5Padding"); des.init(Cipher.DECRYPT_MODE,keySpec,ivParameterSpec); byte[] res=des.doFinal(cipherTextBytes); return new String(res); }
正文完
发表至: microservice
2021-12-25