使用 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
我需要生成一个密钥,以便在使用 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