2012-04-17 44 views
5

Chúng tôi đang tạo khóa rsa và muốn lưu trữ chúng dưới dạng băm base64 riêng và công khai, như tôi thường thấy trong thư mục ~/.ssh trên hộp linux.tạo các khóa công khai/riêng tư rsa từ NED Big Ints

Tuy nhiên, chúng tôi đang xử lý các nguyên thủy RSA - giá trị n, e và d.

Làm cách nào để tạo băm base64 từ các giá trị đó? Và ngược lại (nếu nó không rõ ràng).

+0

Tại sao không http://docs.python.org/3.4/library/base64.html và/hoặc (https://pypi.python.org/pypi/rsa http://stuvel.eu/ rsa)? – user2284570

+0

@ J.Random mọi câu trả lời? – user2284570

Trả lời

2

base64 là một lược đồ mã hóa cho dữ liệu nhị phân được biểu diễn dưới dạng văn bản chứ không phải là thuật toán băm. Nếu bạn đang đề cập đến dấu vân tay, đó là MD5.

Đối với cả vân tay và dữ liệu được mã hóa base64, bạn có thể tham khảo hoặc thậm chí sử dụng lại Twisted's Conch implementation.

1

bạn cần sử dụng mã hóa ASN.1 phù hợp và sau đó là base64.

thật không may, tôi không biết mã hóa ASN.1 phù hợp là gì (tôi không thực sự hiểu ASN.1). nó được xây dựng trong openssl, nhưng tôi không thể tìm thấy một cách để truy cập nó từ dòng lệnh. bạn có thể viết từ C bằng cách sử dụng http://www.openssl.org/docs/crypto/RSA_print.htmlhttp://www.openssl.org/docs/crypto/rsa.html

bạn có python trong thẻ. pyopenssl kết thúc tốt đẹp openssl và có thể cung cấp một con đường dễ dàng hơn - https://code.launchpad.net/pyopenssl - nhưng nhìn vào nguồn nó có vẻ như họ đang quá cao cấp (họ dường như không lộ cấu trúc RSA).

nếu bạn nói ASN.1 (hoặc có một thư viện mà làm như vậy, giống như http://pyasn1.sourceforge.net/) thì đây có thể là tất cả các bạn cần - https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

(i nhận ra điều này là khá đầy đủ - tôi không tìm kiếm bounty, chỉ bán phá giá những gì tôi biết trong trường hợp nó đủ để giúp - về cơ bản "ASN.1 cho DER" là bit bạn đang thiếu, đó là những gì xác định cấu trúc để các phần khác nhau có thể được tách ra khi đọc lại)

+0

Khóa công cộng id_rsa.pub có định dạng khác tuy nhiên, hãy xem câu trả lời của tôi (nó sẽ được cập nhật với các chi tiết). –

1

Tôi sẽ cập nhật thông tin này với nhiều chi tiết hơn và bộ giải mã khi tôi nhận được miễn phí sau vài giờ.

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) 
Các vấn đề liên quan