验证数字签名

时间:2016-11-22 05:27:34

标签: c# cryptography rsa digital-signature

我想验证我的签名。我用这个代码

 var encoder = new UTF8Encoding();
  byte[] bytesToVerify = encoder.GetBytes(LoginChallenge);
 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
 RSAKeyInfo.Modulus = publickey1;
 rsa.ImportParameters(RSAKeyInfo);
  bool suc = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID("SHA1"), signedBytes);

我有字节数组格式的公钥。它在我的数据库中。像这样

enter image description here

总是suc = false。我确定bytetoverify与方法符号中的输入值具有相同的值。

我的签名方法:

 Signature signature=Signature.getInstance(Signature.ALG_RSA_SHA_PKCS1,false);
      signature.init(thePrivateKey,Signature.MODE_SIGN);
      signLength=signature.sign(buffer,(short)(ISO7816.OFFSET_CDATA & 0xFF), inputlength, buffer, (short)(0));

      apdu.setOutgoingAndSend((short)0,signLength);

我不知道我这样生成公钥是问题还是标志有问题。在sign方法中我使用sh1和pkcs1,但在验证中我只找到sh1。

每个人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您将哪些内容保存到数据库中?只是模数值?

RSA公钥有两个字段,Modulus和Exponent。他们都需要成功进行密钥导入和操作。

在99.999993%的RSA密钥中创建的Exponent值为new byte[] { 0x01, 0x00, 0x01 };所以你几乎总是可以只存储模数值,并假设Exponent是什么。

为获得最佳效果,请不要假设。或者,如果其指数值不是0x010001,则至少在注册时拒绝密钥。

所以这真的归结为:

  • 您需要设置指数(到正确的值)
  • 您需要确保导入逻辑与导出逻辑匹配,以确保您将相同的内容加载/保存到相同的位置。