AES与PBEWithSHA256And256BitAES

时间:2015-05-07 16:41:27

标签: java encryption cryptography aes

我需要用密码加密一些数据。它必须是具有256位密钥的AES的变体。 我在网上搜索了一会儿,想出了这两个算法。现在我不知道,选择哪一个,因为我不知道,哪一个是' saver'。

第一个是PBEWithSHA256And256BitAES-CBC-BC:

public static byte[] encrypt(String plainText, char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
    PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 2048);

    PBEKeySpec pbeKeySpec = new PBEKeySpec(password);
    SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC", "BC");
    SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);

    Cipher encryptionCipher = Cipher.getInstance("PBEWithSHA256And256BitAES-CBC-BC", "BC");
    encryptionCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);

    return encryptionCipher.doFinal(plainText.getBytes());
}

另一个用PBEWithSHA256And256BitAES-CBC-BC生成密钥,但用AES加密:

public static byte[] encrypt(String plainText, char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithSHA256And256BitAES-CBC-BC", "BC");
    KeySpec spec = new PBEKeySpec(password, salt, 2048, 256);
    SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");

    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(plainText.getBytes());
}

那么,哪一个 - 以及为什么 - 更安全一个?它们之间有什么区别?

1 个答案:

答案 0 :(得分:3)

您当然应该为分组密码指定一种操作模式。那是" CBC" BC实施中的密码的一部分。否则,您将默认为ECB模式,可以进行简单的码本重放攻击!所以,长话短说 - 不要使用底部代码剪辑,而不是最顶层代码。

通过指定操作模式和其他参数,它可以通过类似于BC实现的方式进行操作 - 但老实说,只要你不了解这些东西就可以使用BC--他们已经完成了工作和那些提供者随时可以随时使用"开箱即用"。