【问题标题】:Unable to verify a public key and signature with python rsa无法使用 python rsa 验证公钥和签名
【发布时间】:2021-09-20 15:02:02
【问题描述】:

我在验证 Django 服务器中的签名和公钥时遇到问题。我的 react-native 应用创建了公钥和签名。

我的代码如下所示:

import rsa

publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ukwwhq00ZmVtY1dswdVUg0tDNAbPt/GCWRUua1zsmeKT90NP3rsAEbIHJ89mQJ5/fVrl+umS5uq3F7AdZNh2R269KLV2MSytoMWR2zLD4oVUdDSwbEu8h1cx8s8vk6QpjmvZkxXYWXM1kh+9AqEjsWL3gE5hShOaqf8zl1k9pjZVywndaFi7/SsvQGy6WlSZT7cPyF/xwxGOBe3h9nijlhCIpR9AkbTSsQrVRz+iudGLSuuzS09hgX6fdqcRqR+T2UocfGJrSAqBhHVPeCksQ/OgwGJtaZQde+Cu/9FGa9LAdRcMm/WUILLlv2Dn7DGjhe/S8xvsZh7p7ghYbgxwwIDAQAB'
payload = 'some test payload'
signature = 'DB1E4dSOoA9avqhR6I2vnQQJ4Ktptsq/Z89afh0tX9gcCfWzBnkBySaeY0MjIHTOUqKimbRfFxb4NDIBCgIu/bQufIrESIl8v/U6jHPleP5wn9fh+p02mvTKUSDU8p6zBygXiGUe2SWwHaGzYvHDIW1Rm6mL22kv1qTkMhRQsVsBAgVtn8vHx6yMvN+XmQAM0Z2BDecC2kyfjZrBkJT7stzHW/1fT4GiVmoC7haaR2JRdHlGWBZXktmUvqo8xEdgYyMq582Q6N+Jw6Ic7TQc+584yviSgB3fAg32b7z5NdRVAwS2FCbLkC7DQNn+WCBk6XHOwKuu1XR9eUWU+k0Qgg=='

pem_prefix = '-----BEGIN PUBLIC KEY-----\n'
pem_suffix = '\n-----END PUBLIC KEY-----'
key = '{}{}{}'.format(pem_prefix, public_key, pem_suffix)
public_key = rsa.PublicKey.load_pkcs1_openssl_pem(key)

signature_bytes = base64.b64decode(signature)

rsa.verify(payload, signature_bytes , publicKey)

我执行了上述操作,但出现以下错误:

   result = rsa.verify(
  File "C:\Users\efosa\AppData\Roaming\Python\Python39\site-packages\rsa\pkcs1.py", line 356, in verify
    message_hash = compute_hash(message, method_name)
  File "C:\Users\efosa\AppData\Roaming\Python\Python39\site-packages\rsa\pkcs1.py", line 432, in compute_hash
    assert hasattr(message, 'read') and hasattr(message.read, '__call__')
AssertionError

当我尝试像这样将签名加载为私钥时:

priv_pem_prefix = '-----BEGIN RSA PRIVATE KEY-----\n'
priv_pem_suffix = '\n-----END RSA PRIVATE KEY-----'
priv_key = '{}{}{}'.format(priv_pem_prefix, signature, priv_pem_suffix)

signature = rsa.PrivateKey.load_pkcs1(priv_key)

我收到以下错误:

value, _ = decodeFun(head, asn1Spec, tagSet, length, **options)
  File "C:\Users\efosa\AppData\Roaming\Python\Python39\site-packages\pyasn1\codec\ber\decoder.py", line 1446, in __call__
    raise error.SubstrateUnderrunError('%d-octet short' % (length - len(substrate)))
pyasn1.error.SubstrateUnderrunError: 46-octet short

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 从第一个错误开始,payload 应该有一个.read() 方法。也许用StringIO 包装它?
  • 有效负载必须是字节对象

标签: python rsa


【解决方案1】:

解决办法是:

rsa.verify(payload.encode("utf-8"), signature_bytes , publicKey)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2012-03-06
    • 2016-04-17
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多