我正在用C编写一个程序来破解基于DES的加密密码,它将密码作为参数并给我密码。
我所做的是通过在同一个盐(前两个字母)中加密它们来尝试500000个单词,然后将它与argv [1](我想要破解的加密密码)进行比较。我认为它被称为蛮力(尽一切可能)。 无论如何我的问题是,当我加密单词时,我得到不同的加密(相同的盐和相同的密钥),因为我看到我打印数字,单词和加密(只是为了检查它是否有效)你可以删除它们,如果你想! p>
btw我从一些网站上获取了从文件中读取行的代码,因为我是C的新手,我还没有学过文件!
请保持温柔我真的很新:D,如果您对设计或代码有任何评论,请告诉我:)!
BTW我正在从XHarved那里学习cs50课程,这是黑客版,所以我不必这样做。这就像是额外的功课!
示例:当我在crypt函数中隐藏单词“crimson”时,它变为50yoN9fp966dU,但是当我从文件中导入它然后加密它时,它就是其他东西(50fy ......)。
很抱歉这个长问题:|!
如果您需要,请查看: http://d2o9nyf4hwsci4.cloudfront.net/2014/x/psets/2/hacker2/hacker2.html#_passwords_em_et_cetera_em
#include <stdio.h>
#include <unistd.h>
#include <cs50.h>
#include <string.h>
#define _XOPEN_SOURCE
char *crypt(const char *key, const char *salt);
int main(int argc, char *argv[])
{
static string cryptedText[500000];
static char word[500000][50];
string salt;
int i = 0;
if (argc != 2)
return 1;
FILE *fp;
fp=fopen("wordsTest.txt","r");
if(fp==NULL)
{
printf("Unable to open file.\n");
exit(1);
}
// the first 2 characters are the salt.
salt = strcat(&argv[1][0], &argv[1][1]);
/*crypt every word in wordsTest with the same "salt" and
test if it equals argv[1](crypted pass) */
do
{
if(fgets(word[i],50,fp)!=NULL)
printf("%i ----> %s",i , word[i]);
cryptedText[i] = crypt(word[i], salt);
printf("%s\n", cryptedText[i]);
i++;
}
while (strcmp(cryptedText[i - 1], argv[1]) != 0);
printf ("%s\n", word[i - 1]);
}
我认为cryptedText变量不需要是500000(我每次都可以覆盖它)
答案 0 :(得分:1)
如我的评论中所述:
来自
fgets()
的输入包括换行符;你不要消除它。因此,您要将"crimson"
的加密与"crimson\n"
进行比较,答案必须不同。
你在评论中提到:
...由于某种原因,我必须在
strcmp
的while循环中替换strncmp
(它没有像它应该的那样比较),并将“int n”设置为13。
使用常规加密,由于加密数据是一堆二进制数据,可能包含嵌入的空字节'\0'
,您可能会使用memcmp()
而不是使用strcmp()
或{{ 1}}。
但是,由于您使用的是strncmp()
,因此输出的编码类似于Base-64。它生成一个(固定长度)字符串,但您必须复制该字符串以保留该值。它将在下一次调用crypt()
时被覆盖。所以,你可能正在忙着将指针存入指针数组。 (旁白:crypt()
标题,特别是其<cs50.h>
类型,很烦人!)
除了:
任何用途都必须在包含任何系统标头之前出现string
之类的定义。此外,您应指定所需的版本号;您应该使用600或700,具体取决于您的平台支持的内容。您不必在代码中编写#define _XOPEN_SOURCE
函数的声明。出现问题的原因是crypt()
错位和误估。
此外,行#define _XOPEN_SOURCE
很奇怪,并调用未定义的行为。这很奇怪,因为它试图将从salt = strcat(&argv[1][0], &argv[1][1]);
的第二个字符开始的字符串添加到argv[1]
的末尾,并调用未定义的行为,因为(a)字符串重叠和(b)您正在写进入无法使用的空间。