PHP中的C++ DSS签名验证

Posted

技术标签:

【中文标题】PHP中的C++ DSS签名验证【英文标题】:C++ DSS Signature verification in PHP 【发布时间】:2013-11-29 20:44:20 【问题描述】:

我有一个 C++ 应用程序来签名和验证一些数据,现在我想在 php 中验证数据,以下是我用于数据签名的 C++ 代码:

extern "C" __declspec(dllexport) BYTE* Sign(BYTE* bytdata)

    // Private key blob
    BYTE prKeyBlob[] = 7 , 2 , 0 , 0 , 0 , 34 , 0 , 0 , ...;

    HCRYPTPROV hProv = NULL;
    HCRYPTKEY prKey;
    HCRYPTHASH hHash;
    DWORD SignLen;

    if(CryptAcquireContext(&hProv, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT)) 
// Creating cryptography provider
    
        // Importing public key
        if(!CryptImportKey(hProv, prKeyBlob, sizeof(prKeyBlob), 0, 0, &prKey))
            return NULL;

        // Creating hash object
        if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))
            return NULL;

        if(!CryptHashData(hHash, bytdata, DATALEN, 0))
            return NULL;

        // Signing hashed value
        if(!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &SignLen))
            return NULL;

        BYTE* bytSign = (BYTE*)malloc(SignLen);
        if(CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, bytSign, &SignLen))
            return bytSign;
        else
            return NULL;
    
    else
        return NULL;

我已经尝试过 PHP openssl_verify() 但我无法正确输入公钥;在 C++ 中,我有一个公钥 blob 的字节数组,但我不知道如何从该数组中提取公钥,并将其与 php openssl 一起使用。

function verify($data, $sign)

    // fetch public key from certificate and ready it
    $cert = file_get_contents('./key.pem');
    $pubkeyid = openssl_get_publickey($cert) or die("KEY ERROR");

    // state whether signature is okay or not
    return openssl_verify($data, $sign, $pubkeyid, OPENSSL_ALGO_DSS1)?1:0;

但我从 openssl_get_publickey 得到“error:0906D06C:PEMroutines:PEM_read_bio:no start line”

我的 key.pem 文件内容:

-----BEGIN PUBLIC KEY-----
fkNkBaO1Y0ZruN8LD8BGm3IF00bbSNZN/ql8ak0duOjbzDP229rnkPFDIPihbO
9Uw6369b3suwqvPY3w+VzwRKKfLG99KiMxMgF3H3IvJl8hyzQf6qJGJ9X
sonzhrTqDeugT9fa2FnpY5pg+7g+6MqSRh1T0qTii9JFcwVf5r/o=
-----END PUBLIC KEY-----

提前谢谢你。

【问题讨论】:

这不是一个让您免费获得实现的论坛。请向我们展示您的尝试。 “我已经尝试过 PHP openssl_verify() 但我无法正确提供公钥”并不是错误描述。 【参考方案1】:

PHP 文档中有一个明确的指示,说明出了什么问题。如果您使用openssl_get_publickey,PHP 将从证书中检索公钥。不幸的是,你没有证书,你只有一个公钥。

因此有两种选择:围绕您的公钥创建一个(自签名?)证书,或者在 PHP 中找到一个读取 PEM 编码的公钥的函数。不幸的是,最后一个功能似乎没有发挥作用。

【讨论】:

感谢您的回复我的问题是我无法将我的公钥 blob 转换为 pem 或证书,反之亦然,但是我已经更改了我的 C++ 代码并使用 C++ 的 openssl 库来解决问题

以上是关于PHP中的C++ DSS签名验证的主要内容,如果未能解决你的问题,请参考以下文章

PHP 验证 Paypal webhook 签名

使用 PHP 从 login.microsoftonline.com 验证 JWT 中的签名

使用 PHP 的 JWT“签名验证失败”

如何在 PHP 中生成 QuickBlox 身份验证签名?

php---进行签名验证

我们如何在 C++ 和 windows API 中验证 openssl 数字签名