【问题标题】:Unable to verify a signature in python using PKI无法使用 PKI 在 python 中验证签名
【发布时间】:2013-04-20 07:21:33
【问题描述】:

我正在努力将以下 java 代码移植到 python。我正在使用 PyCrypto 读取 publickKey,但它失败并出现 assertionError:

keyDER = b64decode(publicKeyBase64)
seq = asn1.DerSequence()
seq.decode(keyDER)
keyPub = RSA.construct( (seq[0], seq[1]) )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/Crypto/PublicKey/RSA.py", line 539, in construct
    key = self._math.rsa_construct(*tup)
  File "/usr/local/lib/python2.7/site-packages/Crypto/PublicKey/_slowmath.py", line 84, in rsa_construct
    assert isinstance(n, long)
AssertionError

这些是变量:

signature = "cIUiufopX990NUXlVUznzf3\/gBwhXol2ligPdGp7CHrZNAdDzkDj5pQoikj2sKFiRACEA STh gE4oKJwRAC7Qz1NsNHWCkIYZPAwX\/95sHiVmNiqfXIowm9cqLWyL XLJwkmQupNoTauYWiEm1YF904LyI4hecNST4H4lNcl68="

message = "2425605254855826526"

publicKeyBase64="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVicPgYOx7mDPYDtq4kj24uRfIdNVxjMp9DNlsvmDr9ojrDBn+Ue1YdxYb/rBlDFYab57ClhzOgZjdmUv3T3WKKXE8To9tN2PG/bYEkZpBxn6M1vl0mrp/l6WbyUH4oXUx4kQAeM8/XXZdymbg8S6oLeWT1YrAj6k15fWpSMN0qQIDAQAB"

这是验证签名的 Java 代码。

import java.security.KeyFactory;
import java.security.Signature;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

verifySignature(String message, String signature, String publicKeyBase64 )    

    byte[] keyBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(publicKeyBase64);
    X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
    KeyFactory fact = KeyFactory.getInstance("RSA");
    pubKey = (RSAPublicKey) fact.generatePublic(spec);

    Signature genSignature = Signature.getInstance("SHA1withRSA");
    genSignature.initVerify(pubKey);
    genSignature.update(message.getBytes("UTF-8"));
    boolean result = genSignature.verify(javax.xml.bind.DatatypeConverter.parseBase64Binary(signature));

【问题讨论】:

    标签: python rsa pycrypto m2crypto


    【解决方案1】:

    在 PyCrypto 中有一个名为 importKey 的特定类方法可以读取 DER 或 PEM 编码的 RSA 密钥。

    from base64 import b64decode
    from Crypto.PublicKey import RSA
    
    publicKeyBase64="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVicPgYOx7mDPYDtq4kj24uRfIdNVxjMp9DNlsvmDr9ojrDBn+Ue1YdxYb/rBlDFYab57ClhzOgZjdmUv3T3WKKXE8To9tN2PG/bYEkZpBxn6M1vl0mrp/l6WbyUH4oXUx4kQAeM8/XXZdymbg8S6oLeWT1YrAj6k15fWpSMN0qQIDAQAB"
    keyDER = b64decode(publicKeyBase64)
    keyPub = RSA.importKey(keyDER)
    

    如果您的密钥不是简单的 DER,而是完整的 X.509 证书,请参阅 this other StackOverflow answer。 一旦你有了keyPub,你可以像这样验证签名:

    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA
    
    verifier = PKCS1_v1_5.new(keyPub)
    h = SHA.new(message)
    result = verifier.verify(h, signature)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多