2016-11-22 119 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