当前位置: 首页 > 编程语言 > C#

使用Base64编码的公钥来validationRSA签名分享

时间:2023-04-10 22:35:14 C#

使用Base64编码的公钥来validationRSA签名简而言之,这是我的问题:privatestringpublicKeyString="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFOGwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWpbY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5yGPhGAAmqYrm8YiupwQIDAQAB";/*Sometransformationrequired,usingpublicKeyStringtoinitiateanewRSACryptoServiceProviderobject*///fornow:RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();byte[]selfComputedHash=newbyte[];//leftoutoftheexamplebyte[]signature=newbyte[];boolresult=rsa.VerifyHash(selfComputedHash,CryptoConfig.MapNameToOID("SHA1"),signature);Asyoucansee,theproblemistostartanewRSACryptoServiceProviderwiththegivenBase64encodedpublickeystring.I'vebeenabletoinstantiatewithanobjectRSAParametersthatloadsabyte[]fromModulusandExponentforthispublickeystringusingOpenSSLshellcommands.Butsincethispublickeymaychangeinthefuture,Iwanttobeabletostoreitinthedatabaseinitsoriginalform.Theremustbeamorestraightforwardwaytosolvethisproblem.到目前为止我读过的很多例子都通过将生成的私钥和公钥导入和导出密钥容器对象并在同一段代码中使用它来避免这个问题,所以密钥不会“转移”.某些字符串形式内存不足。有人在StackOverflow和其他网站上表达了同样的问题,但我还没有找到满意的答案。任何想法都非常受欢迎。背景信息:我的通信合作伙伴根据可变长度输入字符串计算20字节的SHA1散列,该输入字符串由包含在ASCII编码消息的多个字段中的信息组成。然后使用我合作伙伴的私钥对该散列进行RSA签名,并与ASCII消息一起发送给我。一旦它到达,我自己计算SHA1散列,使用来自ASCII消息的相同字段,然后尝试通过调用VerifyHash来验证这些字段没有被更改。密钥以两种形式提供:常规和“noNL”。noNL版本包含在上面的代码中,常规版本是这样的:-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFOGwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWpbY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5yGPhGAAmqYrm8YiupwQIDAQAB-----ENDPUBLICKEY-----您该字符串是SubjectPublicKeyInfo的base64编码。你可以使用Bouncycastle.net破解它:byte[]publicKeyBytes=Convert.FromBase64String(publicKeyString);AsymmetricKeyParameterasymmetricKeyParameter=PublicKeyFactory.CreateKey(publicKeyBytes);RsaKeyParametersrsaKeyParameters=(RsaKeyParameters)非对称密钥参数;RSAParametersrsaParameters=newRSAParameters();rsaParameters.Modulus=rsaKeyParameters.Modulus.ToByteArrayUnsigned();rsaParameters.Exponent=rsaKeyParameters.Exponent.ToByteArrayUnsigned();RSACryptoServiceProviderrsa=newRSACryptoServiceProvider();rsa.ImportParameters(rsaParameters);第一个base64只是一些二进制数据的编码。以二进制形式对RSA公钥进行编码的方法不止一种。但是,如果您从OpenSSL获得它,它可能是DER编码的RSAPublicKey结构。RSAPublicKey::=SEQUENCE{modulusINTEGER,--npublicExponentINTEGER}--e通常,您需要一个ASN.1解码器,Mono.Security.dll提供了一个,但是对于这样一个简单的结构,您可能需要手动完成,因为ASN.1基本上是一个标签、长度和一个值。如果你的合作伙伴也使用.NET,他/她可以从Mono的makecerthttps://github.com/mono/mono/blob/bf55818da11240bd108dc51b374fae3d3b5482ce/mcs/tools/security/makecert.cs导出证书文件并直接发送给你。在这种情况下,您可以轻松加载证书而不是原始字节,http://www.lextm.com/2012/02/simple-publicprivate-key-signing-sample-code/以上是C#学习教程:使用Base64编码的公钥用于验证RSA签名共享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: