代码之家  ›  专栏  ›  技术社区  ›  mhenrixon

如何将php的openssl签名移植到C?

  •  1
  • mhenrixon  · 技术社区  · 14 年前

    function sign($method, $uuid, $data) {
        $merchant_private_key = openssl_get_privatekey(file_get_contents('merchant_private_key.pem'));
        $plaintext = $method . $uuid . serialize_data($data);
        **openssl_sign($plaintext, $signature, $merchant_private_key);**
        return base64_encode($signature);
    }
    

    api可以在 http://php.net/manual/en/function.openssl-sign.php . 我从哪里开始?我不知道open\u ssl登录php在幕后做了什么。

    任何一个既懂php又懂C的人都可以帮忙,或者至少有人能解释一下openssl签名在后台做了什么,这样我就可以移植它了。

    编辑:2010-08-18 我找不到使用openssl的方法,它一直说它不能加载managedopenssl.dll。我想是因为我的机器是x64。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Darin Dimitrov    14 年前

    这里的困难在于读取和解码私钥。你可以用这个 following openssl helper class

    public static string Sign(string method, string uuid, string data)
    {
        string merchantPrivateKey = File.ReadAllText("merchant_private_key.pem");
        byte[] der = opensslkey.DecodePkcs8PrivateKey(merchantPrivateKey);
        using (RSACryptoServiceProvider rsa = opensslkey.DecodePrivateKeyInfo(der))
        using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
        {
            // This will contain the data to sign
            byte[] dataToSign = Encoding.Default.GetBytes(method + uuid + data);
            byte[] signature = rsa.SignData(dataToSign, md5);
            return Convert.ToBase64String(signature);
        }
    }
    

    在这个例子中,我使用了MD5,但是您可以使用任何适合您的场景的东西。我想 openssl_sign 默认情况下使用SHA1。

        2
  •  1
  •   mhenrixon    14 年前

    我已经找到了解决问题的办法。有一个图书馆叫 ChilKat 我们将使用的。找到了答案 here