2017-09-18 9 views
0

DES_ecb_encryptを使用して暗号化した後、同じ値を解読しています。Openssl解読で暗号化前と同じ値が見つからない

void algo_crypt(request_rec *r) { 
    char cookie[] = "VAR=USER123456"; 
    unsigned char key_md5[16]; 
    int len; 
    const_DES_cblock *input; 
    DES_cblock *output; 
    unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE]; 
    unsigned char *e = out; 
    DES_cblock key = "MyKey"; 
    DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; 
    DES_key_schedule keysched; 

    memset(in, 0, sizeof(in)); 
    memset(out, 0, sizeof(out)); 
    memset(back, 0, sizeof(back)); 

    DES_set_key((C_Block *)key, &keysched); 

    strcpy(in, cookie); 

    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Plaintext: [%s]\n", in); 

    DES_ecb_encrypt((C_Block *)cookie,(C_Block *)out, &keysched, DES_ENCRYPT); 

    am_cookie_set(r, out); 

    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Ciphertext out: %s", out); 

    while (*e) 
     ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, 
      "algo_crypt [%02x] ", *e++); 

} 

と、この復号化のために:

void algo_decrypt(request_rec *r) { 
    unsigned char key_md5[16]; 
    int len; 
    const_DES_cblock *input; 
    DES_cblock *output; 
    unsigned char in[BUFSIZE], back[BUFSIZE]; 
    unsigned char out[] = {0xb8, 0xa8, 0xb0, 0x54, 0x40, 0x23, 0xd1, 0x25}; 
    unsigned char *e = out; 

    DES_cblock key = "MyKey"; 
    DES_key_schedule keysched; 

    memset(back, 0, sizeof(back)); 

    DES_set_key((C_Block *)key, &keysched); 

    char *mycookie = am_cookie_get(r); 

    DES_ecb_encrypt((C_Block *)mycookie, (C_Block *)back, &keysched, DES_DECRYPT); 

    ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, "Decrypted Text: [%s]\n", back); 
} 

が、印刷に戻り、この:私は間違って何をやっている

Decrypted Text: [VAR=USER]\n 

は私がこれらの機能を使用していますか?

私は、OpenSSL、Cを使用していると私は私が使用されていない2つのkey_md5の変数を見ているのUbuntuに

+1

"DES_ecb_encrypt()は、電子コードブック(ECB)モードで単一の8バイトDES_cblockを暗号化または復号化する基本的なDES暗号化ルーチンです。 < - あなたはデータを暗号化するために反復しなければならない> 8バイト – Ctx

+0

ありがとうCtx、それを行う方法の例を教えてください。 – eeadev

+1

あなたは 'DES_encrypt'や友達を使うべきではありません。これはソフトウェアのみの実装なので、ハードウェアサポートを楽しむことはありません。あなたは 'EVP_ *'関数を使用していなければなりません。 OpenSSL wikiの[EVP Symmetric Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)を参照してください。実際には、機密性と信頼性の両方を提供するため、おそらく認証された暗号化を使用するべきです。 OpenSSL wikiの[EVP Authenticated Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption)を参照してください。 – jww

答えて

2

を使用してApacheに取り組んでいます。 「キー」入力でMD5ハッシュを実行する必要があります。これは実際にはキーではなくパスワードです。

ここで問題は、DESが8バイト(バイトあたり1ビットのパリティ)でエンコードされた56ビットのキーを必要とすることです。ただし、 "キー"は5文字/バイトで構成されています。したがって、3バイトは不明です。ご覧のように、Cの関数にはlengthパラメータは含まれておらず、配列のサイズは分かりません(単なるポインタなので)。

したがって、5文字と3バイトが表示されます。そしてそれらは価値があるかもしれないので、あなたは不確定な結果を持っています。もちろん、ブロック暗号の出力がとにかくランダムに見えるので、これを検出することは不可能です。あなたが非常に "幸運"で、暗号化と復号化の両方の文字列の後ろに同じ値を持っていない限り、それでも解読に失敗します。

+2

IMO DESは吸う、MD5は吸う、Cは無音だし、どちらも安全なコードには使用しないでください。代わりに、PBKDF2、AES-GCMおよび管理言語を試してください。 –

関連する問題