代码之家  ›  专栏  ›  技术社区  ›  Saqib Ali

如何在python中将此Perl代码转换为RSA公钥?

  •  2
  • Saqib Ali  · 技术社区  · 7 年前

    我有以下JSON对象,它表示从网站获得的RSA256 JWK:

    jwk = {
        'e': 'AQAB', 
        'n': 'sAlE_mzYz-2jf_YpxulSJXv_2CGIquflNZWhXUaU1SkJm9P0riLAuzwK7WT5p0Ko3zmQHho70_7D9nqB01rA4ExrMIDKpprE0Qa7NAJN-kgZhd_A25HsdSfpOfpaLvR-mf9fuOTDPLRQCd5HnrjoQKjs3D_XfPmPnT_Ny5erviiky90GSfN9j2DP_5yeDprzWKF-EQ3EDdIWt3snr7AW8rzBcZ1ojyWxckLAeSKDerMXP-zVBUFJE9Kn60HZoGNvmATKaw8LwEbf8DGfrllgSLvhg7mDRMLlbcooQoWAFSfN7t7kFbPSOcvjrpx3Yw_KrEwBZXeUP3260ukmFOx8RQ',
     }
    

    下面是Perl代码,显示了如何从上述jwk构造Crypt库中的公钥对象:

    use Crypt::OpenSSL::RSA;
    use Crypt::OpenSSL::Bignum;
    use MIME::Base64 qw/decode_base64url/;
    
    sub public_key {
        my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters(
            Crypt::OpenSSL::Bignum->new_from_bin(decode_base64url($jwk->{n})),
            Crypt::OpenSSL::Bignum->new_from_bin(decode_base64url($jwk->{e})),
        );
        return $rsa->get_public_key_x509_string;
    }
    

    两个问题:

    如何将上述代码翻译成Python?下面的代码失败。

    在python中拥有公钥对象后,如何使用它验证由相应私钥签名的JWT?请发布一个片段,确切地说明如何做到这一点。

    >>> from Crypto.PublicKey import RSA
    >>> import base64
    >>> public_key = RSA.construct((base64.b64decode(jwk['n']), base64.b64decode(jwk['e'])))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "my-virtual-env/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 539, in construct
        key = self._math.rsa_construct(*tup)
      File "my-virtual-env/lib/python2.7/site-packages/Crypto/PublicKey/_slowmath.py", line 84, in rsa_construct
        assert isinstance(n, long)
    AssertionError
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   llompalles    7 年前

    由于 RSA contructor 需要2个长整数,您使用的是两个字符串。

    解决方案是将base64解码字符串转换为十六进制整数。

    from Crypto.PublicKey import RSA
    import base64
    
    n = int(base64.b64decode(jwk['n']).encode('hex'),16)
    e = int(base64.b64decode(jwk['e']).encode('hex'),16)
    e = long(e)
    
    public_key = RSA.construct((n, e))
    print(public_key)
    

    this method 验证RSA签名的有效性。