AES使用Bouncy Castle提供商加密/解密

fik*_*Raf 8 java cryptography bouncycastle aes

这是我使用JDK 5的本机库开发的AES 256加密和解密的实现:

public static String encrypt(String key, String toEncrypt) throws Exception {
    Key skeySpec = generateKeySpec(key);
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(toEncrypt.getBytes());
    byte[] encryptedValue = Base64.encodeBase64(encrypted);
    return new String(encryptedValue);
}

public static String decrypt(String key, String encrypted) throws Exception {
    Key skeySpec = generateKeySpec(key);
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decodedBytes = Base64.decodeBase64(encrypted.getBytes());
    byte[] original = cipher.doFinal(decodedBytes);
    return new String(original);
}
Run Code Online (Sandbox Code Playgroud)

我想用Boucy Castle API(Java)实现相同的方法:我搜索了很多,测试了很多,没有结果......有人可以帮我吗?

谢谢

Zim*_*oot 22

你会使用

Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES", "BC");
Run Code Online (Sandbox Code Playgroud)

要不然

Cipher cipher = Cipher.getInstance("AES", new BouncyCastleProvider());
Run Code Online (Sandbox Code Playgroud)

也就是说,Cipher.getInstance("AES")使用电子密码本,这是不安全的.你要么想要Cipher Block Chaining(Cipher.getInstance("AES/CBC/PKCS5Padding"))或Counter(Cipher.getInstance("AES/CTR/NoPadding"))模式; 它们都是安全的,主要区别在于CBC需要填充而CTR不需要填充.