【问题标题】:Crack function for encrypted passwords with C’s DES-based, not working?基于 C 的 DES 的加密密码破解功能,不起作用?
【发布时间】:2014-05-02 20:56:07
【问题描述】:

我正在用 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(我可以每次都覆盖它)

【问题讨论】:

  • 我不确定你在问什么。您有比“我的 DES 蛮力破解器不起作用”更具体的问题吗?
  • 我的意思是,当我编译并运行我的程序时,它会从一个名为“wordsTest”的文件中加密 500000 个单词,然后将每个单词与加密密码(带有 argv[1] 的那个)进行比较。我的问题是当它从文件中加密单词时,它给了我不同的加密!
  • fgets() 的输入包括换行符;你没有消除它。因此,您将"crimson" 的加密与"crimson\n" 的加密进行比较,答案肯定不同。
  • Thx @JonathanLeffler !!!,我想这就是我没有阅读 fgets 函数的手册页的原因:P。它现在可以工作了,但由于某种原因,我不得不将 while 循环中的 strcmp(我没有像预期的那样进行比较)替换为 strncmp 并将“int n”设置为 13。无论如何你不应该回答不评论:呸!

标签: c encryption crypt cs50


【解决方案1】:

正如我在评论中指出的那样:

fgets() 的输入包括换行符;你没有消除它。因此,您将"crimson""crimson\n" 的加密进行比较,答案肯定不同。

您在评论中提到:

...由于某种原因,我不得不将 while 循环中的 strcmp(它没有按预期进行比较)替换为 strncmp,并将“int n”设置为 13。

对于一般加密,由于加密数据是二进制数据块,其中可能包含嵌入的空字节'\0',因此您可能会使用memcmp(),而不是使用strcmp()strncmp()

但是,由于您使用的是crypt(),因此输出的编码类似于 Base-64。它产生一个(固定长度)字符串,但您必须复制该字符串以保留该值。它将被下一次调用crypt() 覆盖。因此,您可能正忙于将相同的指针存储到指针数组中。 (除此之外:&lt;cs50.h&gt; 标头,尤其是它的 string 类型,很烦人!

旁白:

为了有任何用途,#define _XOPEN_SOURCE 之类的定义必须出现在 any 系统标头之前。此外,您应该指定所需的版本号;您可能应该使用 600 或 700,这取决于您的平台支持什么。您不必在代码中编写 crypt() 函数的声明。出现问题的原因是 #define _XOPEN_SOURCE 放错了位置和估值错误。

另外,salt = strcat(&amp;argv[1][0], &amp;argv[1][1]); 行很奇怪,会调用未定义的行为。这很奇怪,因为它试图将从argv[1] 的第二个字符开始的字符串添加到argv[1] 的末尾,并调用未定义的行为,因为(a)字符串重叠并且(b)你正在写入的空间是'不可用。

【讨论】:

  • 是的,好吧。我将在这周的讲座中学习指针(最后:p),所以我将使用 char * 而不是字符串!并感谢您的设计建议:D! - 顺便说一句,在 cs50 页面中它没有指定使用哪个版本,我不知道它是什么。但我认为这解释了它! [链接]stackoverflow.com/questions/5378778/…
  • 是的;这是一个不错的解释。
  • 刚想加,才发现这叫字典攻击xD,看来得加真正的暴力破解了!
  • 再一次,我没有阅读关于 strcat 的手册页 :|, strncpy(salt, argv[1], 2);然后 (char not char *) salt[3] = '\0';我没有得到第一个错误,尽管正如你解释的那样,我应该得到一个!
猜你喜欢
  • 2017-04-21
  • 2012-03-30
  • 2015-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多