2017-11-28 5 views
0

OpenSSL ECB問題を使用して、64ビット以外の複数のプレーンテキストを暗号化および解読しようとすると問題が発生します。OpenSSL ECB非64ビット複数プレーンテキスト

私は2つの.cファイルを持っています.1つは暗号化し、もう1つは解読します。

これは最初のものです。

// 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); 
} 

これは、第1

//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

[ブロック暗号とは何ですか?](https://www.google.com/search?q=block+cipher+what+is+pkcs+padding) – jww

答えて

1

DES ECBは、64ビット(または8オクテット)ブロックを有するブロックモード暗号であり、唯一のブロックサイズの倍数であるデータ上で動作するように設計さあります。プラスOpenSSL DES_ecb_encryptは実際にはECB モードではなく、むしろDESブロックプリミティブです。これは正確に64ビット以下の1ブロックを暗号化または復号化します。あなたがしようとしていることは、働かせてはいけません。

ストリーム暗号、ストリームモード(CTRなど)、またはブロックモード(ただし、ECBはありません)のいずれかを使用して、可変長データを処理する必要のある適切に設計された暗号化システムでは、 - いくつかの基準を選択できます。 OpenSSLのEVP_{Encrypt,Decrypt,Cipher}*モジュールでは、デフォルトでPKCS5/7パディングが使用されますが、オフにすることはできます。


注DESは破壊され、廃止された二十年のために、とECBモードでも良いプリミティブで使用されているほとんどのアプリケーションでは、セキュリティを軽減または排除する攻撃を可能にされています。実際に何かを確保するつもりなら、これを落とし、自分が何をやっているかを知っている人が設計したプログラムを使用してください。


SOのためのより多くのontopic、あなたのプログラムは、あなたのコンパイラが検出さについて警告している必要がありDES_ecb_encryptへの呼び出しのための間違ったポインタ型を使用しています。しかし、Cが配列を定義する方法のために、このエラーのため実装が実際には失敗することはありません。また、exit malloc memcpyの必要なプロトタイプを#includeしないと、size_tintより大きいシステムでバグやクラッシュが発生する可能性があります。

+0

...これはSXではなくSOです。 ) – lockcmpxchg8b

+0

ありがとう、これは私がセキュリティクラスから持っていた宿題なので、私はすべてを試したので、ここで尋ねていたのです。今私は暗号化する前にプレーンテキストにビットを追加するようなことをしようと思っています。私はそれが動作するはずだと思う –

+0

@ lockcmpxchg8b:ありがとう;私の脳は過熱しているか、何かあるはずです –