日期:2014-05-16  浏览次数:20992 次

RSA签名验证
本帖最后由 nuptgis 于 2014-03-11 21:38:44 编辑
公钥:
publickey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8rPqGGsar+BWI7vAtaaDOqphy41j5186hCU9DcchV4HWiv0HvQ3KXAEqHfZiAHZSyMSRMmDZVnqJwCVWFvKUPqU1RsCPZ9Imk+9ZXVkM3DDdw74v/s6YMNx8cTuxybRCJUfOKbyC79cnHgmQqqkODv+EnprBtNKE4k8g90jNmbwIDAQAB";


用到的验证方法:
 
  
        /// <summary>
        /// 验证RSA签名
        /// </summary>
        /// <param name="str_DataToVerify">待签名的字符串</param>
        /// <param name="str_SignedData">对方生成的RSA签名</param>
        /// <param name="str_Public_Key">对方公钥</param>
        public static bool VerifySignedHash(string str_DataToVerify, string str_SignedData, string str_Public_Key)
        {

            byte[] SignedData = Convert.FromBase64String(str_SignedData);
            ASCIIEncoding ByteConverter = new ASCIIEncoding();
            byte[] DataToVerify = ByteConverter.GetBytes(str_DataToVerify);
            try
            {
                RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
                byte[] pubKeyBytes =  Convert.FromBase64String(str_Public_Key);
                RSAalg.ImportCspBlob(pubKeyBytes);
                return RSAalg.VerifyData(DataToVerify, new SHA1CryptoServiceProvider(), SignedData); 
            }
            catch (CryptographicException e)
            {
                return false;
            }
        }

 其中RSAalg.ImportCspBlob(pubKeyBytes);报错提示:不正确的提供程序版本。
 请问是否是解析公钥这块有问题?如能解决,给出代码示例。

------解决方案--------------------
你例子中的publicKey用的是ASN.1 DER编码,因此不能直接用ImportCspBlob(它使用另外一种格式)。

你可以用在线工具进行解码:
http://lapo.it/asn1js/

得出的结果类似:

SEQUENCE(2 elem)
--SEQUENCE(2 elem)
----OBJECT IDENTIFIER 1.2.840.113549.1.1.1
----NULL
--BIT STRING(1 elem)
----SEQUENCE(2 elem)
------INTEGER(1024 bit) 1324925806459412787721713702712958489781723…
------INTEGER 65537


其中最后的65537就是publicKey中的Exponent,而那个1024bit的数据就是publicKey中的Modulus。

如果是实时解码,可能你要