c - 如何使变量盐用于 C 中的 crypt 函数?
问题描述
作为一项任务,我必须从该密码的哈希值(使用 crypt 生成)开始找到用户的密码。所以,我正在尝试创建一个变量 salt(2 个字母的字符串),然后我倾向于在 crypt 函数中使用它,直到结果与哈希匹配。但是,当我尝试制作这个变量 salt,而不是两个字符时,我得到 5/6(即使我将 salt 定义为大小为 2 的数组)。有谁知道如何解决这个问题?我知道很难解释,但请参阅下面的代码(和结果)。
char salt[2];
for (int i = 65; i < 91; i++)
{
salt[0] = i;
for (int j = 65; j < 91; j++)
{
salt[1] = j;
printf("%s\n", salt);
}
}
结果:AA →g AB →g AC →g AD →g AE →g AF →g ... ... ... ZW →g ZX →g ZY →g ZZ →g
这些额外的字符 (= �g) 是从哪里来的?
谢谢
解决方案
您正在尝试打印salt
为字符串,但实际上没有字符串。您有一个包含两个字符的数组。字符串以空字节终止。通过将此数组传递给printf
,它会尝试读取数组末尾以查找值为 0 的字节。读取数组末尾会调用未定义的行为,在这种情况下表现为打印额外的字符。
您需要在数组中为空终止符添加空间:
char salt[3];
salt[2] = 0;
推荐阅读
- java - Spring Profile - 如何包含添加 2 个配置文件的 AND 条件?
- c++ - C++ hashCode - 处理大数(+ mod 操作)
- oracle - 将 refcursor 视为表 - Oracle
- angularjs - AJAX 调用 MVC 操作方法失败
- javascript - 使用 JavaScript 时是否需要“.html”文件?
- javascript - 摇树无声
- c# - WritingAnimation 冻结 UI
- amazon-ec2 - 如何在 EC2 AWS 中使用 Route53 设置子域?
- c# - C# 编译器如何检测它必须以什么顺序解析文件/类型?
- matlab - 巨大的广播变量,没有parfor的优化代码?