Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';是什么导致了这个无效签名异常?(公钥和签名由PHP创建,验证用Python完成)_Php_Python_Openssl_Rsa_Public Key - Fatal编程技术网

什么';是什么导致了这个无效签名异常?(公钥和签名由PHP创建,验证用Python完成)

什么';是什么导致了这个无效签名异常?(公钥和签名由PHP创建,验证用Python完成),php,python,openssl,rsa,public-key,Php,Python,Openssl,Rsa,Public Key,我基本上是在尝试使用“openssl”(PHP)创建一个签名,并使用“Scriptografy”(PYTHON)进行验证。我总是会收到“无效签名”的错误,这意味着我做错了什么。我知道它们是不同的语言和库,但一旦我对它们使用相同的算法,我希望得到一个有效的签名。谢谢你的帮助 PHP:创建公钥和签名没有问题 -----开始公钥----- MIICIJANBGKQHKIG9W0BAQEFAOCAG8AMICCGKCAGEATXYDJ9VQTGKR/ITYZ6+e xXATzalUOdBcqee+qcb

我基本上是在尝试使用“openssl”(PHP)创建一个签名,并使用“Scriptografy”(PYTHON)进行验证。我总是会收到“无效签名”的错误,这意味着我做错了什么。我知道它们是不同的语言和库,但一旦我对它们使用相同的算法,我希望得到一个有效的签名。谢谢你的帮助

PHP:创建公钥和签名没有问题 -----开始公钥----- MIICIJANBGKQHKIG9W0BAQEFAOCAG8AMICCGKCAGEATXYDJ9VQTGKR/ITYZ6+e xXATzalUOdBcqee+qcb5NJ6Z5DgNdYi9lWz/4YfitYKp0EFwPzbem1zBzKbuQSko Y7ZRJPMYGBW8Q6WEXO4SYA44JXS75JNXMA2X22DKNKAJRE5KXNGBIF1IXCxVVC kfyewM8C8y2iAy5j02YZYw9ysrQWJegamq6sidnMCJBtokOnPQaNJwbDQTqwrSRS 8IDY7BTHB7F/bBwLArwxG7aLFjJ9vf2F7HpmZ3VvJa69OhY0pZMSqePQpJBIQ+2 Ztiywpkkoukjz22brqoe0ygmqvrcyoj2mz8csikjl6wm9erfxvbh/XqPWjX1t nWdnF6qSD/2itIw18+PZCWYAOUE6W064DCBRUQ4UOYXP69IFTRV5OHASUWPJ27Q 2 UCZ9DWWPHLWHZ+LI4RAB6WHD2R8SB7VEHVSZ4KD5KIHEL9DT8MJ+jGyhTjqIhP 7amgcOQLKZJfmeltYI+F0u8OJCOPHXTLXFB1MIXPDHVCDR93LJGU6NBOTWCPX HNOI86XKBLJMNXMXUQBUFPRU8VAUIZKVRPQS8Z2K58MLXA9+hykjMcqpAvQ6STM vLswdj0j9aqyv6I94z2Q2Lgcuoh7xSJcLhKN9QGaarUqjAY/ZZPIDNCxLNVRAV BMYQZ9PQBSAHSD7PVVPUW8MCAWEAQ== -----结束公钥-----

2.目前,我正在做一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,一个研究,2,2,2,2,2,2,2,2,2,2,一个关于一个研究一个关于一个研究一个关于一个关于一个关于一个研究,一个研究,一个研究,一个研究,一个关于一个研究,一个研究,一个PA0BBSVCW9目前,他们的研究已经是一个非常简单的概念。一个BQ(BBQ)是一个BQ(BQ)是一个关于GQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQCDJVBJL0=

PYTHON:InvalidSignature错误
很明显,您的PHP代码:

  • 使用RSA与SHA1而不是SHA256进行签名
  • 使用PKCS#1 1.5版填充,而不是PSS
  • 看起来您只是从中复制并粘贴了代码

    因此,应验证以下python代码段:

    ciphertext = alicePubKey.verify(  
        decoded,  
        b'oi',  
        padding.PKCS1v15(),  
        hashes.SHA1()  
    )
    

    PSS和SHA-256是更好的选择,因此您应该研究修改PHP代码以使用它们,而不是修改python代码。

    正如James所说,函数
    openssl\u sign
    默认使用SHA1,使用参数
    openssl\u algou\u SHA256
    可以解决什么问题

    所以我做了这些改变:

    PHP python
    $data = 'oi';
    $pkeyid = openssl_pkey_get_private($privKey);
    openssl_sign($data, $signature, $pkeyid);
    error_log(base64_encode($signature));
    
    from cryptography.hazmat.backends import default_backend  
    from cryptography.hazmat.primitives.asymmetric import padding  
    from cryptography.hazmat.primitives import hashes  
    from cryptography.hazmat.primitives.serialization import load_pem_private_key  
    from cryptography.hazmat.primitives.serialization import load_pem_public_key
    signature= 'MoUZzfaHCwME2mmxJnMBQWgo+lTLK2QfpfD+5IEnSwi0wmRtgZgFl7IGsWYlTO+zTQCcB/aKg91CMClmb5P2jEtOkY3ie2pNflEIsc3aGqfWoVpHJUMoft+4hytzgMszqwgbJdo6eac7zIxlrzmeb4jb58APtc4aaLLQru2Gga9oPRyCqbXrD0TXnQ6GzjDNGwi6wP30NU9KaHWaGfeq1WSqsAIaIbi2oG4MeWJYX6SOB/CX1Jg8SJYzWQahpJeybE4Z8fR6ncuvfbjp9aet1aKsPB/DFPQ5VFaAS4oItVb0Ha4wkQ8YgJu5fEUK7X9KzuOwidja5RLZtwDPa0bBSveCw9D8FUsguilaoIu7ueDPTRueK4bQkYstOc2OvVlzInukyOzFXVgZsiV23FTHrQ5FqHd9nCUbfuhgrMqHRYQmRFUgDaeyY+B5ve3bQ4lT3qm282ngKi8AZ+clB0VeaFiQxpF8SCCRMu0bX3dsQMaXRUeSVDipf3ZMABl9xXbzEjqXoJzuvC6tCnEv8K3HzKbjz2S1876eGy7opIixaUMwDu9QOiPoSiFUY/xCsX8D1Im8Mv4eyzWNV3FL1U/GS3LZzkq/NuJdB7wjCib3ieHaYX/bvTpmAp/oO0+vbI2pzq9w71cpqQpsNsOZSGkgY2q1sO6u0I5jCFScdJVbJl0='
    
    decoded = base64.b64decode(signature)
    
    plaintextMessage="oi"
    
    # /tmp/public contains the public key
    alicePubKey = load_pem_public_key(open('/tmp/public', 'rb').read(),default_backend())  
    
    ciphertext = alicePubKey.verify(  
        decoded,  
        plaintextMessage,  
        padding.PSS(  
                mgf=padding.MGF1(algorithm=hashes.SHA256()),  
                salt_length=padding.PSS.MAX_LENGTH,  
        ),  
        hashes.SHA256()  
    )
    
    ciphertext = alicePubKey.verify(  
        decoded,  
        b'oi',  
        padding.PKCS1v15(),  
        hashes.SHA1()  
    )
    
    openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_SHA256);
    
    ciphertext = alicePubKey.verify(  
        decoded,  
        plaintextMessage,  
        padding.PKCS1v15(),
        hashes.SHA256()  
     )