繁体   English   中英

非常简单的地穴程序错误

[英]Very Simple Crypt Program Error

我正在创建一个程序,将文件作为输入并输出每行的解密密码。 该文件包含三行加密的密码。 我保证密码会解密为4个字母的单词。 鉴于我已经创建了字母的char []。 我在使用LOW LEVEL IO逐行读取文件并将生成的密码放入新文件时遇到问题。 任何及所有建议,不胜感激!

到目前为止,这是我的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define BUFFER_SIZE 1024

int main(void)
{

   int f = open("pass.txt", O_RDONLY);
   if (f < 0) 
      return 0;
   char buf[1024];
   while (my_fgets(buf, sizeof(buf), f)) 
      printf("%s\n", buf);
   close(f);
   const char *const pass = "$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B.";
   char *result;
   int ok;
   char guess[] = {'a','a','a','a','\0'};
   char ch1=guess[0], ch2=guess[1], ch3=guess[2], ch4=guess[3];
   do{
      for(ch1; ch1<='z';++ch1)
      {
         for(ch2='a';ch2<='z';++ch2)
         {
            for(ch3='a';ch3<='z';++ch3)
            {
               for(ch4='a';ch4<='z';++ch4)
               {
                  result = crypt(guess, pass);               
               }

            }
         }     
      }
   }while(strcmp(result, pass) != 0);
   puts(guess);
   return 0;
}

int my_fgets(char* buf, int len, int f)
{
   for (int i = 0; i < len; i++,buf++)
   {
      int count = read(f, buf, 1);
      if (!count || (buf[0] == '\n'))
      {
         buf[0] = 0;
         return i;
      }
   }
   return 0;
}

文本文件:

$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B.
$1$pkMKIcvE$WQfqzTNmcQr7fqsNq7K2p0
$1$0lMKIuvE$7mOnlu6RZ/cUFRBidK7PK.

以下代码块似乎有缺陷:

while (my_fgets(buf, sizeof(buf), f)) 
   printf("%s\n", buf);

所做的只是保留最后一行。 其他行将被读取并丢弃。

另外,不清楚在do ... while循环的每次迭代中ch1应该如何初始化。 您拥有:

for(ch1; ch1<='z';++ch1)
//  ^^^

那不会初始化ch1 这是一个没有副作用的表情。

我建议将密码解密的大多数逻辑放在其自己的函数中,并在读取每一行后调用该函数。

void decryptPassword(char* buf)
{
   printf("%s\n", buf);
   const char *const pass = "$1$6gMKIopE$I.zkP2EvrXHDmApzYoV.B.";
   char *result;
   int ok;
   char guess[] = {'a','a','a','a','\0'};
   char ch1=guess[0], ch2=guess[1], ch3=guess[2], ch4=guess[3];
   do{
      for(ch1; ch1<='z';++ch1)
      {
         for(ch2='a';ch2<='z';++ch2)
         {
            for(ch3='a';ch3<='z';++ch3)
            {
               for(ch4='a';ch4<='z';++ch4)
               {
                  result = crypt(guess, pass);               
               }
            }
         }     
      }
   }while(strcmp(result, pass) != 0);
   puts(guess);
}

int main(void)
{
   int f = open("soc.in", O_RDONLY);
   if (f < 0) 
      return 0;
   char buf[1024];
   while (my_fgets(buf, sizeof(buf), f)) 
      decryptPassword(buf);
   close(f);
   return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM