验证数字签名

verify 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);

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

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);

我不知道我用这种方式生成的 public 密钥是有问题还是符号有问题。在符号方法中我使用 sh1 和 pkcs1 但在验证中我只找到 sh1.

每个人都可以帮助我吗?

你在数据库中保存了什么?只是模数值?

RSA public 密钥有两个字段,模数和指数。他们都需要进行成功的密钥导入和操作。

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

为了获得最佳结果,请不要假设。或者,至少,如果指数值不是 0x010001.

,则拒绝注册密钥

所以这实际上归结为:

  • 您需要设置指数(为正确的值)
  • 您需要确保您的导入逻辑与导出逻辑相匹配,以确保您loading/saving将相同的东西放入相同的地方。