我有一个简单的任务,但我不知道该怎么做。我想使用Bouncycastle在C#中从私钥生成公钥。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
// ...
}
我发现了很多使用此示例:
AsymmetricCipherKeyPair keyPair = (AsymmetricCipherKeyPair)pemReader.ReadObject();
var publicKey = keyPair.Public;
但是会引发异常:
无法将类型为“ Org.BouncyCastle.Crypto.Parameters.RsaPrivateCrtKeyParameters”的对象转换为类型为“ Org.BouncyCastle.Crypto.AsymmetricCipherKeyPair”
要使其正常运行,我需要更改什么?
编辑:
我使用@James K Polk提供的示例,并使其正常工作。
using (var reader = new StringReader(privateKey))
{
var pemReader = new PemReader(reader);
var pemObject = pemReader.ReadObject();
var rsaPrivateCrtKeyParameters = (RsaPrivateCrtKeyParameters)pemObject;
var rsaKeyParameters = new RsaKeyParameters(false, rsaPrivateCrtKeyParameters.Modulus, rsaPrivateCrtKeyParameters.PublicExponent);
}
答案 0 :(得分:1)
如@dlatikay在评论中所述,不一定可以从私钥派生公钥,因此抽象私钥上没有GetPublic
方法或属性。但是,大多数私钥类包含足够的信息,可以轻松派生公钥。这是Bouncycastle RSA私钥的示例:
var rand = new SecureRandom();
var keyGenParams = new RsaKeyGenerationParameters( new BigInteger("65537"), rand, 1024, 64 );
var rsaKeyGen = new RsaKeyPairGenerator();
rsaKeyGen.Init(keyGenParams);
var rsaKeyPair = rsaKeyGen.GenerateKeyPair();
var rsaPriv = (RsaPrivateCrtKeyParameters) rsaKeyPair.Private;
// Make a public from the private
var rsaPub = new RsaKeyParameters(false, rsaPriv.Modulus, rsaPriv.PublicExponent);
此外,请注意RsaPrivateCrtKeyParameters
是RsaKeyParameters
的子类,因此,根据您的使用方式,有可能直接在需要公钥的地方使用RsaPrivateCrtKeyParameters
实例。