首页 文章

使用基于DES的加密密码的破解功能,不起作用?

提问于
浏览
0

我正在用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 回答

  • 1

    正如我的评论中所述:

    来自fgets()的输入包括换行符;你不要消除它 . 因此,您将“crimson”的加密与“crimson \ n”进行比较,答案必须不同 .

    你在评论中提到:

    ...由于某种原因,我必须在strncmp的while循环中替换strcmp(它没有像它应该的那样比较),并将“int n”设置为13 .

    使用通用加密,由于加密数据是一块二进制数据,可能包含嵌入的空字节 '\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 .

相关问题