Строка не расшифрована должным образом с помощью <openssl / aes>

0

Я хочу написать одну простую программу, которая будет шифровать один тест с помощью <openssl/aes.h> и в то же время расшифровать его. Я написал ниже программу

Добавление всего моего кода здесь:

#include <stdio.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <openssl/aes.h>
#include <string.h>


int main(void)
{
    //encryption testing
    unsigned char inputb[2048] = {'\0'};
    unsigned char encpb[2048]= {'\0'};
    unsigned char opb[2048]= {'\0'};
#define MAX_SIZE 100

    unsigned char oneKey[] = "6BC1BEE22E409F96E93D7E117393172A";
    AES_KEY key; 
    AES_KEY key1; 

    char testchat[] = "!!!test doctors file!!! @Hospitan name(norman) SICKAPP_NAME=9873471093 @Duration (Duration\
    of doctor visitdfwhedf in months)higibujiji TESTATION=-5 #Expiry date MADICINE_NAME=678041783478\n";
    char NULL_byte[16] = {0};
    memcpy((char*)inputb, (testchat), strlen(testchat)+1);
    printf("\n\ninputb= %s strlen(testchat)=%d \n\n",inputb, strlen(testchat));
    AES_set_encrypt_key(oneKey, 128, &key);
    unsigned char tmp_char[50] = {'\0'};
    char* pChar = (char*)inputb;
    unsigned char tmp_char_encpb[MAX_SIZE];
    while(*pChar != '\0') {
        memset(tmp_char, '\0',  50);
        memset(tmp_char_encpb, '\0',  MAX_SIZE);
        if(strlen(pChar) < 16)  {
            strncpy((char*)tmp_char, (char*)pChar, strlen(pChar)+1);
            strncat((char*)tmp_char, NULL_byte, 16 - strlen(pChar)+1);
        }
        else
            strncpy((char*)tmp_char, (char*)pChar, 16);
        printf("Line:%d tmp_char = %s pChar=%d\n", __LINE__, tmp_char, strlen(pChar));
        AES_encrypt(tmp_char, tmp_char_encpb, &key);
        strcat((char*)encpb, (char*)tmp_char_encpb);

        pChar += 16;
    }
    printf("len encpb=%d\n", strlen((char*)encpb));
    //now test with decrypting  and check if all okk....
    unsigned char oneKey1[] = "6BC1BEE22E409F96E93D7E117393172A";
    AES_set_decrypt_key(oneKey1,128,&key1);
    unsigned char tmp_char_dencpb[MAX_SIZE];
    pChar = (char*)encpb;
    while(*pChar != '\0') {
        memset(tmp_char, '\0',  50);
        if(strlen(pChar) < 16)  {
            strncpy((char*)tmp_char, (char*)pChar, strlen(pChar)+1);
            strncat((char*)tmp_char, NULL_byte, 16 - strlen(pChar)+1);
        }
        else
            strncpy((char*)tmp_char, (char*)pChar, 16);
        AES_decrypt(tmp_char, tmp_char_dencpb, &key1);
        strncat((char*)opb, (char*)tmp_char_dencpb,16);
        memset(tmp_char_dencpb, '\0',  MAX_SIZE);
        pChar += 16;
    }

    printf("\n\nopb = %s\n\n",opb);
    return 0;
}

Я строю через:

g++ mytest.cpp -lssl -lcrypto

через GDB:

Program received signal SIGSEGV, Segmentation fault.
0x0000003e48437122 in ____strtoll_l_internal () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.47.el6_2.12.x86_64 keyutils-libs-1.4-3.el6.x86_64 krb5-libs-1.9-22.el6_2.1.x86_64 libcom_err-1.41.12-11.el6.x86_64 libgcc-4.4.6-3.el6.x86_64 libselinux-2.0.94-5.2.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64 openssl-1.0.0-20.el6_2.4.x86_64 zlib-1.2.3-27.el6.x86_64
(gdb) backtrace
#0  0x0000003e48437122 in ____strtoll_l_internal () from /lib64/libc.so.6
#1  0x0000000000400e9b in GetExpiryDate (exp_date=0x7fffffffd970) at LicReader.cpp:66
#2  0x0000000000400eeb in IsLicenseExpired () at LicReader.cpp:74
#3  0x0000000000400f3b in main (argc=1, argv=0x7fffffffda88) at LicReader.cpp:86
(gdb)

OP: через некоторое время я получил текущую расшифрованную строку и некоторое время получаю с мусорным символом (при изменении строки i/p)

Я что-то пропустил? Может ли кто-нибудь сказать, почему AES_decrypt не работает в gsometimes?

  • 0
    И твой вопрос?
  • 0
    AES_decrypt не работает несколько раз ...
Теги:
encryption
openssl

1 ответ

1

strcat с нулевым завершением - это не то, как управлять зашифрованными данными... например, вы используете strcat для добавления зашифрованных данных в encpb... но что происходит, если в зашифрованных данных есть нуль? Что происходит, вы не получаете все данные. Сделка вместо этого с фактическим размером блока, который составляет 16 байт. Что произойдет, если данные, которые вы шифруете, не кратно 16 байтам? Вы должны отложить его до кратного 16. Как? Много разных способов, таких как PKCS7. Кроме того, вы должны заглянуть в цепочку шифрования и соления... много, чтобы учиться!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню