首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C# HMAC SHA256转换为SHA256

将C# HMAC SHA256转换为SHA256
EN

Stack Overflow用户
提问于 2016-03-16 08:43:00
回答 1查看 890关注 0票数 1

我有一个C#方法,我必须将它转换为PHP。我试过几件事,但结果还是不一样。不幸的是,我无法更改C#应用程序上的任何内容。它必须保持原样。也许你们中的一个能帮忙?

C#:

代码语言:javascript
复制
static public void Main ()
{
    string StringToSign = "test";
    string Key = "123456";

    //Calculate Signature
    string Signature = CalculateSignature(StringToSign, Key);

    Console.WriteLine ("StringToSign: " + StringToSign);
    Console.WriteLine ("Key: " + Key);
    Console.WriteLine ("Signature Caculated: " + Signature + "\r\n");
}

static private string CalculateSignature(String StringToSign, String Key)
{
    Encoding enc = Encoding.GetEncoding(65001);

    byte[] KeyHex = StringHexValuesToByteArray(Key);
    byte[] StringToSign_byte = enc.GetBytes(StringToSign);

    //Check Signature
    HMACSHA256 hmac = new HMACSHA256(KeyHex);
    byte[] hashValue = hmac.ComputeHash(StringToSign_byte);

    return BitConverter.ToString(hashValue).Replace("-", "");
}

static public byte[] StringHexValuesToByteArray(string str)
{
    if (str.Length % 2 != 0)
        return null;

    string s = string.Empty;
    byte[] ret = new byte[str.Length / 2];

    for (int run = 0; run < str.Length / 2; run++)
    {
        s = str.Substring(run * 2, 2);
        ret[run] = Convert.ToByte(s, 16);
    }
    return ret;
}

PHP:

代码语言:javascript
复制
public function send() {

    $stringToSign = 'test';
    $key = '123456';

    //Calculate Signature
    $signature = $this->calculateSignature($stringToSign, $key);

    print_r("StringToSign: " . $stringToSign . PHP_EOL);
    print_r("Key: " . $key . PHP_EOL);
    print_r("Signature Caculated: " . $signature . PHP_EOL);
}

private function calculateSignature($stringToSign, $key) {

    // check signature
    $hash = strtoupper(hash_hmac('sha256', $stringToSign, $key, false));
    return $hash;
}

为了更好地理解,下面是上面代码块的输出:

C#

StringToSign:测试 密钥: 123456 签名累积: DA3617974490FB780F04F06287BF93B0F24A7F15970471146428B943FFDC7850

StringToSign:测试 GroupKey: 123456 签名累积: 9D2BB116E1DF997FFE8A5139FC1D187F976C19579A138414A112BC2E39020EBA

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-16 08:48:10

如果您想修改PHP使其与C#等效

变化

代码语言:javascript
复制
$hash = strtoupper(hash_hmac('sha256', $stringToSign, $key, false));

代码语言:javascript
复制
$hash = strtoupper(hash_hmac('sha256', $stringToSign, hex2bin($key), false));

请务必检查代码是否适用于非ASCII字符,如àèéìòù

理想在这里

如果您想修改C#代码,使其与PHP等效

你让一切变得复杂:

代码语言:javascript
复制
static private string CalculateSignature(String stringToSign, String key)
{
    byte[] key_byte = Encoding.UTF8.GetBytes(key);
    byte[] stringToSign_byte = Encoding.UTF8.GetBytes(stringToSign);

    //Check Signature
    HMACSHA256 hmac = new HMACSHA256(key_byte);
    byte[] hashValue = hmac.ComputeHash(stringToSign_byte);

    return BitConverter.ToString(hashValue).Replace("-", "");
}

什么都没有。而不是使用Encoding.GetEncoding(65001),它通常更好地使用Encoding.UTF8,因为它对每个人来说都更清晰。

注意,编码可能会出现问题。尝试计算类似àèéìòù的hmac,以查看PHP使用哪种编码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36030528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档