2017-11-28 17 views
0

OpenSSL ECB 문제를 사용하여 비 64 비트 복수 일반 텍스트를 암호화하고 해독하려고 할 때 문제가 있습니다.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); 
} 

하지만, 내가 마일 암호 텍스트를 만드는 데 사용되는 일반 텍스트와 동일하지 암호문 해독 ES에서받은 일반 텍스트입니다.

+0

'Encriptar'에서 DES 출력을 보유하는 데 필요한 것보다 작은 버퍼를 할당합니다. 이것은 당신이 암호문의 일부를 버리고 있다는 것을 의미합니다 (버퍼 오버런은 말할 것도 없습니다). 거대한 조회 테이블을 나타내는 방법으로 ECB 모드의 암호 (한 번 입력)를 생각해보십시오. 암호 해독의 경우 암호문을 일반 텍스트를 조회하는 데 사용하는 색인으로 생각하십시오. 암호문 *을 전혀 변경하지 않으면 다른 평문을 찾아 볼 수 있으며 "비슷한"색인을 찾은 값 사이에는 예측 가능한 관계가 없습니다. – lockcmpxchg8b

+0

또한 [블록 암호는 무엇입니까 pkcs 패딩] (https://www.google.com/search?q=block+cipher+what+is+pkgcs+padding) – jww

답변

1

DES ECB의 64 비트 (8 옥텟) 블록의 블록 모드로 암호화하며 블록 크기의 배수 인 에서만 데이터 작동하도록 설계된다. 더하기 OpenSSL DES_ecb_encrypt은 실제로 모드이 아니라 DES 블록 프리미티브입니다. 정확하게 64 비트 이하의 한 블록을 암호화하거나 해독합니다. 당신이하려는 일은해서는 안되며 일할 수도 없습니다.

스트림 암호, 스트림 모드 (CTR과 같은) 또는 패딩과 함께 블록 모드 (ECB는 아님, 아래 참조) 중 하나를 사용하여 가변 길이 데이터를 처리해야하는 적절히 설계된 암호 시스템 - - 선택할 수있는 표준이 많이 있습니다. OpenSSL의 EVP_{Encrypt,Decrypt,Cipher}* 모듈은 기본적으로 PKCS5/7 패딩을 사용하지만 사용자가 끌 수 있습니다.


주 DES는 깨진와 20 년간 무용지물이었고, ECB 모드가 좋은 원시적으로도 사용 된 대부분의 응용 프로그램에 감소 시키거나 보안을 제거 공격을 할 수 있습니다. 실제로 무언가를 보호하려면이 것을 버리고 자신이하는 일을 알고있는 사람이 고안 한 프로그램을 사용하십시오. SO에 대한 ontopic


더, 당신의 프로그램은 컴파일러가 감지에 대해 경고해야 DES_ecb_encrypt에 대한 호출에 대한 잘못된 포인터 타입을 사용한다; 그러나 C가 배열을 정의하는 방식 때문에이 오류 때문에 구현이 실제로 실패하지는 않습니다. 또한 exit malloc memcpy에 필요한 프로토 타입을 # 포함하지 않았으므로 size_tint보다 큰 시스템에서 버그 또는 충돌이 발생할 수 있습니다.

+0

... 이것은 SX가 아니라 SO입니다.) – lockcmpxchg8b

+0

대단히 고마워, 이건 내가 내 보안 수업에서 가진 숙제 야. 그래서 나는 모든 것을 시험해 봤고, 그래서 내가 여기서 물어 보았다. 이제는 암호화하기 전에 일반 텍스트에 비트를 더 추가하려고 시도 할 것입니다. 나는 그것이 작동해야한다고 생각한다. –

+0

@ lockcmpxchg8b : thanks; 내 두뇌가 과열되었거나 뭔가가 있어야합니다. –