java如何使用Zero Padding填充
时间: 2023-07-20 10:34:27 浏览: 258
AESUtils实现了基于AES的ECB模式,选用了zeropadding填充,数据位为128 加上密码去加解密数据(优化并实测通过)
在 Java 中使用 Zero Padding 填充可以使用 javax.crypto.Cipher 类的 `getInstance` 方法中传入参数 "AES/ECB/NoPadding",然后在加密和解密时使用 `doFinal` 方法即可。
以下是使用 Zero Padding 填充的 Java 代码示例:
```java
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
// 加密
public static String encrypt(String data, String key) throws Exception {
// 创建 AES 密钥
SecretKeySpec aesKey = new SecretKeySpec(key.getBytes(), "AES");
// 创建 Cipher 对象
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, aesKey);
// 对数据进行 Zero Padding 填充
byte[] dataBytes = data.getBytes();
int length = dataBytes.length;
int paddingLength = 16 - length % 16;
byte[] paddingData = new byte[length + paddingLength];
System.arraycopy(dataBytes, 0, paddingData, 0, length);
// 加密数据
byte[] encrypted = cipher.doFinal(paddingData);
// 将加密结果进行 Base64 编码并返回
return Base64.getEncoder().encodeToString(encrypted);
}
// 解密
public static String decrypt(String data, String key) throws Exception {
// 创建 AES 密钥
SecretKeySpec aesKey = new SecretKeySpec(key.getBytes(), "AES");
// 创建 Cipher 对象
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, aesKey);
// 解密数据
byte[] encrypted = Base64.getDecoder().decode(data);
byte[] decrypted = cipher.doFinal(encrypted);
// 去除 Zero Padding 填充
int paddingLength = 0;
for (int i = decrypted.length - 1; i >= 0; i--) {
if (decrypted[i] == 0) {
paddingLength++;
} else {
break;
}
}
byte[] original = new byte[decrypted.length - paddingLength];
System.arraycopy(decrypted, 0, original, 0, original.length);
// 将解密结果转为字符串并返回
return new String(original, "UTF-8");
}
}
```
在使用时,可以调用 `encrypt` 方法对数据进行加密,调用 `decrypt` 方法对数据进行解密,示例如下:
```java
public static void main(String[] args) throws Exception {
String data = "Hello, world!"; // 待加密数据
String key = "1234567890123456"; // 加密密钥
String encrypted = AESUtil.encrypt(data, key);
System.out.println(encrypted); // 输出加密后的数据
String decrypted = AESUtil.decrypt(encrypted, key);
System.out.println(decrypted); // 输出解密后的数据
}
```
阅读全文