简而言之,这是我的问题:
private string publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFOGwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWpbY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5yGPhGAAmqYrm8YiupwQIDAQAB";
/* Some transformation required, using publicKeyString to initiate a new RSACryptoServiceProvider object
*/
//for now:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] selfComputedHash = new byte[]; //left out of the example
byte[] signature = new byte[];
bool result = rsa.VerifyHash(selfComputedHash, CryptoConfig.MapNameToOID("SHA1"), signature);
如您所见,问题是使用给定的Base64编码公钥字符串启动一个新的RSACryptoServiceProvider。我已经能够使用对象RSAParameters进行示例化,使用OpenSSL shell命令从这个公钥字符串中导出的Modulus和Exponent加载了byte[]。但是由于这个公钥将来可能会改变,我希望能够将其以原始形式存储在数据库中。一定有更直接的方法来处理这件事。
到目前为止,我读过的很多例子都避免了这个问题,它们将生成的私钥和公钥导出到密钥容器对象,并从密钥容器对象导入私钥和公钥,然后在同一段代码中使用它,这样就不会将密钥以某种字符串形式“传输”到内存之外。有些人在StackOverflow和其他网站上表达了同样的问题,但我还没有找到令人满意的答案。
任何想法都比欢迎。
背景信息:我的通信伙伴从一个可变长度的输入字符串中计算出一个20字节的SHA1哈希,该字符串由ASCII编码消息的几个字段中包含的信息组成。然后用我的合作伙伴的私钥对该哈希进行RSA签名,并将其与ASCII消息一起发送给我。到达后,我自己计算SHA1哈希,使用ASCII消息中的相同字段,然后尝试通过调用VerifyHash来验证这些字段是否未被更改。
密钥以两种形式提供:常规和“非NL”。noNL版本包含在上面的代码中,常规版本是这样的:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFO
GwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWp
bY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5y
GPhGAAmqYrm8YiupwQIDAQAB
-----END PUBLIC KEY-----
4条答案
按热度按时间olhwl3o21#
字符串是SubjectPublicKeyInfo的base64编码。您可以使用Bouncycastle.net来解码它,如下所示:
pjngdqdw2#
首先,base64只是一些二进制数据的编码。RSA公钥的二进制编码方式不止一种。但是,如果你从OpenSSL得到这个,它可能是一个DER编码的
RSAPublicKey
结构。一般来说,你需要一个ASN.1解码器,Mono.Security.dll提供了one,但是对于这样一个简单的结构,你可能想手工完成,因为ASN.1基本上是一个Tag,Length和Value。
ndasle7k3#
在没有外部库的情况下,您可以从DER编码的X.509公钥中获取
exponent
和modulus
,如下所示:参见https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rsa.importsubjectpublickeyinfo?view=net-7.0
ie3xauqp4#
如果您的合作伙伴也使用.NET,他/她可以从Mono的makecert https://github.com/mono/mono/blob/bf55818da11240bd108dc51b374fae3d3b5482ce/mcs/tools/security/makecert.cs派生来生成证书文件并直接发送给您。
在这种情况下,您可以轻松地加载证书而不是原始字节,
http://www.lextm.com/2012/02/simple-publicprivate-key-signing-sample-code/