【问题标题】:How to verify a signature with a public key provided in .pem File?如何使用 .pem 文件中提供的公钥验证签名?
【发布时间】:2015-05-21 15:43:34
【问题描述】:

如何使用 .pem 文件中提供的公钥验证签名?

我使用流动代码:

RSACryptoServiceProvider CrRsa;

var reader21 = File.OpenText(@"C:GTLpublicKey.pem");
var x = new PemReader(reader21);
var y = (RsaKeyParameters)x.ReadObject();

CrRsa = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
RSAParameters pa = new RSAParameters();
pa.Modulus = y.Modulus.ToByteArray();
pa.Exponent = y.Exponent.ToByteArray();
CrRsa.ImportParameters(pa);

y 返回null,导致pa.Modulus = y.Modulus.ToByteArray(); 出现错误

【问题讨论】:

    标签: c# certificate


    【解决方案1】:
    RSACryptoServiceProvider RSAVerifier = new RSACryptoServiceProvider();
    
    //Read public Key From Text File.
    
    StreamReader PubKeyReader = File.OpenText(txtPublicKeyFile.Text);
    
    string publicKey = PubKeyReader.ReadToEnd();
    
    //Adding public key to RSACryptoServiceProvider object.
    
    RSAVerifier.FromXmlString(publicKey);
    
    //Reading the Signature to verify.
    
    FileStream Signature = new FileStream(txtVerifySign.Text, FileMode.Open, FileAccess.Read);
    
    BinaryReader SignatureReader = new BinaryReader(Signature);
    
    byte[] SignatureData = SignatureReader.ReadBytes((int)Signature.Length);
    
    //Reading the Signed File for Verification.
    
    FileStream Verifyfile = new FileStream(txtVerifyFile.Text, FileMode.Open, FileAccess.Read);
    
    BinaryReader VerifyFileReader = new BinaryReader(Verifyfile);
    
    byte[] VerifyFileData = VerifyFileReader.ReadBytes((int)Verifyfile.Length);
    
    //Comparing.
    
    bool isValidsignature = RSAVerifier.VerifyData(VerifyFileData, "SHA1", SignatureData);
    
    if (isValidsignature)
    
    {
    
          Signature.Close();
    
          Verifyfile.Close();
    
    }
    
    else
    
    {
    
    
        Signature.Close();
    
        Verifyfile.Close();
    
    }
    

    【讨论】:

    • 保存用于签名的证书的公钥,稍后用于验证。
    【解决方案2】:

    我不同意建议的答案。

    RSACryptoServiceProvider 无法通过“FromXMLString”读取 PEM 文件。

    但是,它让我想到了将 PEM 文件导出为 XML。

    我找到了这个网站that makes the online conversion

    然后它完美地工作了!

    【讨论】:

    • 我不确定它是否能回答这个问题,但它是一个很好的资源
    【解决方案3】:

    不确定,但可能是您忘记了反斜杠的问题:

    var reader21 = File.OpenText(@"C:\GTLpublicKey.pem");
    //                               ^
    

    【讨论】:

    • var reader21 = File.OpenText(@"C:GTLpublicKey.pem");工作正常
    • var y = (RsaKeyParameters)x.ReadObject();我不知道为什么这部分返回一个空值。
    • 我认为问题在于文件不存在,是由于缺少反斜杠造成的。普通文件名不能包含: 符号。为驱动器名称保留的 AFIK。
    • 是的,你是对的。但是,虽然我使用代码 @"C:GTLpublicKey.pem",但它的工作方式不同。它从桌面读取文件 GTLpublicKey.pem。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2013-08-17
    • 2012-07-26
    • 2013-05-28
    • 1970-01-01
    • 2019-04-13
    相关资源
    最近更新 更多