使用evp库进行openssl加密和解密

时间:2010-10-26 10:16:33

标签: security

我有一个纯文本,我有密文,我的任务是找到声明的密文的密钥。关键是像字典一样的单词列表。我已经用c编写了代码,它编译完美并使用所有密码创建文件。 我面临的问题是,每次运行代码时,密文都是完全不同的。我不知道我犯了什么错误。 以下是我编写的代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/evp.h>

int main()
{
  int i;
  char words[32], t;
  FILE *key, *outFile;
  const char *out = "Output.txt";
  unsigned char outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
  unsigned char iv[] = "0000000000000000";
  int outlen, tmplen;
  int num;
  EVP_CIPHER_CTX ctx;
  EVP_CIPHER_CTX_init(&ctx);
  char inText[] = "This is a top secret.";
  char cipherText[] = "8d20e5056a8d24d0462ce74e4904c1b513e10d1df4a2ef2ad4540fae1ca0aaf9";
  key = fopen("words.txt", "r");
  if( remove("ciphertext.txt") == -1 ) {
    perror("Error deleting file");
  }
  outFile = fopen("ciphertext.txt", "a+");
  if( key < 0 || outFile < 0 )
    {
      perror ("Cannot open file");
      exit(1);
    }

  char pbuffer[1024];


  while ( fgets(words,32, key) )
    { 
      i=strlen(words);
      words[i-1]='\0';
      //printf("%s",words);
      i = 0;
      EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, words, iv);
      if(!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inText, strlen(inText)))
        {
          EVP_CIPHER_CTX_cleanup(&ctx);
          return 0;
        }
      if(!EVP_EncryptFinal_ex(&ctx, outbuf + outlen, &tmplen))
        {
          EVP_CIPHER_CTX_cleanup(&ctx);
          return 0;
        }
      outlen += tmplen;
      print_hex(outbuf, outlen, outFile);
    }
  fclose(key);
  fclose(outFile);
  return 1;
}

int print_hex(unsigned char *buf, int len, FILE *outFile)
{
  int i,n;
  char x='\n';
  for ( i = 0; i < len; i++ )
    {
      fprintf(outFile,"%02x",buf[i]); 
    } 
  fprintf(outFile,"%c",x);
  return (0); 
}

因为关键是一个词。词汇表中的单词大小可以是&lt;或者&gt; 16个字节,根据我对openssl的研究,据说如果块长度不符合16字节,将会有pkcs#5填充。是否也是钥匙的情况。

我声明的密文与我从程序生成的密文不匹配,我无法找到密文的密钥。

我需要专家的帮助。如果有人帮助我摆脱困境,我将不胜感激

提前致谢

2 个答案:

答案 0 :(得分:0)

你到底想要实现什么目标?您的代码看起来像是试图使用密码字典进行暴力攻击......我不确定我应该尝试帮助它!

我认为这只是一个练习...

首先让我感到震惊的是你将初始化向量(变量iv)设置为ASCII零字符串。这几乎肯定是错的,你可能需要使用二进制零。

unsigned char iv [16] = {0};

我不知道你所拥有的密文是如何生成的(可能是由另一个程序生成的),但我想这个程序并没有使用字典单词本身作为关键字,而是经历了某种关键的推导过程先。您使用128位AES作为加密算法,因此您的密钥长度应为16个字节。你可以 通过填充来实现这一点,正如你的建议,但更常见的是通过一些混合密钥位的过程使其看起来更随机并在整个过程中分配密钥位键。散列单词并使用散列函数的输出而不是单词本身作为键是不常见的。另一种可能性是字典单词可以用作基于密码短语的密钥导出函数的输入,例如PKCS#5中定义的密钥导出函数。

你真的需要知道如何使用这个词来生成一个密钥,然后才能进一步了解它。

答案 1 :(得分:0)

非常感谢您的回复。

是的,这只是一个练习,就像字典攻击一样。 我应该使用iv加零而不是ASCII零,这是我犯过的错误之一。

我认为给定的密文纯粹是用单词列表中的单词加密而没有任何散列,可能是填充已完成但我不确定因为我应该从密文中找到密钥。字列表可能包含小于16字节的字或大于16字节的字。所以我想的问题可能是填充。 我想可能是如果字长小于16字节,那么我必须用ASCII零或类似的东西填充。你建议我做哪一个,而且推动不多可能是我完成了。

由于