将字符串转换为其小写 ascii 十六进制表示

Convert string to its lower case ascii hexadecimal representation

我正在为支付集成创建 sha-256 哈希 要求是(来自银行的说明):

第 1 步:创建字符串 例如 987654321012013:07:16-09:57:081.00826TopSecret

第 2 步:将创建的字符串转换为其 ascii 十六进制表示形式 例如 3938373635343332313031323031333a30373a31362d30393a35373a3038312e3030383236546f70536563726574

第 3 步:生成转换后的字符串的 sha-256 哈希 例如 3d7e75aa0b4e0e1d4a7ac87e451e64692cced46f4358ef35a69d96721341243c

问题: 我代码中的第 2 步给出大写字母 A、D、E、F 等,然后生成与给定示例不同的 sha-256。我需要生成具有小写十六进制表示的字节数组。

这是我的代码(在 .NET 4.5.2 中):

string hash = createHash( inputstring );

public static string createHash(string inputString)
{
      SHA256 sha256 = SHA256Managed.Create();
      byte[] bytes = Encoding.ASCII.GetBytes(inputString);
      // need my bytes to be lower case
      byte[] hash = sha256.ComputeHash(bytes);
      return GetStringFromHash(hash).ToLower();
}

感谢您的帮助。

你已经哈希了:

987654321012013:07:16-09:57:081.00826TopSecret

不是它的 ascii 十六进制表示法


我怀疑你想更换

// need my bytes to be lower case

类似

var inputToHash = BitConverter.ToString(bytes).Replace("-","").ToLower();

或者类似

var inputToHash = string.Concat(bytes.Select(b => b.ToString("x2")));

然后散列inputToHash(再次GetBytes),而不是bytes


如果您需要更高的性能,也许使用 stringbuilder 而不是 bitconverter 或 linq

缺少的步骤是转换为十六进制表示形式的字符串。我们可以将字符串的字符转换为 int 然后将其格式化为 .ToString("x2").

的十六进制
//Step 1: Create the string
string secret = "987654321012013:07:16-09:57:081.00826TopSecret";

//Step 2: Convert the created string to its ascii hexadecimal representation
string hexString = String.Concat(secret.Select(c => ((int)c).ToString("x2")));
// Has already lower case hex digits here. No action required.

//Step 3: generate sha-256 hash of the converted string
byte[] bytes = Encoding.ASCII.GetBytes(hexString);
SHA256 sha256 = SHA256Managed.Create();
byte[] hash = sha256.ComputeHash(bytes);

// Return the hash bytes as hexadecimal string
return GetStringFromHash(hash);

请注意,字符串是字符的枚举。即,String Class 实现了 IEnumerable<char>。因此,我们可以使用LINQ Select 来转换输入字符串的字符。请注意,在 C# 中,char 类型被视为 16 位数字类型。因此,您可以将它转换为 int(32 位)。


您可以这样实施 GetStringFromHash

private static string GetStringFromHash(byte[] hash)
{
    return String.Concat(hash.Select(b => b.ToString("x2")));
}

请注意 .ToString("x2") 生成小写十六进制数字。因此,不再需要 .ToLower()


请注意,使用 ASCII 的要求将字符集限制在 (char)1 .. (char)127 范围内。 (char)0 被排除在外,因为它在某些 API 中可能被误解为字符串终止符。因此,不确定此限制是否涉及秘密输入字符串或十六进制字符串或两者。将秘密字符串限制在 (char)1 .. (char)255 范围内可能就足够了,这将包括一些变音符号,但肯定会排除汉字,例如