OpenSSL ECB 非 64 位多纯文本
OpenSSL ECB non 64 bits multiple plain text
我在尝试使用 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);
}
但是,我从解密得到的明文和我用来创建密文的明文不一样
DES ECB 是一种具有 64 位(或 8 字节)块的块模式密码,设计为仅适用于 数据,即 a块大小的倍数。加上 OpenSSL DES_ecb_encrypt
并不是真正的 ECB mode 而是 DES 块 primitive:它加密或解密一个恰好 64 位的块不多也不少。你正在尝试做的事情不应该也不能工作。
需要处理可变长度数据的正确设计的密码系统,许多人都这样做,要么使用流密码,流模式(如 CTR),要么使用带填充的块模式(但不是 ECB,见下文) ——有多种标准可供选择; OpenSSL 的 EVP_{Encrypt,Decrypt,Cipher}*
模块默认使用 PKCS5/7 填充,但您可以将其关闭。
注意 DES 已被破坏和过时 20 年,在大多数使用 ECB 模式的应用程序中,即使使用良好的原语,它也允许降低或消除安全性的攻击。如果你打算真正保护某些东西,放弃这个并使用一个由知道他们在做什么的人设计的程序——但这对 SO 来说是题外话。
关于 SO 的更多主题,您的程序使用了错误的指针类型来调用 DES_ecb_encrypt
,您的编译器应该已经检测到并警告您;但是,由于 C 定义数组的方式,任何实现都不太可能因为这个错误而实际失败。此外,您没有为 exit malloc memcpy
#include 所需的原型,这可能会导致 size_t
大于 int
的系统出现错误或崩溃。
我在尝试使用 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);
}
但是,我从解密得到的明文和我用来创建密文的明文不一样
DES ECB 是一种具有 64 位(或 8 字节)块的块模式密码,设计为仅适用于 数据,即 a块大小的倍数。加上 OpenSSL DES_ecb_encrypt
并不是真正的 ECB mode 而是 DES 块 primitive:它加密或解密一个恰好 64 位的块不多也不少。你正在尝试做的事情不应该也不能工作。
需要处理可变长度数据的正确设计的密码系统,许多人都这样做,要么使用流密码,流模式(如 CTR),要么使用带填充的块模式(但不是 ECB,见下文) ——有多种标准可供选择; OpenSSL 的 EVP_{Encrypt,Decrypt,Cipher}*
模块默认使用 PKCS5/7 填充,但您可以将其关闭。
注意 DES 已被破坏和过时 20 年,在大多数使用 ECB 模式的应用程序中,即使使用良好的原语,它也允许降低或消除安全性的攻击。如果你打算真正保护某些东西,放弃这个并使用一个由知道他们在做什么的人设计的程序——但这对 SO 来说是题外话。
关于 SO 的更多主题,您的程序使用了错误的指针类型来调用 DES_ecb_encrypt
,您的编译器应该已经检测到并警告您;但是,由于 C 定义数组的方式,任何实现都不太可能因为这个错误而实际失败。此外,您没有为 exit malloc memcpy
#include 所需的原型,这可能会导致 size_t
大于 int
的系统出现错误或崩溃。