【问题标题】:M2Crypto - import keys from non-standard file?M2Crypto - 从非标准文件导入密钥?
【发布时间】:2012-05-09 04:07:55
【问题描述】:

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

如何使用 M2Crypto 从它们中生成公钥?我也有相同格式的私钥。我已经设法使用某人在 Stackoverflow 上发布的代码用 php 生成 PEM 文件,但这似乎是一种非常荒谬的方法。

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

【问题讨论】:

    标签: python rsa m2crypto


    【解决方案1】:

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

    e 是 Python long 的公共指数。 n 是一个 Python long 的 public Modulus。

    他发布的代码是:

    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 的 MPINT 格式 - 4 字节 big-endian 位计数,后跟 适当的位数

    我不确定这是否是一个错字,但对于我的指数(十六进制)00010001 最终是000003010001。我认为这是一个字节数,而不是位数。他们还剥离了第一个 0x00。我不知道这是标准还是因为它是一个空字节。

    编辑:我想我对格式有了更好的理解。

    如果第一个字节为负,则在开头添加一个零字节。 如果有任何前导(在开头)零字节,它们将被剥离,除非第一个字节变为负数,在这种情况下,只剩下一个零字节。

    一些例子:

    未格式化: \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 解释: 字符串中剩余的尾随零字节

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多