2014-01-09 112 views
14

當談到密碼學和這些事情時,我是一個全新手。我沒有(也不想)知道SHA256和RSA的細節。我「知道」他們做了什麼,而不知道他們做了什麼,現在就足夠了。SHA256withRSA它做了什麼以及按什麼順序?

我在想什麼「SHA256withRSA」算法(如果你可以稱之爲的話)實際上以什麼順序進行。例如,它是否使用SHA256對數據進行散列,然後使用RSA對其進行加密,或者反之亦然,還是其他?

的原因,我問的是,因爲我想要做的相當於Java的:

Signature.getInstance("SHA256withRSA") 
signature.initSign(privateKey); //privateKey == a key extracted from a .p12 file 

在iOS上的Objective-C。我似乎無法找到任何能夠完全實現這個功能的東西,因此我問,我可以將數據散列(SHA256),然後對其進行加密(RSA)(反之亦然),並獲得相同的行爲?

做這種事情的建議解決方案是什麼?

謝謝!

編輯: 我沒有提到要我簽字使用由做得到私鑰數據:

KeyStore keystore = KeyStore.getInstance("PKCS12"); 
keystore.load(new FileInputStream(new File(filename)), password.toCharArray()); 
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray()); 

其中,文件名是舉例說:「/somewhere/mykey.p12」。

回答

15

"SHA256withRSA"在使用SHA256計算數據散列之後,實現PKCS#1 v1.5填充和模式冪運算,其正式名稱爲RSASSA-PKCS1-v1_5

所以一般的順序是:

  1. 散列;
  2. 填充簽名生成的散列;
  3. 使用私有指數和模數的模冪運算。

用於加密和簽名生成的填充不同,因此使用加密可能會導致錯誤的簽名。


PKCS#1 v1.5填充方案已被PSS取代。對於新的協議,建議使用PSS方案。對於RSA,存在一個非常可讀的公共標準。這個標準也被用作RFC 3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1(這基本上是一個副本)的基礎。


關於iOS中的填充,請檢查Thomas Pornin的this answer。基本上,您應該創建SHA-256哈希,以靜態數據塊(在PKCS#1規範中定義)爲前綴,然後使用SecKeyRawSign使用kSecPaddingPKCS1

爲方便起見,PKCS#1定義的數據塊需要以十六進制符號爲SHA-256前綴(在標準文檔中找到它可能有點困難,它在section 9.2的註釋中):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 

注:

  • 上述步驟不包括從字節轉換爲整數,反之亦然。原始RSA操作的結果一般轉換爲無符號大端編碼,其大小與字節的模數相同(通常與密鑰大小相同,因爲密鑰大小已經是8的倍數)。這些轉換在RFC中稱爲I2OSP和OS2IP。
+0

感謝您的詳細解答!我沒有提到包含所使用的私鑰的文件是.p12文件,並且根據我的理解,使用PKCS12時,會有什麼不同? (我將編輯我的問題以包含此信息) – Whyser

+0

容器格式不應該對簽名有所影響,所以這是一個額外的問題。請檢查http://stackoverflow.com/questions/10025807/how-to-make-a-valid-p12-file-to-be-correctly-imported-by-secpkcs12import是否包含您需要的信息。 –

+0

謝謝!你已經回答了我所問的問題,並會接受你的回答。您提供的鏈接對我有所幫助,但我仍然無法使用obj-c中的密鑰簽名數據。任何指針?或者我應該開始一個新的問題?再次感謝你! – Whyser

相關問題