Python M2Crypto-从非标准文件导入密钥?
我有一个包含公共指数和模数的文件。它们不是pem、xml或der格式,它们只是在偏移量处写入的值 我如何使用M2Crypto从它们中生成公钥?我也有相同格式的私钥。我已经设法使用Stackoverflow上有人发布的代码用php生成PEM文件,但这似乎是一种非常荒谬的方法Python M2Crypto-从非标准文件导入密钥?,python,rsa,m2crypto,Python,Rsa,M2crypto,我有一个包含公共指数和模数的文件。它们不是pem、xml或der格式,它们只是在偏移量处写入的值 我如何使用M2Crypto从它们中生成公钥?我也有相同格式的私钥。我已经设法使用Stackoverflow上有人发布的代码用php生成PEM文件,但这似乎是一种非常荒谬的方法 这也不是一次性的事情,我需要能够从这种格式的文件中读取公共指数和模数以检查签名。非常感谢Lars: e是公共指数的Pythonlong。 n是公共模的Pythonlong 他发布的代码是: import M2Crypto ke
这也不是一次性的事情,我需要能够从这种格式的文件中读取公共指数和模数以检查签名。非常感谢Lars:
e
是公共指数的Pythonlong
。
n
是公共模的Pythonlong
他发布的代码是:
import M2Crypto
key = M2Crypto.RSA.new_pub_key((
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(e)[2:])),
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hex(n)[2:])),
))
hex将生成一个排序为0xA45E
的十六进制字符串,因此他只需抓取0x
后面的所有内容
我正在从文件中读取密钥,所以我没有很长时间。我最终使用了:
import M2Crypto
from binascii import hexlify
e = f.read(4)
n = f.read(0x80)
key = M2Crypto.RSA.new_pub_key((
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(e))),
M2Crypto.m2.bn_to_mpi(M2Crypto.m2.hex_to_bn(hexlify(n))),
))
工作得很有魅力
根据文件规定,接受的新发布密钥
格式需要
OpenSSL的MPINT格式—4字节的big-endian位计数,后跟
适当位数
我不确定这是否是打字错误,但对于我的指数(十六进制)00010001
,结果是000003010001
。我认为这是字节计数,而不是位计数。他们还剥离了第一个0x00。我不知道这是标准的还是因为它是一个空字节
编辑:我想我对格式有了更好的理解
如果第一个字节为负,则在开头添加一个零字节。
如果有任何前导(在开头)零字节,它们将被剥离,除非第一个字节变为负数,在这种情况下,只剩下一个零字节
一些例子:
Unformatted:
\x23\x24\x25\x26
Formatted:
\x00\x00\x00\x04\x23\x24\x25\x26
Explanation:
String left as is and count of bytes packed in
Unformatted:
\x00\x23\x55\x35
Formatted:
\x00\x00\x00\x03\x23\x55\x35
Explanation:
leading zero byte removed, byte count now 3
Unformatted:
\x80\x43\x55\x27
Formatted:
\x00\x00\x00\x05\x00\x80\x43\x55\x27
Explanation:
leading zero byte added because \x80 is negative
Unformatted:
\x00\xff\x43\x23
Formatted:
\x00\x00\x00\x04\x00\xff\x43\x23
Explanation:
Leading zero byte left because \xff is negative
Unformatted:
\x23\x53\66\x00
Formatted:
\x00\x00\x00\x04\x23\x53\66\x00
Explanation:
Trailing zero byte left in string
未格式化:
\x23\x24\x25\x26
格式:
\x00\x00\x00\x04\x23\x24\x25\x26
说明:
按原样保留字符串和压缩的字节数
未格式化:
\x00\x23\x55\x35
格式:
\x00\x00\x00\x03\x23\x55\x35
说明:
前导零字节已删除,字节计数现在为3
未格式化:
\x80\x43\x55\x27
格式:
\x00\x00\x00\x05\x00\x80\x43\x55\x27
说明:
添加了前导零字节,因为\x80为负
未格式化:
\x00\xff\x43\x23
格式:
\x00\x00\x00\x04\x00\xff\x43\x23
说明:
左前导零字节,因为\xff为负
未格式化:
\x23\x53\66\x00
格式:
\x00\x00\x00\x04\x23\x53\66\x00
说明:
字符串中剩余的尾随零字节