जावा उत्पादन करता है और थोड़ा अलग रूप में हस्ताक्षर प्राप्त करने की अपेक्षा करता है। संदेश का हैश डीईआर में एन्कोड किया जाना चाहिए, फिर पीकेसीएस # 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 निजी कुंजी के साथ हस्ताक्षर किए।
टेक्स्ट एन्कोडिंग एक समस्या हो सकती है। आप इसे अपने इस्तेमाल किए गए 'सत्यापन' का SAH256 संदेश डिज़ाइन बनाकर देख सकते हैं और ओपनएसएसएल हैश के साथ आउटपुट की तुलना कर सकते हैं। आप जावा में आरएसए/ईसीबी/नोपैडिंग के साथ इसे डिक्रिप्ट करके अपने हस्ताक्षर की "सामग्री" भी देख सकते हैं। – Robert