2014-12-19 9 views
5

मेरे पास एक बाइनरी फ़ाइल में एम्बेडेड आरएसए सार्वजनिक कुंजी के मॉड्यूलस & है, और मैं पूरे ब्लॉब निकालने और उपयोग करने योग्य बनाने की कोशिश कर रहा हूं। पेम सार्वजनिक कुंजी।कच्चे मॉड्यूलस और एक्सपोनेंट को आरएसए सार्वजनिक कुंजी (.pem प्रारूप) में परिवर्तित करने के लिए कैसे करें

वर्तमान में, मैं पूर्ण 260 बाइट्स (एक्सपोनेंट के लिए 4 बाइट, मॉड्यूलस के लिए 256 बाइट्स) निकालने जा रहा हूं और बेस 64 के रूप में एन्कोडिंग।

tail -c $((filesize - start_of_key_data)) filename | head -c $size_of_key_data | base64 > outkey 

यह मैं निम्न स्ट्रिंग देता है::

<<<<<< modulus & exponent extracted from binary file, base64-encoded >>>>>> 

tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4F 
vzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+ 
sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1Lll 
RWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/r 
ZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE= 

अब, जब मैं key.pem कुंजीयुग्म कि मापांक & प्रतिपादक मूल रूप से निकाले गए थे ले मैं निम्नलिखित शेल कमांड का उपयोग करते हुए कि कर रहा हूँ , और इसलिए

openssl rsa -in key.pem -pubout -out pubkey.pem 

मैं इस स्ट्रिंग प्राप्त की तरह सार्वजनिक भाग प्रदर्शित (मैं हैडर & पाद लाइनों छोड़ दी हैं:

<<<<<<<<< valid public key data extracted from keypair >>>>>>>>> 

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtZyrQA6cZFJfVm6FyXwt 
ZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZ 
U71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDv 
YDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGy 
a9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx4 
1YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ 
ZwIDAQAB 

आप देख सकते हैं कि कुंजी डेटा जो मैं निकाला है और base64 एनकोडेड अपने आप वास्तव में key.pem openssl का उपयोग कर से निकाला वैध सार्वजनिक कुंजी डेटा के डेटा में मौजूद है। लेकिन वहाँ शुरुआत में 45 अक्षर हैं, मेरे अपने निकाले गए डेटा नहीं है कि -

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 

और पिछले 8 अक्षर भी भिन्न होते हैं।

ZwIDAQAB 

क्या कोई मॉड्यूलस और एक्सपोनेंट को उपयोग करने योग्य सार्वजनिक कुंजी में परिवर्तित करने के बारे में कुछ सलाह दे सकता है?

(लक्ष्य एक bash लिपि में ऐसा करने के लिए, अजगर या सी नहीं के रूप में मैंने देखा है कई सुझाव दे सकता है।)

उत्तर

9

कमान है जो आप के लिए इस्तेमाल किया, openssl rsa -in key.pem -pubout -out pubkey.pem, इस तरह ASN.1 संरचना का उत्पादन:

SEQUENCE(2 elem) 
    SEQUENCE(2 elem) 
    OBJECT IDENTIFIER 1.2.840.113549.1.1.1 
    NULL 
    BIT STRING(1 elem) 
    SEQUENCE(2 elem) 
     INTEGER(2048 bit) 229263895356027367204242482830890190076375310244080661230946245232688… 
     INTEGER 65537 

(आप openssl asn1parse -in pubkey.pem साथ संरचना देख सकते हैं, या एक online ASN.1 decoder का उपयोग)।

यह सामग्री:

  1. एक निश्चित हैडर
  2. मापांक
  3. हैडर, प्रतिपादक की एन्कोडिंग को निर्दिष्ट (सभी बाइट्स, पूरे अनुक्रम की एन्कोडिंग प्लस मापांक की एन्कोडिंग को निर्दिष्ट करता है)
  4. प्रतिपादक

आप मापांक है, तो और प्रतिपादक बाइट्स ग सही ढंग से एकत्रित, आप इन चार चीजों को जोड़कर ओपनएसएसएल द्वारा समझने योग्य रूप में सार्वजनिक कुंजी का निर्माण कर सकते हैं। आपके पास पहले से ही पहला हेडर है।':

  1. ' "मध्यम हैडर" '02 03 है पूर्णांक के लिए 02 '
  2. पूर्णांक के ही
  3. लंबाई 3 बाइट्स (65537 = 01 00 01)

अपने मापांक तो है 2048 बाइट्स और प्रतिपादक 3 बाइट्स है (ताकि लंबाई क्षेत्रों वैध रहेगा), पीईएम फ़ाइल श्रृंखलाबद्ध द्वारा उत्पादित किया जा सकता है इन चार:

<header> <modulus> 0x02 0x03 <exponent> 

है यही कारण है कि द्विआधारी डंप से पिछले बाइट्स OpenSSL outpu से अलग टी: निकाले गए 260 बाइट्स में 02 03 नहीं है, लेकिन इसके बजाय 65537 रिकॉर्ड 00 01 00 01 (01 00 01 ASN.1 एन्कोडिंग में नहीं) के रूप में रिकॉर्ड करें।

संक्षेप में, अगर आप इस तरह पीईएम फ़ाइल का उत्पादन कर सकते हैं: (! ध्यान दें बाइट 65,537 के अग्रणी शून्य बाइट को छोड़ने के लिए ऑफसेट)

अपने निकाले मापांक कन्वर्ट + बेस 64 से वापस प्रतिपादक और उन्हें निकालने :

echo 'tZyrQA6cZFJfVm6FyXwtZaLQYg8EecuO+ObrHTwc8JO+XrgnpNAdmlhbAEPxSNnjwhNnbYGYGL4FvzmnZXzZU71Key42HQPh1k2Zx1UDbrH5ciODKx1ZbuEx8K24SHnL1nY/H75hwhT/ZRRVGQDvYDT+sgzw2vmV66+dflw1Zs8BLhqjLjczdHvjeVXsDRJ9Mvvd/dhFH8UlTf4JpLGya9nsNIfNBBIf1LllRWwCTiEIbaOMgWcLjLV/2tk/j5Dra/oQnVf/2hVsEF/hXEx41YjeEW/warweoDVG7zaxrHEc/k/rZCUCZKxf8nBKdqax/gRICvkG6e5xg2GQw0W/ZwABAAE=' | base64 -d > modulus-exp.bin 
dd if=modulus-exp.bin of=modulus.bin bs=1 count=256 
dd if=modulus-exp.bin of=exponent.bin bs=1 skip=257 count=3 

हेडर बनाएँ:

echo 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA' | base64 -d > header.bin 
echo '02 03' | xxd -r -p > mid-header.bin 

उन्हें एक साथ जुटना:

cat header.bin modulus.bin mid-header.bin exponent.bin > key.der 

पीईएम में परिवर्तित करें:

openssl pkey -inform der -outform pem -pubin -in key.der -out key.pem 

टेस्ट है कि आप कुंजी काम कर पाने - ASN.1 विकोडक के साथ की जाँच करके, या द्वारा

openssl asn1parse -in key.pem 
openssl asn1parse -in key.pem -strparse 19 
+0

भयानक जवाब! –

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

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