2012-04-17 27 views
5

हम आरएसए कुंजी जेनरेट कर रहे हैं, और, उन्हें सार्वजनिक और निजी बेस 64 हैश के रूप में स्टोर करने के लिए चाहते हैं कि मैं पर मेरे ~/.ssh फ़ोल्डर में देखने के अभ्यस्त कर रहा हूँ मेरी लिनक्स बॉक्सपैदा धारावाहिक आरएसए सार्वजनिक/NED बिग Ints से निजी कुंजी

हालांकि, हम आरएसए प्राइमेटिव्स - एन, ई, और डी मानों से निपट रहे हैं।

मैं उन मानों से बेस 64 हैश कैसे उत्पन्न करूं? और इसके विपरीत (यदि यह स्पष्ट नहीं है)।

+0

क्यों नहीं http://docs.python.org/3.4/library/base64.html और/या (https://pypi.python.org/pypi/rsa http://stuvel.eu/ आरएसए)? – user2284570

+0

@ जे। यादृच्छिक कोई जवाब? – user2284570

उत्तर

2

बेस 64 बाइनरी डेटा के लिए एक एन्कोडिंग योजना है जो टेक्स्ट के रूप में प्रदर्शित होती है, न कि हैशिंग एल्गोरिदम। यदि आप फिंगरप्रिंट का जिक्र कर रहे हैं, तो यह एमडी 5 है।

दोनों फिंगरप्रिंट और बेस 64 एन्कोडेड डेटा के लिए, आप संपर्क कर सकते हैं या यहां तक ​​कि Twisted's Conch implementation पुन: उपयोग।

1

आपको सही ASN.1 एन्कोडिंग और फिर बेस 64 का उपयोग करने की आवश्यकता है।

दुर्भाग्य से, मैं पता नहीं क्या सही ASN.1 एन्कोडिंग है (मैं वास्तव में अपने आप को समझ में नहीं आता ASN.1) है। यह openssl में बनाया गया है, लेकिन मुझे कमांड लाइन से इसे एक्सेस करने का कोई तरीका नहीं मिल रहा है। आप http://www.openssl.org/docs/crypto/RSA_print.html और http://www.openssl.org/docs/crypto/rsa.html

का उपयोग करके इसे सी से लिख सकते हैं आपके पास टैग में पाइथन है। pyopenssl wraps openssl और एक आसान पथ प्रदान कर सकता है - https://code.launchpad.net/pyopenssl - लेकिन स्रोत को देखकर ऐसा लगता है कि वे बहुत उच्च स्तर हैं (वे आरएसए संरचना का पर्दाफाश नहीं कर रहे हैं)।

आप ASN.1 बात (या कि ऐसा नहीं करता है, http://pyasn1.sourceforge.net/ की तरह एक पुस्तकालय है) तो यह हो सकता है कि आप सभी की जरूरत है - https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

(मैं जानते हैं कि यह नहीं बल्कि अधूरा है - मैं के लिए नहीं देख रहा हूँ इनाम, बस डंपिंग क्या मामले में मुझे पता है यह मदद करने के लिए काफी है - मूल रूप से 'डेर के लिए ASN.1 "बिट से वंचित हो रहे है, यह क्या संरचना को परिभाषित करता है, ताकि अलग-अलग हिस्सों में अलग किया जा सकता है जब वापस पढ़ें) है

+0

सार्वजनिक कुंजी id_rsa.pub का एक अलग प्रारूप है, हालांकि मेरा जवाब देखें (इसे विवरण के साथ अपडेट किया जाएगा)। –

1

मैं इसे कुछ घंटों में मुफ्त में प्राप्त होने पर अधिक जानकारी और एक डिकोडर के साथ अपडेट करूंगा।

def bitlength_and_integer_in_bytes(n): 
    bytes_length = n.bit_length()//8+1 
    return bytes_length.to_bytes(4, "big")+n.to_bytes(bytes_length, "big") 

def gen_id_rsa_pub(n,e): 
    return b"ssh-rsa "+base64.b64encode(b"\x00\x00\x00\x07ssh-rsa"+bitlength_and_integer_in_bytes(e)+bitlength_and_integer_in_bytes(n))+b" RSA key description" 
open("id_rsa.pub", "bw").write(gen_id_rsa_pub(n,e)) 
##import base64 
##from pyasn1.codec.der import decoder 
##s = "\n".join(open(".ssh/id_rsa").readlines()[1:-1]) 
##d = decoder.decode(base64.b64decode(s)) 
import base64 
from pyasn1.codec.der import encoder 
from pyasn1.type.univ import * 
#below from http://stackoverflow.com/a/9758173/443348 
def egcd(a, b): 
    if a == 0: 
     return (b, 0, 1) 
    else: 
     g, y, x = egcd(b % a, a) 
     return (g, x - (b // a) * y, y) 

def modinv(a, m): 
    g, x, y = egcd(a, m) 
    if g != 1: 
     raise Exception('modular inverse does not exist') 
    else: 
     return x % m 

#got example values from https://en.wikipedia.org/wiki/RSA_(algorithm)#A_working_example 
p = 61 
q = 53 
n = p*q #3233 
totient_n = (p-1)*(q-1) # 3120 
e = 17 # Should be coprime to 3120 
d = modinv(e, totient_n) #2753 

s = Sequence() 
def setvalues(sequence, values): 
    for index, value in enumerate(values): 
     sequence.setComponentByPosition(index, value) 

q = n/p 

setvalues(s, map(Integer, (0, n, e, d, p, q, d%(p-1), d%(q-1), modinv(q,p)))) 
id_rsa = b"-----BEGIN RSA PRIVATE KEY-----\n"+base64.b64encode(encoder.encode(s))+b"\n-----END RSA PRIVATE KEY-----\n" 
open("id_rsa", "bw").write(id_rsa)