如何在 c++ 中将字符串 say "test" 转换为无符号 int
How to convert a string say "test" to unsigned int in c++
我必须使用一种加密算法,该算法将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可用的一些同等哈希算法,这是最好的实践,通常足以传输和比较密码。
您应该在编写更多代码之前开始阅读有关该问题的基础知识,否则您的应用程序的安全级别不会比没有哈希/加密更好,但是由于错误地站在安全方面的感觉。例如,从这里开始。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 如何在 c++ 中将字符串 say "test" 转换为无符号 int
- 代码一直说:“[错误]无法将参数'1'的'float*'转换为'float'到'void test(flo
- Boost Test Boost _CHECK_EQUAL,类型可转换为数组