java - SHA1withRSA 在 python 中验证?

标签 java python rsa digital-signature pycrypto

我想将Java的代码重写为Python。该代码用于通过.cer文件验证数据。

public static boolean verifyByRSA(String certPath, byte[] aPlainData,
        byte[] aSignature) {
    boolean tResult = false;
    try {
        InputStream inStream = new FileInputStream(certPath);
        CertificateFactory tCertFactory = CertificateFactory
                .getInstance("X.509");
        Certificate tCertificate = tCertFactory
                .generateCertificate(inStream);

        Signature tSign = Signature.getInstance("SHA1withRSA", "BC");
        tSign.initVerify(tCertificate);

        tSign.update(aPlainData);
        tResult = tSign.verify(aSignature);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return tResult;
}

.cer 文件如下:

-----开始证书----- MIIDhzCCAm+gAwiBAgIGASYISh96MA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNVBAYTAkNOMSkwJwYDVQQKDCBBbGxpbnBheSBOZXR3b3JrIFNlcnZpY2VzIENvLkx0ZDElMCMGA1UECwwcQWxsaW5wYXkgUHJpbWFye SBDZXJ0aWZpY2F0ZTAeFw0xMDAxMDcxMDE3NDBaFw0zMDAxMDIxMDE3NDBaMGQxCzAJBgNVBAYTAkNOMSkwJwYDVQQKDCBBbGxpbnBheSBOZXR3b3JrIFNlcnZpY2VzIENvLkx0ZDEqMCgGA1UECwwhQWxSAW5 wYXkgRGlnaXRhbCBTaWduIENlcnRpZmljYXRlMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEv2q2/xN5PF0dLn1vhIaVlyWsvJFVFxWgH7sQBObzYbZXOOVzoQpmXUSFForF0/ol4Okd/2OGfdXUUFSUZ fzAQOT1Wmjupec7z2V6l4/PT7aOg6t/MJwU9aW9Iw+AFzM1vnLOXdTlWVLZbtB7IiJ/HhfwBDkyvhp1zNYoAPrwC5QIDAQABo4HHMIHEMB0GA1UDDgQWBBQlWQA//YbuEdfE1yP+PpnokDO8WDCBjg YDVR0jBIGGMIGDgBSBWR3Bvx8To7TrecKhCM4smeabN6FjpGEwXzELMAkGA1UEBhMCQ04xKTAnBgNVBAoMIEFsbGlucGF5IE5ldHdvcmsgU2VydmljZXMgQ28uTHRkMSUwIwYDVQQLDBxBbGxpbnBheSBQcmltYXJ5IENlcn RpZmljYXRlggYBJghKHowwEgYDVR0TAQH/BA​​gwBgEB/wiBADANBgkqhkiG9w0BAQUFAAOCAQEATzT9GuAmAXLSWpoGc0F7Km7DPMWvSAkq8ckJLftF0/lb3JTR6QT5rsTnQHCdRU7SJX+elNwhJQdRg34dPJAI2z/HpgGu7tW7pdsHjCjlVae3I64h2OzYBGXdtdRyPmyXfBOgXUfqtH0Fg+1QqsRmcRugywjZH8ZQAVYm0TkVJmdBknPp60bJ2gE/nj0w6VaSL6HMAQ+A7AVne3NDreBXepMHgiFqiqMHrZFBQCgTSR1 UwZoT8hwXaaUgwf2h9l/D2QOGCD8G3sRKfMsH3clkehXbprWPNk3uww7dCT0pGz845AyKzCmRK60Z/NOgMG5X+f+JmugsS/bKYwjetXHg9Q== -----结束证书-----

我已经尝试过

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA

key = RSA.importKey(open(cer_path).read())
signer = PKCS1_v1_5.new(key)
digest = SHA.new()
digest.update(str_to_sign)
if signer.verify(digest, base64.decodestring(signature)):
    return True
return False  

但是无法得到正确的结果。java代码是什么意思?

最佳答案

importKey 函数支持以下功能:

  • X.509 subjectPublicKeyInfo DER SEQUENCE(二进制或 PEM 编码)
  • PKCS#1 RSAPublicKey DER 序列(二进制或 PEM 编码)
  • OpenSSH(仅限文本公钥)

现在只有第一个和第二个是 X.509 证书的部分

您需要一个库来解析X.509证书,例如the cryptography package .

作为权宜之计,您可以在 Java 代码中获取 RSAPublicKey 对象并调用 getEncoded。这将返回一个带有 subjectPublicKeyInfo 的 DER SEQUENCE,可以在 Python crypto 中导入(importKey 函数第一个支持的格式)。

关于java - SHA1withRSA 在 python 中验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43059468/

相关文章:

java - 我如何以编程方式切换这些?

python - python min 函数是如何工作的

ssl - 用 SSL/TLS 中的填充和加密解释 key block 和主 key ?

Golang : Convert byte array to big. Int

android - 如何创建具有无限有效性的 Android keystore RSA key ?

java - JPanel 添加到容器时只显示一个组件

java - runtime.exec 立即发送 EOF 到输入?

java - 在 Hibernate "deleted object would be re-saved by cascade"中删除子对象时出现问题

python - 根据另一个列表对元组列表进行排序

python - 带有 if 语句的 while 循环比 while 循环更快