0

入力データをプレーンテキストとして受け取り、CBCモードで3DESメソッドを使用してメッセージを復号化するプログラムがあります。しかし、値はプログラムにハードコーディングされています。暗号化された値を自分で提供したいので、それを解読する必要があります。次のプログラムでこれを行うにはどうすればよいですか?

int main(void)
{
    unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE];
    unsigned char *e = out;
    int len;

    DES_cblock key;
    DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10};
    DES_cblock ivsetup = {0xE1, 0xE2, 0xE3, 0xD4, 0xD5, 0xC6, 0xC7, 0xA8};
    DES_key_schedule keysched;
    DES_cblock ivec;

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

    RAND_seed(seed, sizeof(DES_cblock));

    DES_random_key(&key);
    DES_set_odd_parity(&key);
    if (DES_set_key_checked((C_Block *)key, &keysched))
    {
        fprintf(stderr, "ERROR: Unable to set key schedule\n");
        exit(1);
    }

    /* 64 bytes of plaintext */

    /* From here, encryption starts for the plaintext below. */

    strcpy(in, "Now is the time for all men to stand up and be counted");

    printf("Plaintext: [%s]\n", in);

    len = strlen(in);
    memcpy(ivec, ivsetup, sizeof(ivsetup));
    DES_ncbc_encrypt(in, out, len, &keysched, &ivec, DES_ENCRYPT);

    printf("Ciphertext:");
    while (*e) printf(" [%02x]", *e++);
    printf("\n");

    /* Till here, encryption is over. After this we have to decrypt
     * the value which has been encoded, but I want to remove all this
     * part and to provide my own encrypted message, and get the
     * proper output.
     */

    memcpy(ivec, ivsetup, sizeof(ivsetup));

    /* The problem I am facing is how to provide the value properly
     * to the parameter "out" and "keysched", which should be of my
     * choice. For "out" I want to provide THIS value:
     * "2DC39619B4450A8C27A3976C50DE5799".
     */

    DES_ncbc_encrypt(out, back, len, &keysched, &ivec, DES_DECRYPT);

    printf("Decrypted Text: [%s]\n", back);

    exit(0);
}

続きを読む: http: //blog.fpmurphy.com/2010/04/openssl-des-api.html#ixzz1uqOp1Yhv

4

4 に答える 4

2

CFAQ20.10を読んでください。16進数は表現です。すべての数値は内部でバイナリに格納されます。あなたDES_cblockはおそらくtypedef(符号なし、おそらく!)積分型のためのものです。つまり、実際に使用できるのは整数の配列です。数値は10進数、16進数、または2進数で入力できますが、すべて機能します。16進数は、表記上の利点があるため、通常、暗号化で使用されます。

于 2012-05-14T12:18:33.750 に答える
1

私はそれを成し遂げました。とりあえず幼稚なやり方でやったのですが、今は動いています。私はこのようにしました。

out[0]=0xA0; out[1]=0x69; out[2]=0x57; out[3]=0x3B;
out[4]=0x70; out[5]=0x26; out[6]=0x1C; out[7]=0xE8;
out[8]=0xEF; out[9]=0xF2; out[10]=0x9F;out[11]=0x60;
out[12]=0x80;out[13]=0x60;out[14]=0xB2;out[15]=0xE5;

後で、このことをforループで実行します。

于 2012-05-15T10:07:40.643 に答える
0

値を文字列として格納する非標準itoa関数を使用すると、次のことができます。

char* hexstr = itoa(back,16); 

// print out a string
printf("Decrypted Text: [%X]\n", back);
于 2012-05-14T12:14:12.797 に答える
0

次のようなダンプ関数を作成します。

hexdump(char *buff, int len) { 
  int i,tmp;
  for(i=0; i < len; i++) {
    tmp = buff[i] & 0xff; /** to avoid sign extension */
    printf("%02x",tmp);
  }
} 

そしてそれを使用してください。

hexdump(back,len);

メモリに書き込む必要がある場合は、sprintfを使用できますが、独自のバイナリを16進関数に書き込む必要がある場合があります。

于 2012-05-14T12:15:38.900 に答える