如何将php的openssl_sign移植到C#?

时间:2010-08-11 09:13:33

标签: c# php

我需要将以下代码从php转换为C#。我需要使用哪些库/命名空间?

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找到。我从哪里开始?我不知道php中的open_ssl签名是什么做的。

任何能够提供帮助的人都知道php和C#,或者有人至少可以解释openssl_sign在后台做什么,以便我可以移植它。

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

2 个答案:

答案 0 :(得分:1)

这里的困难在于读取和解码私钥。您可以使用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。

答案 1 :(得分:1)

感谢您的建议。

我找到了解决问题的方法。我们将使用名为ChilKat的库。找到了答案here。不幸的是,这在我的x64机器上不起作用。幸运的是,我们的服务器仍然是x86,所以我们有更多时间来研究解决方法。