编程语言
首页 > 编程语言> > python-M2Crypto-从非标准文件导入密钥?

python-M2Crypto-从非标准文件导入密钥?

作者:互联网

我有一个包含公用指数和模数的文件.它们不是pem或xml或der格式,它们只是以偏移量写入的值.

我如何使用M2Crypto从其中制作一个公钥?我也有相同格式的私钥.我设法使用有人在这里在Stackoverflow上发布的代码来用php生成PEM文件,但这似乎是一种极其荒谬的方法.

这也不是一次性的事情,我需要能够以这种格式从文件中读取公共指数和模数以检查签名.

解决方法:

非常感谢Lars:http://blog.oddbit.com/2011/05/09/signing-data-with-ssh-agent/

e是Python的公共指数的一部分.
n是公共模量的Python长度.

他发布的代码是:

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))),
    ))

像魅力一样工作!

根据文档,new_pub_key的接受格式需要为

OpenSSL’s MPINT format – 4-byte big-endian bit-count followed by the
appropriate number of bits

我不确定这是否是错字,但是对于我的(十六进制)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

标签:m2crypto,python,rsa
来源: https://codeday.me/bug/20191010/1883180.html