2014-12-16 2 views
1

Я не эксперт в openssl. Я собрал следующий код для шифрования и расшифровки сообщения с использованием AES-CTR. Результат не то, что я ожидаю увидеть.AES CTR симметричное шифрование и дешифрование

#include "stdafx.h" 
#include <openssl/aes.h> 
#include <openssl/evp.h> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <tchar.h> 
#include <psapi.h> 
#include <openssl/rand.h> //for RAND_bytes function 

struct ctr_state { 
    unsigned char ivec[16]; /* ivec[0..7] is the IV, ivec[8..15] is the big-endian counter */ 
    unsigned int num; 
    unsigned char ecount[16]; 
}; 

int init_ctr(struct ctr_state *state, const unsigned char iv[8]) 
{ 
    /* aes_ctr128_encrypt requires 'num' and 'ecount' set to zero on the 
    * first call. */ 
    state->num = 0; 
    memset(state->ecount, 0, 16); 
    /* Initialise counter in 'ivec' to 0 */ 
    memset(state->ivec + 8, 0, 8); 
    /* Copy IV into 'ivec' */ 
    memcpy(state->ivec, iv, 8); 
    return(0); 
} 

int main(int argc, char **argv) 
{ 
    unsigned char key[] = "thiskeyisverybad"; // It is 128bits though.. 
    unsigned char iv[8]; 
    struct ctr_state state; 
    if (!RAND_bytes(iv, 8)) 
     printf("\nError in RAND_Bytes...\n"); 
    init_ctr(&state, iv); 
    AES_KEY aes_key; 
    AES_set_encrypt_key(key, 128, &aes_key); 
    char msg[] = "hey"; 
    unsigned char cipher[AES_BLOCK_SIZE]; 
    char plain[AES_BLOCK_SIZE]; 
    AES_ctr128_encrypt((unsigned char *) msg, cipher, AES_BLOCK_SIZE, &aes_key, state.ivec, state.ecount, &state.num); 
    AES_ctr128_encrypt(cipher, (unsigned char *) plain, AES_BLOCK_SIZE, &aes_key, state.ivec, state.ecount, &state.num); 
    printf("\nPLAIN:%s\n", plain); 
    return 0; 
} 

В результате я получаю что-то вроде этого: "ОБЫЧНЫЙ: ¢ u∩U└ ■ Моего & nu9 ♫ _╠╠╠╠╠╠╠╠" Åä▬♂☻e0T ç§▓ → ♀ v╠╠╠╠╠╠╠╠hey "

Любая идея, что вызывает это? Все, что я хочу сделать, это использовать AES с использованием CTR для шифрования и дешифрования сообщений. Я хочу получить ту же зашифрованную длину, что и обычный текст (или +1 байт). Я сделал это с DES, но DES не был защищен. Затем я буду использовать AES-CTR для шифрования и дешифрования моего сетевого трафика (потока).

ответ

3

Необходимо выполнить сброс перед расшифровкой:

… 
init_ctr(&state, iv); 
AES_ctr128_encrypt(
     cipher, 
     (unsigned char *) plain, 
     AES_BLOCK_SIZE, 
     &aes_key, 
     state.ivec, 
     state.ecount, 
     &state.num 
     ); 
printf("\nPLAIN:%s\n", plain); 
Смежные вопросы