2015-06-23 6 views
5

के साथ सत्यापित नहीं कर सकता मैं ओपनएसएसएल का उपयोग कर अपने उबंटू मशीन पर एक संदेश पर हस्ताक्षर करने के लिए SHA256 और RSA का उपयोग कर रहा हूं। मेरा लक्ष्य एंड्रॉइड के जावा का उपयोग कर एंड्रॉइड पर इस संदेश को सत्यापित करना है।ओपनएसएसएल का उपयोग कर हस्ताक्षरित संदेश; एंड्रॉइड जावा

निम्न कमांड ubuntu पर इस्तेमाल किया गया:

openssl genrsa -out private.pem 1024 
openssl rsa -in private.pem -out public.pem -outform PEM -pubout 
echo 'foobar' > data.txt 
openssl dgst -sha256 <data.txt> hash 
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature 
openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der 
openssl enc -base64 -in signature -out base64_signature 

मैं अब चाबियाँ बनाया है,, संदेश हस्ताक्षरित सार्वजनिक कुंजी है कि जावा में पहुँचा जा में सक्षम होना चाहिए के लिए एक .der फ़ाइल बनाई और संदेश इनकोडिंग बेस 64 के साथ। फिर मैं अपने डिवाइस पर .der सार्वजनिक कुंजी डालता हूं और सफलतापूर्वक कक्षा पब्लिककी में कुंजी लोड करता हूं।

public static boolean verify(PublicKey publicKey,String data,String verification){ 
    java.security.Signature sig; 
    try { 
     sig = java.security.Signature.getInstance("SHA256WithRSA"); 
     sig.initVerify(publicKey); 
     try { 
      sig.update(verification.getBytes()); 
     } catch (Exception e) { 
      ... 
     } 

     if (!sig.verify(Base64.decode(data, Base64.DEFAULT))) { 
      return false; 
     } 
     return true; 
    } 
    catch .... 
    return false; 
} 

पैरामीटर विधि बुला जब:

इस विधि संदेश सत्यापित करने के लिए प्रयोग किया जाता है

verify(PublicKey, Base64 encoded data in a String that is to be verified, "foobar"); 

जाहिर सत्यापन विफल रहता है, लेकिन मैं क्यों नहीं समझ सकता। मुझे लगता है कि इसे एन्कोडिंग (?) के साथ कुछ करना है।


अद्यतन! इसलिए मैंने Base64.decode(data, Base64.DEFAULT)) के परिणामों को एक फ़ाइल में लिखने में कामयाब रहे और हेक्सेडिटर का उपयोग करके मूल हस्ताक्षर फ़ाइल के साथ इसकी तुलना की। पूरी तरह से अलग!

+0

टेक्स्ट एन्कोडिंग एक समस्या हो सकती है। आप इसे अपने इस्तेमाल किए गए 'सत्यापन' का SAH256 संदेश डिज़ाइन बनाकर देख सकते हैं और ओपनएसएसएल हैश के साथ आउटपुट की तुलना कर सकते हैं। आप जावा में आरएसए/ईसीबी/नोपैडिंग के साथ इसे डिक्रिप्ट करके अपने हस्ताक्षर की "सामग्री" भी देख सकते हैं। – Robert

उत्तर

6

जावा उत्पादन करता है और थोड़ा अलग रूप में हस्ताक्षर प्राप्त करने की अपेक्षा करता है। संदेश का हैश डीईआर में एन्कोड किया जाना चाहिए, फिर पीकेसीएस # 1 के साथ गद्देदार होना चाहिए और फिर केवल निजी कुंजी के साथ हस्ताक्षरित होना चाहिए। और Openssl के लिए एक आदेश है (क्योंकि यह वास्तव में एक मानक प्रक्रिया है)।

openssl dgst -sha256 <data.txt> hash 
openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature 

के बजाय आप

openssl dgst -sha256 -binary -sign private.pem data.txt > signature 

करना भी ध्यान रखें:

  • अपने data.txt एक नई पंक्ति में शामिल है, में यह मत भूलना String verification चर
  • sig.update(verification.getBytes()) स्पष्ट रूप से एक चारसेट का संकेत देना चाहिए - एक ही वर्णमाला, जिसे data.txt फ़ाइल भरने के लिए उपयोग किया गया था ई, उदाहरण के लिए: sig.update(verification.getBytes("UTF-8"))

आपके शेष आदेश/कोड ठीक लगता है।


युपीडी - मतभेदों के बारे में @GilCol जवाब देने के लिए:

