【问题标题】:Bouncy Castle's Password Based Encryption With AES in CBC modeBouncy Castle 在 CBC 模式下使用 AES 进行基于密码的加密
【发布时间】:2011-12-16 12:39:15
【问题描述】:

我最近遇到了一段代码,它在 CBC 模式下使用 BouncyCastle 的 PBE 和 AES(“PBEWithSHA1And256BitAES-CBC-BC”)。

public static final String ALGORITHM = "PBEWithSHA1And256BitAES-CBC-BC";

public static byte[] encrypt(final byte[] key, final byte[] salt, final byte[] plainText) throws CryptoException {
    try {
        // Create the encryption key
        final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM, "BC");
        final PBEKeySpec keySpec = new PBEKeySpec(new String(key).toCharArray());
        final SecretKey secretKey = keyFactory.generateSecret(keySpec);

        // Encrypt the plain text
        final PBEParameterSpec cipherSpec = new PBEParameterSpec(salt, ITERATIONS);
        final Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, cipherSpec);
        final byte[] encryptedBytes = cipher.doFinal(plainText);

        return encryptedBytes;

    } catch (final Throwable t) {
        throw new CryptoException(t.toString());
    }
}

如您所见,此代码未指定适当的 IV 来执行 AES CBC 加密。

我不知道如何为密码指定盐、迭代次数和要使用的 IV

我应该怎么做?

谢谢。

【问题讨论】:

  • 什么意思,你不知道如何指定盐和迭代次数?你不是已经这样做了吗?
  • 我知道如何指定盐和迭代次数,它们用于从用户指定的密码生成强派生加密密钥。导出该加密密钥后,它将用于在 CBC 模式下使用 AES 加密数据。由于模式是 CBC,我们想指定一个我不知道怎么做的 IV!
  • 我的回答不够?还是你不明白?我很高兴你至少跟进你的问题,虽然 13 天有点时间......

标签: java encryption aes bouncycastle


【解决方案1】:

可以使用jasypt(java简单加密)PBEWithSHA1And256BitAES-CBC-BC

示例代码如下:

StandardPBEStringEncryptor myFirstEncryptor = new StandardPBEStringEncryptor();                                                                                                      
myFirstEncryptor.setProvider(new BouncyCastleProvider());                                                                                                    

myFirstEncryptor.setAlgorithm("PBEWITHSHA256AND256BITAES-CBC-BC");                                                                                         




FixedStringSaltGenerator generator = new FixedStringSaltGenerator();                                                                                         
generator.setSalt("justAnotherSaltforGX");
//myFirstEncryptor.setSaltGenerator(new ZeroSaltGenerator());                                                                                                    

myFirstEncryptor.setSaltGenerator(generator);                                                                                                                    

myFirstEncryptor.setKeyObtentionIterations(1);                                                                                                               
String myPassword="creditCard";                                                                                                                              
myFirstEncryptor.setPassword(myPassword);                                                                                                                    


String myText="Redeem Gacha ";                                                                                                         
String myFirstEncryptedText = myFirstEncryptor.encrypt(myText);                                                                                              

System.out.println("myFirstEncryptedText AES encrypt=="+myFirstEncryptedText);                                                                               

System.out.println("myFirstEncryptedText AES decrypt =="+myFirstEncryptor.decrypt(myFirstEncryptedText));

【讨论】:

    【解决方案2】:

    我认为,如果您想使用 IV,您将需要生成一个随机密钥并在您现在加密纯文本的位置对其进行加密。然后,您可以使用它来加密数据,使用 IvParameterSpec 来指定 IV。当然,您确实需要将加密的密钥和 IV 存储在已加密的数据旁边。仅当您使用相同的密钥加密多个明文时才需要这样做。

    【讨论】:

      【解决方案3】:

      使用 Jasypt 和 BouncyCastle 1.51 (SpongyCastle),我可以使用以下内容

      Algorithm: PBEWITHSHAAND128BITAES-CBC-BC
      Algorithm: PBEWITHSHAAND192BITAES-CBC-BC
      Algorithm: PBEWITHSHAAND256BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND128BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND192BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND256BITAES-CBC-BC
      Algorithm: PBEWITHMD5AND128BITAES-CBC-OPENSSL
      Algorithm: PBEWITHMD5AND192BITAES-CBC-OPENSSL
      Algorithm: PBEWITHMD5AND256BITAES-CBC-OPENSSL
      Algorithm: PBEWITHMD5AND128BITAES-CBC-OPENSSL
      Algorithm: PBEWITHMD5AND192BITAES-CBC-OPENSSL
      Algorithm: PBEWITHMD5AND256BITAES-CBC-OPENSSL
      Algorithm: PBEWITHSHAAND128BITAES-CBC-BC
      Algorithm: PBEWITHSHAAND192BITAES-CBC-BC
      Algorithm: PBEWITHSHAAND256BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND128BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND192BITAES-CBC-BC
      Algorithm: PBEWITHSHA256AND256BITAES-CBC-BC
      

      这样就很容易了

          StandardPBEByteEncryptor strongBinaryEncryptor = new StandardPBEByteEncryptor();
          strongBinaryEncryptor.setAlgorithm("PBEWITHSHAAND192BITAES-CBC-BC");
          strongBinaryEncryptor.setKeyObtentionIterations(1000);
          strongBinaryEncryptor.setProviderName(BouncyCastleProvider.PROVIDER_NAME);
          strongBinaryEncryptor.setPassword(password);
      
          byte[] encryptedBytes = strongBinaryEncryptor.encrypt(password);
      

      你也可以设置SaltGenerator

      【讨论】:

        猜你喜欢
        • 2015-06-24
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 2013-09-16
        • 2013-04-02
        • 1970-01-01
        • 2012-05-10
        • 2020-09-01
        相关资源
        最近更新 更多