10

这是我使用 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);
}

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

谢谢

4

1 回答 1

24

你要么使用

Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES", "BC");

要不然

Cipher cipher = Cipher.getInstance("AES", new BouncyCastleProvider());

也就是说,Cipher.getInstance("AES")使用不安全的电子密码本。您要么需要密码块链接 ( Cipher.getInstance("AES/CBC/PKCS5Padding")) 或计数器 ( Cipher.getInstance("AES/CTR/NoPadding")) 模式;它们都是安全的,主要区别在于 CBC 需要填充,而 CTR 不需要。

于 2013-04-10T13:12:30.987 回答