Bouncy Castle,RSA:将密钥转换为String格式
我在我的C#项目中使用RSA(Bouncy Castle API)。 我用这个方法生成了密钥对:
RsaKeyPairGenerator r = new RsaKeyPairGenerator(); r.Init(new KeyGenerationParameters(new SecureRandom(), 1024)); AsymmetricCipherKeyPair keys = r.GenerateKeyPair(); AsymmetricKeyParameter private_key = keys.Private; AsymmetricKeyParameter public_key = keys.Public;
现在我想将它们保存在txt文件中,但问题是我无法将它们转换为字符串格式。 我在另一篇文章中读到必须使用以下序列化密钥:
PrivateKeyInfo k = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_key); byte[] serializedKey = k.ToAsn1Object().GetDerEncoded();
这是正确的方法吗? 如果是,那我该怎么办? 只需将它们从byte []转换为String?
您还可以使用PemWriter以PEM格式存储它们:
TextWriter textWriter = new StringWriter(); PemWriter pemWriter = new PemWriter(textWriter); pemWriter.WriteObject(keys.Private); pemWriter.Writer.Flush(); string privateKey = textWriter.ToString();
现在privateKey包含这样的内容:
-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDFhB3xI1AzSMsKvt7rZ7gp2o/vd49zON89iL1ENvKkph7oFXa2 ew/hjzbAV33lHnFFlA/vA5SDCbggRyU1/SmjfuPJFEzFbgcPLuO1Sw6z+bWXiIFp QNCOTIw11c0fbwk+kB2y4E1OkLv5f9atlNlekb4wBn8bMbFYtu6LGWjkFQIDAQAB AoGANPoMteLM3hSGMSmkzOsS4Fb5CDe/SB5W8kA805ERX8wWuhUXtDYpukwZWVme MNgLdagS5f7F1KfEtROgDW0Lv4/T/FWAbpgh8O2CPKYDY4ZXl8tmRH9dtYn/824l veLxdgNjHwo5OMvuTSDMjC3tbg2UA3kmV4VAm5QotlRinUECQQDo4zvI5e81zWnS kNrUARX80t432MOZyr0RvAaVJfBNQpJl0H0xp5LKP74hvPVO9WdJvJ0M4Z4QrmGO bm2Hsfz5AkEA2R469YXxgPLDg/LvUQqfrl8Ji9+rip7eQP7iS/dt66NMS31/HymT +HscEZ3qGlnQuyyyRR2rGQdhdjU42HNy/QJBAKbPTF1DxSmGbovyUauU84jaCW17 B++6dd6kDRr7x7mvO2lOAr50RwIy0h8cV6EsycTZIqy9VhigryP0GOQfKxECQA8T uVZpab7hnNAh45qGGVabhOcwrhHfPGHZEU/jK7/sRBUN7vD0CzF7IxTaGXKhAAyv auW/zKzdRVhXE858HeUCQQCGaaAg8GwM0qIS0nHRTLldu4hIGjKn7Sk0Z46Plfwr oqPCtuP4ehX85EIhqCcoFnG6Ttr6AxSgNMZvErVxDBiD -----END RSA PRIVATE KEY-----
好吧,我不知道RSA特定的一面,但是一旦你有一个不透明的二进制字符串(即它可能包含任意数据),文本转换的最佳选择是Convert.ToBase64String(byte[])
你哪个可以使用Convert.FromBase64String(string)
进行反转。
不要使用Encoding.GetString(byte[])
和Encoding.GetBytes(string)
– 二进制数据不是特定编码中的文本, 不应该这样对待。 如果你试试这个,你几乎肯定会丢失数据。
这可能是您正在寻找的: http : //www.rahulsingla.com/blog/2011/04/serializing-deserializing-rsa-public-private-keys-generated-using-bounty-castle-library
如果将bouncycastle证书转换为.net证书。 执行此操作的function是在bouncycastle lib中(我相信它在一个名为DotNetUtilities的类中)。 RSACryptoServiceProvider具有以下function:
ToXmlString(bool includePrivateKey).
如果您希望包含序列化为base64的所有组件的私钥分别为exp64,exponent,modulus和d(私有指数),那么它将为您提供证书的x表示。
请尝试以下方法
RsaKeyPairGenerator rsaKeyPairGenerator = new RsaKeyPairGenerator(); rsaKeyPairGenerator.Init(new KeyGenerationParameters(new SecureRandom(), XXX)); AsymmetricCipherKeyPair keys = rsaKeyPairGenerator.GenerateKeyPair(); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keys.Private); // Write out an RSA private key with it's asscociated information as described in PKCS8. byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded(); // Convert to Base64 .. string serializedPrivateString = Convert.ToBase64String(serializedPrivateBytes); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keys.Public); byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); string serializedPublicString = Convert.ToBase64String(serializedPublicBytes);
- 在C#中使用BouncyCastle构建证书链
- 将RSA公钥转换为具有Bouncy Castle的RFC 4716公钥
- 使用C#中的Bouncy CastlevalidationECDSA签名
- Bouncycastle PGP解密期间的PartialInputStream
- 无法将带有私钥的生成证书导出到.net 4.0 / 4.5中的字节数组
- JavaScript中的加密不会在C#中解密
- 加密BouncyCastle RSA密钥对并存储在SQL2008数据库中
- 在.NET上使用RSA私钥签名字符串?
- 使用BouncyCastle AesFastEngine加密C#AesCryptoServiceProvider加密数据