从 N E D BIG INTS 生成序列化的 RSA 公钥/私钥
generating serialized rsa public / private keys from N E D Big Ints
我们正在生成rsa密钥,并希望将它们存储为公共和私有base64哈希,就像我习惯于在我的Linux盒子上的~/.ssh文件夹中看到的那样。
但是,我们正在处理 RSA 原语 - n、e 和 d 值。
如何从这些值生成 base64 哈希?反之亦然(如果不是很明显)。
base64 是表示为文本的二进制数据的编码方案,而不是哈希算法。如果您指的是指纹,它是MD5。
对于指纹和base64编码的数据,您可以参考甚至重用Twisted的Conch实现。
使用正确的ASN.1编码,然后使用base64。
不幸的是,我不知道正确的ASN.1编码是什么(我自己并不真正了解ASN.1)。 它内置于 OpenSSL,但我找不到从命令行访问它的方法。 您可以使用 http://www.openssl.org/docs/crypto/RSA_print.html 和 http://www.openssl.org/docs/crypto/rsa.html 从 C 编写它
标签中有 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
(我意识到这是相当不完整的 - 我不是在寻找赏金,只是倾倒我所知道的,以防它足以提供帮助 - 基本上"ASN.1 for DER"是你缺少的一点;它是定义结构的原因,以便在回读时可以分离出不同的部分)
几个小时后有空时,我会用更多详细信息和解码器来更新它。
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)
- Ajax发布表单序列化,发布引号'
- 序列化数据属性中对象的最可靠方法
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 为什么JSON.stringify没有序列化原型值
- 有没有一个Nodejs库可以序列化和反序列化命名组件的路径(比如URL路径名)
- 是否可以在javascript中反序列化java对象
- jQuery Ajax数组序列化错误
- 对象序列化,JAVA,Javascript
- 在jquery中以序列化的形式传递额外的paparameter
- 如何使用angularjs序列化对象
- 使用System从C#集合创建JSON数组.网状物剧本序列化
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 在html标记中序列化javascript代码
- 如何在C#中反序列化json对象
- jQueryAJAX-将额外的键/值对推送到序列化的$_POST数组中
- 使用JSON序列化图论树的解决方法
- PHP未从AJAX接收序列化数据
- 如何序列化包括影子 DOM 在内的 HTML DOM
- 序列化表单时进行编码
- 从 N E D BIG INTS 生成序列化的 RSA 公钥/私钥