Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2012, 14:18   #1
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию aes 256 cbc - шифрование строки

Приветствую! Не могу добиться шифрования строки алгоритмом aes
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include "base64.c"

#define AES_BLOCK_SIZE 256

int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx, EVP_CIPHER_CTX *d_ctx)
{

  unsigned char key[32], iv[32];

  EVP_CIPHER_CTX_init(e_ctx);
  EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
  EVP_CIPHER_CTX_init(d_ctx);
  EVP_DecryptInit_ex(d_ctx, EVP_aes_256_cbc(), NULL, key, iv);

  return 0;
}

unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
{
  int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
  unsigned char *ciphertext = malloc(c_len);

  EVP_EncryptInit_ex(e, NULL, NULL, NULL, NULL);

  EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);

  EVP_EncryptFinal_ex(e, ciphertext+c_len, &f_len);

  *len = c_len + f_len;
  return ciphertext;
}

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = malloc(p_len + AES_BLOCK_SIZE);
  
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  *len = p_len + f_len;
  return plaintext;
}

int main(int argc, char **argv)
{

  EVP_CIPHER_CTX en, de;
 
  unsigned int salt[] = {12345, 54321};
  char *key_data = "key";
  int key_data_len = 3;
  char *input ="test";

aes_init((unsigned char *)key_data, key_data_len, (unsigned char *)&salt, &en, &de);



    char *plaintext;
    unsigned char *ciphertext;
    int olen, len;

    olen = len = strlen(input)+1;
    
    ciphertext = aes_encrypt(&en, (unsigned char *)input, &len);
    plaintext = (char *)aes_decrypt(&de, ciphertext, &len);

    if (!strncmp(plaintext, input, olen)) 
    {
      printf("Plaintext: %s\n", plaintext);
      printf("Ciphertext: %s\n", ciphertext);
      char *ret = malloc(sizeof(char));
      char *inp = "123";
     ret = base64(inp, 3);
     printf("Base64: <%s>\n", ret);
	}
	
    free(ciphertext);
    free(plaintext);

  EVP_CIPHER_CTX_cleanup(&en);
  EVP_CIPHER_CTX_cleanup(&de);

  return 0;
}
в base64 получаю не понятные значения(переносы строк и тд). прошу совета как лучше реализовать шифрование строк алгоритмом aes.
frommars вне форума Ответить с цитированием
Старый 18.10.2012, 14:38   #2
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

извиняюсь, опять не могу исправить сообщение
вот более полный код
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include "base64.c"

#define AES_BLOCK_SIZE 256

int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx, EVP_CIPHER_CTX *d_ctx)
{

  unsigned char key[32], iv[32];

  EVP_CIPHER_CTX_init(e_ctx);
  EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
  EVP_CIPHER_CTX_init(d_ctx);
  EVP_DecryptInit_ex(d_ctx, EVP_aes_256_cbc(), NULL, key, iv);

  return 0;
}

unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
{
  int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
  unsigned char *ciphertext = malloc(c_len);

  EVP_EncryptInit_ex(e, NULL, NULL, NULL, NULL);

  EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);

  EVP_EncryptFinal_ex(e, ciphertext+c_len, &f_len);

  *len = c_len + f_len;
  return ciphertext;
}

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = malloc(p_len + AES_BLOCK_SIZE);
  
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  *len = p_len + f_len;
  return plaintext;
}

int main(int argc, char **argv)
{

  EVP_CIPHER_CTX en, de;
 
  unsigned int salt[] = {12345, 54321};
  char *key_data = "key";
  int key_data_len = 3;
  char *input ="test";

aes_init((unsigned char *)key_data, key_data_len, (unsigned char *)&salt, &en, &de);



    char *plaintext;
    unsigned char *ciphertext, *plainunbase64;
    int olen, len;

      char *ret = malloc(sizeof(char));
      char *unret = malloc(sizeof(char));
      char *inp = "123";
     ret = base64(inp, 3);

    olen = len = strlen(input)+1;
    
    ciphertext = aes_encrypt(&en, (unsigned char *)input, &len);
    plaintext = (char *)aes_decrypt(&de, ciphertext, &len);

 unret = unbase64(ret, strlen(ret));

plainunbase64 = (char *)aes_decrypt(&de, (unsigned char *)unret, &len);



    if (!strncmp(plaintext, input, olen)) 
    {
      printf("Plaintext: %s\n", plaintext);
      printf("Ciphertext: %s\n", ciphertext);

     printf("Base64: <%s>\n", ret);
     
     printf("unBase64: <%s>\n", plainunbase64);
	}
	
    free(ciphertext);
    free(plaintext);

  EVP_CIPHER_CTX_cleanup(&en);
  EVP_CIPHER_CTX_cleanup(&de);

  return 0;
}
frommars вне форума Ответить с цитированием
Старый 18.10.2012, 14:38   #3
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
По умолчанию

