以下是一个使用Java实现AES/CBC/NoPadding加密和解密的示例代码:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESCBCNoPaddingExample {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, AES/CBC/NoPadding!";
String key = "1234567890123456";
String iv = "abcdefghijklmnop";
byte[] encrypted = encrypt(plaintext, key, iv);
System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encrypted));
String decrypted = decrypt(encrypted, key, iv);
System.out.println("Decrypted: " + decrypted);
}
public static byte[] encrypt(String plaintext, String key, String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
return cipher.doFinal(pad(plaintext).getBytes(StandardCharsets.UTF_8));
}
public static String decrypt(byte[] ciphertext, String key, String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
return new String(cipher.doFinal(ciphertext), StandardCharsets.UTF_8).trim();
}
private static String pad(String s) {
int padding = 16 - (s.length() % 16);
StringBuilder padded = new StringBuilder(s);
for (int i = 0; i < padding; i++) {
padded.append((char)padding);
}
return padded.toString();
}
}
在上面的示例中,我们使用AES算法,CBC模式和NoPadding填充来加密和解密数据。在加密过程中,我们使用16字节的密钥和初始化向量(IV)来初始化加密器。在解密过程中,我们使用相同的密钥和IV来初始化解密器。加密和解密方法中的pad
函数用于填充数据,以确保其长度是16的倍数。最后,我们使用Base64编码来打印加密后的数据。