0

当我尝试使用 OpenSSL ECB 问题对非 64 位多纯文本进行加密和解密时遇到问题。

我有两个 .c 文件,一个要加密,另一个要解密。

这是第一个。

// FILE ENCRYPTION
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <openssl/des.h>
#include <sys/types.h>

void merror(char *msg) {
  perror(msg);
  exit(0);
}

char *Encriptar(char *Key, char *Msg, int size) {
  static char*    Res;
  int       n=0;
  DES_cblock      Key2;
  DES_key_schedule schedule;
  Res = ( char * ) malloc( size );

  memcpy( Key2, Key,8);
  DES_set_odd_parity( &Key2 );
  DES_set_key_checked( &Key2, &schedule );
  DES_ecb_encrypt((unsigned char *)Msg, (unsigned char *)Res, &schedule,DES_ENCRYPT);
  return (Res);
}

#define LINELEN 8

int main(int argc, char *argv[]) {
  int n, fdp, fdc;
  char key[]="password";
  unsigned char buf[LINELEN];

  if (argc < 3) {fprintf(stderr,"USO %s <fileP> <fileC>\n",argv[0]);exit(0);}
  if ((fdp = open (argv[1], O_RDONLY)) == -1)
     merror ("Open FDP");
   if ((fdc = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 00744)) == -1)
      merror ("Open FDC");
   while ((n = read(fdp, buf, LINELEN)) > 0) 
   write (fdc, Encriptar(key, buf, n), n);

   close (fdp);
   close (fdc);
   exit (0);
}

这是第二个

//FILE DECRYPTION

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <openssl/des.h>
#include <sys/types.h>

void merror(char *msg) {
  perror(msg);
  exit(0);
}

char *Decriptar(char *Key, char *Msg, int size) {
  static char* Res;
  int n=0;
  DES_cblock      Key2;
  DES_key_schedule schedule;
  Res = ( char * ) malloc( size );
  memcpy( Key2, Key,8);
  DES_set_odd_parity( &Key2 );
  DES_set_key_checked( &Key2, &schedule );
  DES_ecb_encrypt((unsigned char *)Msg, (unsigned char *)Res,&schedule,DES_DECRYPT);
  return (Res);
}

#define LINELEN 8
int main(int argc, char *argv[]) {
int n, fdp, fdc;
char key[]="password";
unsigned char buf[LINELEN];

if (argc<3) {fprintf(stderr,"USO %s <fileC> <fileP>\n", argv[0]); exit(0);}

if ((fdc = open (argv[1], O_RDONLY)) == -1)
merror ("Open FDP");
if ((fdp = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 00744)) == -1)
merror ("Open FDC");

while ((n = read(fdc, buf, LINELEN)) > 0) 
write (fdp, Decriptar(key, buf, n), n);

close (fdp);
close (fdc);

exit (0);
}

但是,我从解密中得到的纯文本与我用来创建密文的纯文本不同。

4

1 回答 1

1

DES ECB 是具有 64 位(或 8 字节)块的块模式密码,旨在仅处理块大小的倍数的数据。另外,OpenSSLDES_ecb_encrypt并不是真正的 ECB模式,而是 DES 块原语:它加密或解密一个正好为 64 位的块,不多也不少。您正在尝试做的事情不应该也不能工作。

需要处理可变长度数据的正确设计的密码系统,许多人都这样做,要么使用流密码,流模式(如 CTR),要么使用带有填充的块模式(但不是 ECB,见下文)——有一个可供选择的标准数量;OpenSSL 的EVP_{Encrypt,Decrypt,Cipher}*模块默认使用 PKCS5/7 填充,尽管您可以将其关闭。


注意 DES 已经被破坏和过时了二十年,在大多数使用 ECB 模式的应用程序中,即使使用了良好的原语,它也允许降低或消除安全性的攻击。如果您打算真正保护某些东西,请放弃它并使用由知道自己在做什么的人设计的程序——但这对 SO 来说是题外话。


对于 SO,您的程序使用了错误的指针类型来调用DES_ecb_encrypt,您的编译器应该已经检测到并警告您;然而,由于 C 定义数组的方式,任何实现都不太可能因为这个错误而实际失败。此外,您没有#include 所需的原型exit malloc memcpy,这可能会导致size_t大于int.

于 2017-11-28T07:25:40.520 回答