Java AES/CBC/PKCS5Padding 加解密代码详解
Java AES/CBC/PKCS5Padding 加解密代码详解
这段代码展示了使用AES/CBC/PKCS5Padding模式进行加密和解密的功能。以下是对代码的语法和语义的解释:
public byte[] encrypt(byte[] data, Key key) {
try {
Cipher cipher = Cipher.getInstance('AES/CBC/PKCS5Padding');
byte[] iv = SecureRandoms.randBytes(cipher.getBlockSize());
//初始化密钥与加密参数iv
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
//加密
byte[] encryptBytes = cipher.doFinal(data);
//将iv与密文拼在一起
ByteArrayOutputStream baos = new ByteArrayOutputStream(iv.length + encryptBytes.length);
baos.write(iv);
baos.write(encryptBytes);
return baos.toByteArray();
} catch (Exception e) {
return ExceptionUtils.rethrow(e);
}
}
public byte[] decrypt(byte[] data, Key key) {
try {
Cipher cipher = Cipher.getInstance('AES/CBC/PKCS5Padding');
//获取密文前面的iv
IvParameterSpec ivSpec = new IvParameterSpec(data, 0, cipher.getBlockSize());
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
//解密iv后面的密文
return cipher.doFinal(data, cipher.getBlockSize(), data.length - cipher.getBlockSize());
} catch (Exception e) {
return ExceptionUtils.rethrow(e);
}
}
语法
public byte[] encrypt(byte[] data, Key key) { ... }:定义了一个公共方法encrypt,该方法接受一个字节数组data和一个密钥key作为输入,并返回一个字节数组作为加密结果。public byte[] decrypt(byte[] data, Key key) { ... }:定义了一个公共方法decrypt,该方法接受一个字节数组data和一个密钥key作为输入,并返回一个字节数组作为解密结果。
语义
-
Cipher 对象创建和初始化
Cipher cipher = Cipher.getInstance('AES/CBC/PKCS5Padding');:创建一个Cipher对象,用于执行加密和解密操作。指定了使用AES算法、CBC模式和PKCS5Padding填充方式。
-
加密过程
byte[] iv = SecureRandoms.randBytes(cipher.getBlockSize());:生成一个与分组大小相同的随机初始向量(IV)。cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));:使用加密模式和密钥初始化Cipher对象,并使用随机生成的IV作为加密参数。byte[] encryptBytes = cipher.doFinal(data);:对输入的数据进行加密操作,结果存储在encryptBytes中。- 最后将IV和加密后的数据拼接在一起,作为加密结果返回。
-
解密过程
IvParameterSpec ivSpec = new IvParameterSpec(data, 0, cipher.getBlockSize());:从密文数据中获取前面的IV。cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);:使用解密模式和密钥初始化Cipher对象,使用前面提取的IV作为解密参数。return cipher.doFinal(data, cipher.getBlockSize(), data.length - cipher.getBlockSize());:对密文数据进行解密操作,结果作为解密结果返回。
注意事项
- 这段代码只提供了加密和解密的方法,而密钥的生成、管理和传递等方面需要根据具体的需求进行处理。
- 代码中使用了
SecureRandoms.randBytes()和ExceptionUtils.rethrow()等辅助方法,这些方法的实现并未在代码中提供,可能需要额外的代码或库的支持。
原文地址: https://www.cveoy.top/t/topic/h3z 著作权归作者所有。请勿转载和采集!