2016-11-22 97 views
0

我想验证我的签名。我使用此代码验证数字签名

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

我不知道这样我生成公钥的问题或迹象已经问题。在符号方法中,我使用sh1和pkcs1,但在验证中我只找到sh1。

每个人都可以帮助我吗?

+0

**如果您的计算机上有任何**格式是字节数组格式。你需要更具体,并告诉我们你的尝试。以十六进制显示所有字节将是一个好主意;这是一个* public *键,对吗? –

+0

谢谢你回答我。是的,我将公钥存储在sql server中作为图像。我想获取它并将其转换为rsa参数。我看不到公钥在db来显示你,因为它是像image.and是的,它是在十六进制格式 – Fatemeh

回答

0

你保存到数据库中的是什么?只是模数值?

RSA公钥有两个字段,Modulus和Exponent。他们都需要做一个成功的关键导入和操作。

在99.999993%有史以来创建的指数值的RSA密钥是new byte[] { 0x01, 0x00, 0x01 };所以你可以几乎总是摆脱只存储模数值,并假设Exponent是。

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

因此,其实这可以归结为:

  • 您需要设置指数(正确的值)
  • 你需要确保你的逻辑输入您的出口逻辑相匹配,以确保您加载/将相同的东西保存到相同的地方。
+0

谢谢answer.I只存储模块值db – Fatemeh