OpenSSL AES256 шифрование cbc - PullRequest
       8

OpenSSL AES256 шифрование cbc

2 голосов
/ 18 декабря 2011

Я несколько дней пытался найти подходящий пример в интернете, но безуспешно. Я пытаюсь зашифровать простую строку (Hello World) ключом, а затем расшифровать результат. Однако расшифрованный результат не имеет ничего общего с исходным текстом. Кто-нибудь может указать мне направление, пожалуйста?

Код, который я сделал:

AES_KEY aes_decryptKey;
AES_KEY aes_encryptKey;

const unsigned char mykey[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
unsigned char encrypted ;
unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    
unsigned char decrypted;

AES_set_encrypt_key(mykey, 256, &aes_encryptKey);
AES_set_decrypt_key(mykey, 256, &aes_decryptKey);

const unsigned char original[]  = {0x48,0x65,0x6c,0x6c,0x6f,0x2c,0x77,0x6f,0x72,0x6c,0x64,0x21};

AES_cbc_encrypt(original, &encrypted, sizeof(original), &aes_encryptKey, iv, 0);

AES_decrypt( &encrypted, &decrypted, &aes_decryptKey);

NSLog(@"ORIGINAL: \"%s\"\n",original);
NSLog(@"ENCRYPTED: \"%s\"\n",&encrypted);
NSLog(@"DECRYPTED: \"%s\"\n",&decrypted);

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Джим, спасибо за вашу помощь.

Кажется, мне пришлось поднять вопрос, чтобы найти ответ.После многих дней борьбы вот что я придумал:

    unsigned char inbuf[1024]="Hello,world!";
unsigned char encbuf[1024];

unsigned char key32[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
unsigned char deckey32[] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa}
;
unsigned char iv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    
unsigned char deciv[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};    

AES_KEY aeskey;
AES_KEY aesdeckey;

//Now enrypt
memset(encbuf, 0, sizeof(encbuf));
AES_set_encrypt_key(key32, 32*8, &aeskey);
AES_cbc_encrypt(inbuf, encbuf, 16, &aeskey, iv, AES_ENCRYPT);

//Now decrypt
unsigned char decbuf[1024];
memset(decbuf, 0, sizeof(decbuf));

AES_set_decrypt_key(deckey32, 32*8, &aesdeckey);
AES_cbc_encrypt(encbuf, decbuf, 16, &aesdeckey, deciv, AES_DECRYPT);


//Display the results
NSLog(@"ORIGINAL: \"%s\"\n", inbuf);
NSLog(@"ENCRYPTED: \"%s\"\n", encbuf);
NSLog(@"DECRYPTED: \"%s\"\n", decbuf);

return;

Кредиты этим парням (после Джима): http://www.mail-archive.com/openssl-users@openssl.org/msg50142.html

Ключ должен был использовать AES_cbc_encrypt для расшифровки.

1 голос
/ 19 декабря 2011

Вы дешифруете дважды - последний параметр 0 для AES_cbc_encrypt должен быть 1 или AES_ENCRYPT.

Кроме того, вы перезаписываете свои символы шифрования и дешифрования, которые вместо этого должны быть массивами, достаточно большими, чтобы содержать зашифрованный размер оригинала. Вместо:

unsigned char encrypted;
...
AES_cbc_encrypt(original, &encrypted, ...

используйте что-то вроде:

unsigned char encrypted[32];
...
AES_cbc_encrypt(original, encrypted, ...

А также что-то вроде:

unsigned char decrypted[32];
....
AES_decrypt(encrypted, decrypted, &aes_decryptKey);

Проверьте эту ссылку: http://marc.info/?l=openssl-users&m=122919878204439. Я пока не могу поручиться за все это - я вернусь и отредактирую свой ответ позже, когда у меня будет время.

...