我正在用C编写程序来破解基于DES的加密密码,它将密码作为参数并给我密码 .
我所做的是通过在相同的盐(前2个字母)中加密它们来尝试500000个单词,然后将它与argv [1](我想要破解的加密密码)进行比较 . 我认为它被称为蛮力(尝试一切可能) . 无论如何我的问题是,当我加密单词时,我得到不同的加密(相同的盐和相同的密钥),因为我看到我打印数字,单词和加密(只是为了检查它是否有效)你可以删除它们,如果你想!
顺便说一下,我从一些网站上获取了从文件中读取行的代码,因为我是C的新手,我还没有学过文件!
请温柔我真的很新:D,如果你有设计或代码的评论,请告诉我:)!
顺便说一下,我正在从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(我可以每次都覆盖它)
1 回答
正如我的评论中所述:
你在评论中提到:
使用通用加密,由于加密数据是一块二进制数据,可能包含嵌入的空字节
'\0'
,您可能会使用memcmp()
而不是使用strcmp()
或strncmp()
.但是,由于您使用的是
crypt()
,因此输出的编码类似于Base-64 . 它生成一个(固定长度)字符串,但您必须复制该字符串以保留该值 . 它将被下一次调用crypt()
覆盖 . 所以,你可能正忙着将相同的指针存入指针数组 . (旁白:那个<cs50.h>
Headers ,特别是它的string
类型,很烦人!)在旁边:
任何用途,必须在包含任何系统头之前出现_790563之类的定义 . 此外,您应指定所需的版本号;您应该使用600或700,具体取决于您的平台支持的内容 . 您不必在代码中编写
crypt()
函数的声明 . 出现问题的原因是#define _XOPEN_SOURCE
错位和错误估价 .此外,行
salt = strcat(&argv[1][0], &argv[1][1]);
很奇怪,并调用未定义的行为 . 这很奇怪,因为它试图将从argv[1]
的第二个字符开始的字符串添加到argv[1]
的末尾,并调用未定义的行为,因为(a)字符串重叠,(b)你可以使用.790569_t .