2012-04-17 11 views
5

私は〜/ .sshフォルダを見るのに慣れていたように、私はrsa鍵を公開しています。 linuxボックス。NED Big Intsからシリアル化されたrsa公開鍵/秘密鍵を生成します

しかし、RSAプリミティブ(n、e、d値)を扱っています。

これらの値からbase64ハッシュを生成するにはどうすればよいですか?逆も同様です(明らかでない場合)。

+0

なぜhttp://docs.python.org/3.4/library/base64.htmlおよび/または(https://pypi.python.org/pypi/rsa http://stuvel.eu/) rsa)? – user2284570

+0

@ J.ランダムに答えますか? – user2284570

答えて

2

base64は、ハッシュアルゴリズムではなく、テキストとして表されるバイナリデータのエンコード方式です。指紋を参照している場合は、MD5です。

指紋とbase64でエンコードされたデータの両方について、Twisted's Conch implementationと相談したり、再利用したりすることができます。

1

正しいASN.1エンコードを使用してからbase64を使用する必要があります。

残念ながら、私は正しいASN.1エンコーディングが何であるか分かりません(私は実際にASN.1自分自身を理解していません)。それはopensslに組み込まれていますが、私はコマンドラインからアクセスする方法を見つけることができません。あなたはCからhttp://www.openssl.org/docs/crypto/RSA_print.htmlhttp://www.openssl.org/docs/crypto/rsa.html

を使って書くことができます。あなたはタグにpythonを持っています。 pyopensslはopensslをラップし、より簡単なパスを提供するかもしれません - https://code.launchpad.net/pyopenssl - ソースを見ると、彼らは高すぎるようです(彼らはRSA構造体を公開していないようです)。

あなたはASN.1(またはhttp://pyasn1.sourceforge.net/のように、そうするライブラリを持っている)を話すならば、これはあなたが必要とするすべてであるかもしれない - https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem

(私はこれはかなり不完全であると認識 - 私は探していませんよ私が知っているものをダンピングするだけで十分です。基本的に "DERのための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) 
関連する問題