使用 BouncyCastle 生成无密码的 AES 密钥

Generate AES key without password using BouncyCastle

我需要生成一个密钥,以便在使用 AES256/CBC

对称加密文件时使用

密钥本身将使用 RSA public/private 加密,因此我不需要应用密码。

在Java中,好像是这样做的as follows:

SecureRandom random = new SecureRandom();
byte[] keyBytes = new byte[32]; //32 Bytes = 256 Bits
random.nextBytes(keyBytes);
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

但是,SecretKeySpec 未在通过 NuGet 提供的 C# BouncyCastle 库中定义。

C# 的等价物是什么?由于我没有使用密码,仅从 SecureRandom(确实存在)中获取下一个 n 个随机字节就足够了吗?

您当然可以使用任何种子良好的 PRNG 来使用 Bouncy Castle KeyParameter class,是的。 KeyParameter class 的处理方式与 SecretKeySpec 大致相同,尽管您不必指定算法。

只要您只使用 AES,就可以直接构建一个 KeyParameter class。但是,存在具有 class 已知弱密钥的对称算法 and/or 对什么是有效密钥的其他限制,例如DESEDE.

如果您的代码需要通用地处理多种算法(或模式),那么您最好使用 Org.BouncyCastle.Security.GeneratorUtilites 为算法获取合适的密钥生成器。同样,ParameterUtilities 在一般情况下是首选,例如用于添加 IV。

同样,您提供的 Java 代码也适用于 AES,但如果您想泛化密码和模式,您应该使用 KeyGenerator 和 AlgorithmParameterGenerator API。

您可以尝试以下解决方案:

using Org.BouncyCastle.Crypto;  
using Org.BouncyCastle.Security; 


CipherKeyGenerator gen = new CipherKeyGenerator();

gen = GeneratorUtilities.GetKeyGenerator("AES256"); // using AES

byte[] k = gen.GenerateKey(); // 256 bit key

注意:GetKeyGenerator 的参数当前为 AES 启动一个 192 位密钥,如果您只是传递它 "AES"。要获得不同的密钥大小,您需要修改参数,如代码示例所示。要获得额外差异的概述,请查看 sourceCode.

中的 GetKeyGenerator-Method