如何在 c++ 中将字符串 say "test" 转换为无符号 int

How to convert a string say "test" to unsigned int in c++

本文关键字:test 转换 int 无符号 say 字符串 c++      更新时间:2023-10-16

我必须使用一种加密算法,该算法将Unsigned INT作为输入。为此,我想将密码转换为alpha数字8字符串到int。

我使用以下代码,不确定它是否正确。我想将角色说"测试"转换为未签名的整数。

我确实获得了输出值。但是我不确定这是否是正确的方法以及是否有任何副作用。

您能解释一下这里实际发生的事情吗?

unsigned int ConvertStringToUInt(CString Input)
{
    unsigned int output;
    output = ((unsigned int)Input[3] << 24);
    output += ((unsigned int)Input[2] << 16);
    output += ((unsigned int)Input[1] << 8);
    output += ((unsigned int)Input[0]);
    return output;
}

对于"ABCD"的输入,ConvertStringToUInt的输出将为0x44434241,因为:

  • 0x41是'A'的ASCII代码
  • 0x42是'B'的ASCII代码
  • 0x43是'C'的ASCII代码
  • 0x44是'D'的ASCII代码

<< shift左运算符。

所以我们有:

0x44 << 24 = 0x44000000
0x43 << 16 = 0x00430000
0x42 << 8  = 0x00004200
output =
          0x44000000
        + 0x00430000
        + 0x00004200
        + 0x00000041
        ============
          0x44434241

请注意,您的ConvertStringToUInt函数仅在提供的字符串的长度为正好为4 时起作用,因此此功能对您的情况没有用,因为密码的长度为 8

您无法将8个字符字符串的唯一映射到32位整数。

  • (10 26 26) ^ 8是218,340,105,584,896(数字 上案例和下案字母)
  • (10 26) ^ 8是2,821,109,907,456(数字 案例不敏感的字母)
  • 2 ^ 32是4,294,967,296(一个32位未签名的INT)

因此,如果您需要将8个字符转换为32位数字,则需要使用哈希。这意味着多个密码将映射到同一键。

请注意,这不是加密,因为映射不是可逆的。它不能可逆。这可以在数学上得到证明。

哈希功能上的Wikipedia页面是开始学习这一点的好地方。还有鸽子洞原理上的页面。


但是,还应注意,8个字符密码太小而无法安全。而且,如果您使用32位代码,则蛮力攻击将很容易。

您要做的是重新发明散列算法,非常差。我强烈建议您使用SHA-256或您系统的LIBS可用的一些同等哈希算法,这是最好的实践,通常足以传输和比较密码。

您应该在编写更多代码之前开始阅读有关该问题的基础知识,否则您的应用程序的安全级别不会比没有哈希/加密更好,但是由于错误地站在安全方面的感觉。例如,从这里开始。