2013-04-25 8 views
5

मैं कुछ आरएसए हस्ताक्षर सत्यापित करने के लिए कोड लिखने की कोशिश कर रहा हूं। हस्ताक्षर OpenSSL कमांड लाइन उपकरण का उपयोग कर बनाया गया था, इस कमांड लाइन के बराबर का उपयोग कर:ओपनएसएसएल आरएसए हस्ताक्षर सत्यापन: हैश और पैडिंग?

openssl dgst -sha1 -sign private_key_file.pem <binary_data_file> sig 

मैं libtomcrypt उपयोग करने के लिए क्या करने की कोशिश कर रहा हूँ की पुष्टि:

http://www.libtom.org/

यहाँ है libtomcrypt में आरएसए सत्यापन समारोह के हस्ताक्षर बुला:

int rsa_verify_hash_ex(
    const unsigned char *sig, unsigned long siglen, // signature to verify 
    const unsigned char *hash, unsigned long hashlen, // hash value to check against sig 
    int padding, // defined constant value, see below 
    int hash_idx, // identifies which hash algorithm, see below 
    unsigned long saltlen, // specify salt length, see below 
    int *stat, // output parameter, returns whether verify succeeded or not 
    rsa_key *key); // RSA public key to use for verify 

यह फ़ंक्शन 0 यदि रिटर्न यह त्रुटि के बिना काम करता है, अन्यथा एक त्रुटि कोड देता है। यदि यह त्रुटि के बिना संचालित होता है, तो stat आउटपुट पैरामीटर इंगित करता है कि हस्ताक्षर सत्यापित है या नहीं।

अधिकांश तर्क सीधे प्रतीत होते हैं: जांच करने के लिए हस्ताक्षर में पास करें, इसकी तुलना करने के लिए उपयोग करने के लिए हैश मान, और चेक के लिए उपयोग करने के लिए आरएसए कुंजी। hash_idxlibtomcrypt के साथ शामिल उदाहरण कोड से स्पष्ट है; यह समर्थित हैश एल्गोरिदम के एक तालिका में एक सूचकांक है, और मैं सही मान इस कोड स्निपेट के साथ उपयोग करने के लिए मिल सकता है: hash_idx = find_hash("sha1")

लेकिन मैं padding और saltlen मूल्यों के बारे में सोच रहा हूँ। padding मुझे बहुत ज्यादा चिंता नहीं करता है, क्योंकि केवल दो संभावित मूल्य हैं, और मैं बस उन दोनों को आजमा सकता हूं। लेकिन मुझे saltlen के लिए क्या पास करना चाहिए?

आरएसए सत्यापन के लिए ओपनएसएसएल कार्यों के लिए ओपनएसएसएल दस्तावेज saltlen पैरामीटर नहीं दिखाता है। openssl dgst के लिए मैन पेज (यानी man dgst का परिणाम) नमक पर चर्चा नहीं करता है।

तो मेरे सवालों का:

  • मैं कैसे सही नमक लंबाई का उपयोग निर्धारित कर सकते हैं?

    • libtomcrypt भी एक समारोह pkcs_1_pss_decode() कहा जाता है: (stdin)=

    (Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different? मैं खोज StackOverflow द्वारा कि (stdin)= बात पाया:)

  • OpenSSL के dgst आदेश जैसे इनपुट में किसी भी अतिरिक्त सामान सम्मिलित करता है, जिसे "एक पीएसएस एन्कोडेड हस्ताक्षर ब्लॉक डीकोड करने के लिए दस्तावेज किया गया है"। क्या कोई मौका है कि यह वह कार्य है जिसे मुझे कॉल करने की ज़रूरत है?

किसी भी मदद के लिए धन्यवाद जो आप मुझे दे सकते हैं।

संपादित करें: @ जोनाथन बेन-ग्राहम से नीचे दी गई सहायता के लिए धन्यवाद, मैं आज यह काम करने में सक्षम था। मेरे प्रश्नों के उत्तर क्रमशः हैं:

  • नमक के लिए लंबाई 0 का उपयोग करें, बिल्कुल नमक नहीं।
  • नहीं जो OpenSSL ऐसे (stdin)= रूप
  • मैं rsa_verify_hash_ex() कॉल करने के लिए की जरूरत है इसके अलावा कुछ भी सम्मिलित नहीं था, और मैं LTC_LTC_PKCS_1_V1_5 रूप padding तर्क निर्दिष्ट करने के लिए की जरूरत है।

उत्तर

7

कोई नमक:

पहले, अपने डेटा का एक द्विआधारी SHA1 हैश उत्पन्न:

openssl dgst -sha1 -binary -out hash1 some_data_file 

यह एक SHA1 हैश है या पचाने। फ़ाइल some_data_file फ़ाइल में कोई नमक नहीं है। openssl dgst -sha1 स्वयं नमक नहीं जोड़ता है। ध्यान दें कि आउटपुट फ़ाइल केवल 20 बाइट SHA1 हैश के साथ नमक नहीं है। यदि नमक थे, तो हैश को इसमें शामिल करना होगा, शायद एसएचए 1 हैश रखने वाले पिछले 20 बाइट्स से पहले तैयार किया गया है।

इसके बाद, अपने निजी कुंजी के साथ SHA1 हैश फ़ाइल hash1 साइन इन करें:

openssl pkeyutl -sign -in hash1 -inkey privkey.pem -pkeyopt digest:sha1 -out sig1 

अब हस्ताक्षर some_data_fileopenssl dgst साथ:

diff sig1 sig2 
:

openssl dgst -sha1 -sign privkey.pem <some_data_file> sig2 

अंत में, दो हस्ताक्षरों की तुलना

और आपको देखना चाहिए कि वे हैं वही। यह हमें बताता है कि कोई नमक वाले फ़ाइल के कच्चे SHA1 हैश पर हस्ताक्षर करना फ़ाइल पर हस्ताक्षर करने के लिए openssl dgst -sha1 -sign कमांड का उपयोग करने जैसा ही है, इसलिए यह होना चाहिए कि openssl dgst -sha1 -sign कमांड ने sig2 के लिए SHA1 हैश उत्पन्न करते समय भी किसी भी नमक का उपयोग नहीं किया।

भी ध्यान रखें कि आप पदावनत rsautl का उपयोग कर एक ही परिणाम हासिल नहीं कर सकते:

openssl rsautl -sign -in hash1 -inkey privkey.pem -out sig1 

बजाय openssl pkeyutl, जाहिरा तौर पर क्योंकि openssl rsautl -sign उत्पादन में एन्क्रिप्टेड पाठ के साथ-साथ हस्ताक्षर भी शामिल है। विवरण के लिए this SE post देखें।

+0

वास्तव में एक उत्कृष्ट उत्तर के लिए धन्यवाद। आपने मुझे यह देखने के लिए उपकरण दिए कि नमक नहीं है। अब मेरे पास हस्ताक्षर सत्यापित करने के लिए 'libtomcrypt' कोड है! +1 और उत्तर स्वीकार किया गया। – steveha

+0

@steveha: धन्यवाद! आप 'rsautl'' के संबंध में बाद में पोस्ट देखना भी चाह सकते हैं: http://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst –

3

जोर देने के लिए एक बात: वास्तविक डेटा के बजाय हैश पास करना सुनिश्चित करें। उसने मुझे कुछ समय के लिए फेंक दिया। यहां एक स्निपेट है जो काम करता है (लेकिन sha256 का उपयोग करें):

void 
verify_tomcrypt(unsigned char *keyblob, size_t klen, 
       unsigned char *payload, size_t dlen, 
       unsigned char *signature, size_t slen) 
{ 
    rsa_key key; 
    int stat; 
    unsigned long len; 
    unsigned char digest2[SHA256_DIGEST_LENGTH]; 

    ltc_mp = ltm_desc; 
    register_hash(&sha256_desc); 

    /* try reading the key */ 
    if (rsa_import(keyblob, klen, &key) != CRYPT_OK) { 
     printf("Error reading key\n"); 
     exit(-1); 
    } 

    int hash_idx = find_hash("sha256"); 
    if (hash_idx == -1) { 
     printf("LTC_SHA256 not found...?\n"); 
     exit(-1); 
    } 
    len = sizeof(digest2); 
    if (hash_memory(hash_idx, payload, dlen, digest2, &len) != CRYPT_OK) { 
     printf("sha256 fails...?\n"); 
     exit(-1); 
    } 

    if (rsa_verify_hash_ex(signature, slen, digest2, sizeof(digest2), LTC_LTC_PKCS_1_V1_5, hash_idx, 0, &stat, &key) == CRYPT_OK) { 
     if (stat == 1) 
      printf("Tomcrypt: Signature OK!\n"); 
     else 
      printf("Tomcrypt: Signature NOK?\n"); 
    } else { 
     printf("Tomcrypt: Signature error\n"); 
    } 
} 
+0

नमूना कोड के लिए धन्यवाद। –

+0

मुझे एक विशिष्ट आरएसए सिग चेक के लिए 'CRYPT_PK_INVALID_SIZE' मिल रहा है। क्या आपको समस्या है? यह त्रुटि 'rsa_verify_hash_ex' द्वारा लौटा दी गई है –

संबंधित मुद्दे