2015-06-26 11 views
8

के साथ ओपनएसएसएल आरएसए हस्ताक्षर मेरे पास एक छोटी रूबी स्क्रिप्ट की समतुल्य खोल स्क्रिप्ट को समझने की कोशिश कर रहा हूं। यह रूबी स्क्रिप्ट है:SHA256 डाइजेस्ट

require 'openssl' 
require 'base64' 

k = OpenSSL::PKey::RSA.new(File.read("key.pem")) 
res = File.read("res.tmp") 
digest = OpenSSL::Digest::SHA256.new 
signature = k.sign(digest,res) 
File.write("foo1.txt",Base64.strict_encode64(signature)) 

यही है। इसमें कुछ डेटा लगता है, इसमें SHA256 हैश हो जाता है, और फिर संकेत मिलता है कि मेरे पास एक निजी कुंजी है। मुझे लगता है कि टर्मिनल पर समकक्ष कमांड होना चाहिए:

openssl sha -sha256 -sign key.pem < res.tmp | base64 -w 0 > foo2.txt 

लेकिन ये एक ही आउटपुट नहीं बनाते हैं। क्या कोई मुझे बता सकता है कि क्यों?

- संपादित करें -

मैं कुछ और जानकारी जोड़ रहा है ताकि लोग अपने कंप्यूटर पर इस पुन: पेश करने यदि ऐसा है तो वांछित कोशिश कर सकते हैं। res.tmp की सामग्री हैं:

This is some sample text. 
This is some sample text. 
This is some sample text. 
This is some more sample text. 
This is some more sample text. 
This is some more sample text. 

निजी कुंजी है (जो नहीं एक निजी कुंजी है कि वास्तव में किसी भी उत्पादन प्रणाली के लिए प्रयोग किया जाता है, बस स्पष्ट है कि है):

-----BEGIN PRIVATE KEY----- 
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALNY2EtJTj78tvnL 
G1v+5HFqn8mZ85AToUqj/n86/eymcMqEjskHAoVmU9FOr+ZsnSxopNvUVLCzDkv6 
w88tUtHGblzFtzJpQrxvtH8VCd2BNUc6Esxx7lmQeCxJMMPnmY2ZkDZuH6L+UsVL 
DbM7LCvJyluo/A3AP68G9YL+XTjFAgMBAAECgYBkJzsyX894UTwFJq0ypJcB1x9A 
P97KGIw72HTorBLdMt1N2tS54lZAFLK98gk8zm6/O/jEYkChJHzZZUIv0gmq+HOG 
CHLyBNsf3BzmBXmwLRIOf54MxwaafysjpHifuYB4Po7G/utvlYqIxg1mBo/KtnMC 
Wl2Enmrunei6gN3SAQJBAN94UfraP7lG50OYWhkcso95xpGrCeoFT64dV9I56FhU 
q4tD6SSeIXj50hvSH2MQMdFBjsUHPIt+X7zw17ywgwUCQQDNdETg4FD3YT1xolWD 
IFEowLlKfNqSaDIQia0dMIzk1/IqOoYhRKH03A97Wae1w/iyMgefyOVvkk+FZUs7 
r0rBAkAnZox1wTNJFIJD/cGs+c1V1K+5EUIPO95/oXbRfxpDMLKKPHAH38WhEdME 
yrhz++/8qCVnAc6f/akdpA01nJ2NAkEArC1GE9aow8fgADz0wMDygt6P6ZacbZmY 
azeVtiKb0KQQM8d75KFpwJQy/UJzQ+aJonw+2282p7vLnJT46XnLgQJALxzSBu0D 
hXIDTAMBpon+zgXjiy0ndiigLDPh1jJyCXrH0tBwj3FN+Br3yxbZT2LmE6PLIaJy 
rkTCKqlnkG2h+w== 
-----END PRIVATE KEY----- 

अब, किसी को भी ऊपर दिए गए आदेशों को चलाने में सक्षम होना चाहिए और एक ही परिणाम प्राप्त करना चाहिए। शेल स्क्रिप्ट इसे इसके आउटपुट के रूप में उत्पन्न करती है:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