извиняюсь, опять не могу исправить сообщение
вот более полный код
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include "base64.c"

#define AES_BLOCK_SIZE 256

int aes_init(unsigned char *key_data, int key_data_len, unsigned char *salt, EVP_CIPHER_CTX *e_ctx, EVP_CIPHER_CTX *d_ctx)
{

  unsigned char key[32], iv[32];

  EVP_CIPHER_CTX_init(e_ctx);
  EVP_EncryptInit_ex(e_ctx, EVP_aes_256_cbc(), NULL, key, iv);
  EVP_CIPHER_CTX_init(d_ctx);
  EVP_DecryptInit_ex(d_ctx, EVP_aes_256_cbc(), NULL, key, iv);

  return 0;
}

unsigned char *aes_encrypt(EVP_CIPHER_CTX *e, unsigned char *plaintext, int *len)
{
  int c_len = *len + AES_BLOCK_SIZE, f_len = 0;
  unsigned char *ciphertext = malloc(c_len);

  EVP_EncryptInit_ex(e, NULL, NULL, NULL, NULL);

  EVP_EncryptUpdate(e, ciphertext, &c_len, plaintext, *len);

  EVP_EncryptFinal_ex(e, ciphertext+c_len, &f_len);

  *len = c_len + f_len;
  return ciphertext;
}

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = malloc(p_len + AES_BLOCK_SIZE);
  
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  *len = p_len + f_len;
  return plaintext;
}

int main(int argc, char **argv)
{

  EVP_CIPHER_CTX en, de;
 
  unsigned int salt[] = {12345, 54321};
  char *key_data = "key";
  int key_data_len = 3;
  char *input ="test";

aes_init((unsigned char *)key_data, key_data_len, (unsigned char *)&salt, &en, &de);



    char *plaintext;
    unsigned char *ciphertext, *plainunbase64;
    int olen, len;

      char *ret = malloc(sizeof(char));
      char *unret = malloc(sizeof(char));
      char *inp = "123";
     ret = base64(inp, 3);

    olen = len = strlen(input)+1;
    
    ciphertext = aes_encrypt(&en, (unsigned char *)input, &len);
    plaintext = (char *)aes_decrypt(&de, ciphertext, &len);

 unret = unbase64(ret, strlen(ret));

plainunbase64 = (char *)aes_decrypt(&de, (unsigned char *)unret, &len);



    if (!strncmp(plaintext, input, olen)) 
    {
      printf("Plaintext: %s\n", plaintext);
      printf("Ciphertext: %s\n", ciphertext);

     printf("Base64: <%s>\n", ret);
     
     printf("unBase64: <%s>\n", plainunbase64);
	}
	
    free(ciphertext);
    free(plaintext);

  EVP_CIPHER_CTX_cleanup(&en);
  EVP_CIPHER_CTX_cleanup(&de);

  return 0;
}
frommars вне форума Ответить с цитированием
Старый 19.10.2012, 12:54   #4
Tahoma
DI HALT RET
Форумчанин
 
Аватар для Tahoma
 
Регистрация: 30.12.2010
Сообщений: 117
По умолчанию

base64 записывает последним символом перенос, а также не ставит '0'. По этому буфер в начале надо полностью обнулять, а далее использовать длину base64size - 1, либо buf[base64size] = 0x00
Tahoma вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование AES. asmars Общие вопросы C/C++ 3 03.05.2012 16:22
Шифрование AES Samara Помощь студентам 3 29.10.2011 18:10
Шифрование алгоритмом AES (также известный как Rijndael) darek13 Общие вопросы Delphi 16 02.07.2011 00:47
Иконки 256 на 256 в Delphi 7 _PROGRAMM_ Помощь студентам 2 30.04.2011 15:19
Шифрование AES SergunchikSK Общие вопросы Delphi 13 25.08.2009 10:36