गद्दी संदेशों पर हस्ताक्षर किए दोनों के लिए एक ही है (PKCS # 1)। लेकिन संदेश अलग हैं।

आप openssl dgst -sha256 <data.txt> hash उपयोग करते हैं, hash (openssl संस्करण के आधार पर) शामिल होंगे:

(stdin)= aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f 

या

aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f 

यह सिर्फ सादा पाठ है और यह संदेश आप openssl rsautl -sign ... का उपयोग कर प्रवेश कर सकेंगे। हम देख सकते हैं कि openssl rsautl -verify ... साथ:

# raw message as-is - we can see the padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -raw -hexdump 
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff 00 61 ...............a # 
00c0 - 65 63 30 37 30 36 34 35-66 65 35 33 65 65 33 62 ec070645fe53ee3b # 
00d0 - 33 37 36 33 30 35 39 33-37 36 31 33 34 66 30 35 3763059376134f05 # your plain-text message 
00e0 - 38 63 63 33 33 37 32 34-37 63 39 37 38 61 64 64 8cc337247c978add # 
00f0 - 31 37 38 62 36 63 63 64-66 62 30 30 31 39 66 0a 178b6ccdfb0019f. # we can even see newline char (0a) at the end 

# strip the padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -pkcs -hexdump 
0000 - 61 65 63 30 37 30 36 34-35 66 65 35 33 65 65 33 aec070645fe53ee3 
0010 - 62 33 37 36 33 30 35 39-33 37 36 31 33 34 66 30 b3763059376134f0 
0020 - 35 38 63 63 33 33 37 32-34 37 63 39 37 38 61 64 58cc337247c978ad 
0030 - 64 31 37 38 62 36 63 63-64 66 62 30 30 31 39 66 d178b6ccdfb0019f 
0040 - 0a            . 

आप openssl dgst -sha256 -binary <data.txt> hash का उपयोग करते हैं बाइनरी (शुद्ध) के रूप में हैश प्राप्त करने के लिए, और फिर इसे सही नहीं प्रवेश करते हैं, परिणाम बेहतर होगा, लेकिन अभी भी:

# raw message as-is - we can see the same padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -raw -hexdump 
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00c0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00d0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff 00 ................ 
00e0 - ae c0 70 64 5f e5 3e e3-b3 76 30 59 37 61 34 f0 ..pd_.>..v0Y7a4. # the hash - now in binary form 
00f0 - 58 cc 33 72 47 c9 78 ad-d1 78 b6 cc df b0 01 9f X.3rG.x..x...... # 

# strip the padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -pkcs -hexdump 
0000 - ae c0 70 64 5f e5 3e e3-b3 76 30 59 37 61 34 f0 ..pd_.>..v0Y7a4. # just the hash, nothing else 
0010 - 58 cc 33 72 47 c9 78 ad-d1 78 b6 cc df b0 01 9f X.3rG.x..x...... # 

लेकिन जब आप openssl dgst -sha256 -sign ... का उपयोग करते हैं, तो संदेश अलग होता है - यह अब संदेश digests (हैश) के लिए एक मानक ASN.1 संरचना है। चलो देखते हैं:

# raw message as-is - we can see the same padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -raw -hexdump 
0000 - 00 01 ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0010 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0020 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0030 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0040 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0050 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0060 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0070 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0080 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
0090 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00a0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00b0 - ff ff ff ff ff ff ff ff-ff ff ff ff ff ff ff ff ................ 
00c0 - ff ff ff ff ff ff ff ff-ff ff ff ff 00 30 31 30 .............010 # 
00d0 - 0d 06 09 60 86 48 01 65-03 04 02 01 05 00 04 20 ...`.H.e....... # the message - it's different 
00e0 - ae c0 70 64 5f e5 3e e3-b3 76 30 59 37 61 34 f0 ..pd_.>..v0Y7a4. # <- we can see the hash (in binary form) starting at this line 
00f0 - 58 cc 33 72 47 c9 78 ad-d1 78 b6 cc df b0 01 9f X.3rG.x..x...... # 

# strip the padding 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -pkcs -hexdump 
0000 - 30 31 30 0d 06 09 60 86-48 01 65 03 04 02 01 05 010...`.H.e..... 
0010 - 00 04 20 ae c0 70 64 5f-e5 3e e3 b3 76 30 59 37 .. ..pd_.>..v0Y7 
0020 - 61 34 f0 58 cc 33 72 47-c9 78 ad d1 78 b6 cc df a4.X.3rG.x..x... 
0030 - b0 01 9f           ... 

# parse the message and show the underlying ASN.1 structure 
$ openssl rsautl -in signature -pubin -inkey public.pem -verify -pkcs -asn1parse 
    0:d=0 hl=2 l= 49 cons: SEQUENCE   
    2:d=1 hl=2 l= 13 cons: SEQUENCE   
    4:d=2 hl=2 l= 9 prim: OBJECT   :sha256    # type of hash 
    15:d=2 hl=2 l= 0 prim: NULL    
    17:d=1 hl=2 l= 32 prim: OCTET STRING  
     0000 - ae c0 70 64 5f e5 3e e3-b3 76 30 59 37 61 34 f0 ..pd_.>..v0Y7a4. # the hash in binary form 
     0010 - 58 cc 33 72 47 c9 78 ad-d1 78 b6 cc df b0 01 9f X.3rG.x..x...... # and no extra newline chars 

आप देख सकते हैं, केवल पिछले signature फ़ाइल उचित ASN.1 संरचना की थी, पिछले दो थे बस "कुछ मनमाने ढंग से" संदेश, RSA निजी कुंजी के साथ हस्ताक्षर किए।

+0

धन्यवाद, यह मेरी समस्या हल हो गया। मुझे यह धागा भी मिला: http://stackoverflow.com/questions/13419201/why-are-the-rsa-sha256-signatures-i-generate-with-openssl-and-java- अलग लेकिन मैं अभी भी ' उन आदेशों के बीच क्रिप्टोग्राफिक अंतर को समझ में नहीं आता है। क्या पैडिंग अलग है या क्या? – GilCol

+0

@GilCol मैंने अपना जवाब अपडेट किया। – Roman

+0

आपने अभी इस व्याख्या के साथ अपना जीवन बचाया है, धन्यवाद! – GregaMohorko

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