पाठ्यक्रम की कोई पिछली नई लाइन के साथ। रूबी स्क्रिप्ट का उत्पादन:

l4BxJyo/GQ0vUF5YR/vO7NtX5Sn/9bGfNHiVGS+W1CMfrwVlCtT0afHERXowx5T8mOiZ90VCJioHMj9Z6ssmfF1SpUbpoo1HYwNBCAfEcIjPLBj4N4KDLpy4gbMZtHEo2B8DZitYLwYDyvkCEudrMiU9b39DqOL+p3pwjJxT5iE= 

बिना किसी पिछली नई लाइन के। मैंने परिणामों को केवल मनुष्यों के लिए प्रस्तुत करने के लिए परिणामों को एन्कोड किया है। वह हिस्सा समस्या नहीं है। असली मुद्दा यह है कि रूबी स्क्रिप्ट और खोल स्क्रिप्ट में openssl के मेरे invocations अलग-अलग चीजें कर रहे हैं। टिप्पणियों में लोग मध्यवर्ती परिणामों के बारे में पूछते रहते हैं। बस स्पष्ट होने के लिए, केवल एक चीज जिसे बेस 64 एन्कोडिंग से पहले कच्चे बाइनरी परिणाम में "मध्यवर्ती परिणाम" माना जा सकता है (और यह मेरे लिए यहां पोस्ट करने के लिए असहनीय और असंभव दोनों होगा)। मैं जो ओपनएसएल कमांड चला रहा हूं वह सिर्फ एक अपारदर्शी कमांड है (दोनों स्क्रिप्ट में), इसलिए मुझे किसी भी मामले में SHA256 हैश तक पहुंच नहीं है। मुझे लगता है कि वह इस आदेश के साथ उत्पन्न होगा:

sha256sum res.tmp 

कौन सा आदेश पंक्ति पर इस देता है:

688a84cb84ce3b203460a2775248a31d4c3e9590a41ba27134dc342c328b8f9c res.tmp 

लेकिन मुझे विश्वास है कि हैश ऊपर वास्तव में दोनों में से किसी के किसी भी मध्यवर्ती परिणाम है नहीं किया जा सकता दो स्क्रिप्ट्स अगर मैं अधिक जानकारी प्रदान कर सकता हूं तो मुझे बताएं। धन्यवाद।

+0

क्या आपको हर बार रूबी स्क्रिप्ट से एक ही परिणाम मिलता है? क्या आपको रूबी स्क्रिप्ट और openssl कमांड से एक ही मध्यवर्ती परिणाम मिलता है? आप किस ओपनएसएल का संस्करण उपयोग कर रहे हैं? –

+0

@EtanReisner हां। दोनों स्क्रिप्ट पूरी तरह से निर्धारक हैं। वे दोनों जब भी दौड़ते हैं, वही परिणाम देते हैं। "इंटरमीडिएट नतीजे" (यदि इसका मतलब है कि कच्चे बाइनरी डेटा बेस 64 एन्कोडेड होने से पहले) हर बार भी वही होता है। मुझे नहीं पता कि कंप्यूटर पर openssl का कौन सा संस्करण है, इन आदेशों को चालू कर रहा था, लेकिन यह केवल उबंटू क्वांटम क्विज़ल रेपो में ही होना चाहिए। –

+0

क्या दो स्क्रिप्ट के बीच मध्यवर्ती चरण समान है?(यही वह चरण है जो अलग-अलग आउटपुट का कारण बन रहा है।) –

उत्तर

0

किसी भी तरह, मैं गलत हो गया, और ऐसा लगता है कि ये दो स्क्रिप्ट वास्तव में एक ही आउटपुट का उत्पादन कर रहे हैं। माफ़ कीजिये।

+0

के लिए अलग है परिस्थितियों को देखते हुए मुझे नहीं लगता कि प्रश्न अब बहुत उपयोगी है, फिर ;-) –

+0

यह सच है । अगर कोई इसे बंद करना या निकालना चाहेगा, तो मैं इसके साथ ठीक होगा। –

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