मैं कुछ आरएसए हस्ताक्षर सत्यापित करने के लिए कोड लिखने की कोशिश कर रहा हूं। हस्ताक्षर OpenSSL कमांड लाइन उपकरण का उपयोग कर बनाया गया था, इस कमांड लाइन के बराबर का उपयोग कर:ओपनएसएसएल आरएसए हस्ताक्षर सत्यापन: हैश और पैडिंग?
openssl dgst -sha1 -sign private_key_file.pem <binary_data_file> sig
मैं libtomcrypt
उपयोग करने के लिए क्या करने की कोशिश कर रहा हूँ की पुष्टि:
यहाँ है 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_idx
libtomcrypt
के साथ शामिल उदाहरण कोड से स्पष्ट है; यह समर्थित हैश एल्गोरिदम के एक तालिका में एक सूचकांक है, और मैं सही मान इस कोड स्निपेट के साथ उपयोग करने के लिए मिल सकता है: 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
तर्क निर्दिष्ट करने के लिए की जरूरत है।
वास्तव में एक उत्कृष्ट उत्तर के लिए धन्यवाद। आपने मुझे यह देखने के लिए उपकरण दिए कि नमक नहीं है। अब मेरे पास हस्ताक्षर सत्यापित करने के लिए 'libtomcrypt' कोड है! +1 और उत्तर स्वीकार किया गया। – steveha
@steveha: धन्यवाद! आप 'rsautl'' के संबंध में बाद में पोस्ट देखना भी चाह सकते हैं: http://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst –