字符串未使用 <openssl/aes>正确解密

String not decrypted properly using <openssl/aes>

本文关键字:gt 解密 aes openssl 未使用 lt 字符串      更新时间:2023-10-16

我想写一个简单的程序,用<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] = {''};
    unsigned char encpb[2048]= {''};
    unsigned char opb[2048]= {''};
#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=678041783478n";
    char NULL_byte[16] = {0};
    memcpy((char*)inputb, (testchat), strlen(testchat)+1);
    printf("nninputb= %s strlen(testchat)=%d nn",inputb, strlen(testchat));
    AES_set_encrypt_key(oneKey, 128, &key);
    unsigned char tmp_char[50] = {''};
    char* pChar = (char*)inputb;
    unsigned char tmp_char_encpb[MAX_SIZE];
    while(*pChar != '') {
        memset(tmp_char, '',  50);
        memset(tmp_char_encpb, '',  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=%dn", __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=%dn", 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 != '') {
        memset(tmp_char, '',  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, '',  MAX_SIZE);
        pChar += 16;
    }
    printf("nnopb = %snn",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中工作吗?

零终止字符串操作不是管理加密数据的方法。。。例如,您使用strcat将加密数据添加到encpb。。。但是,如果加密数据中有一个零,会发生什么呢?结果是你没有得到所有的数据。处理实际的块大小,即16字节。如果您加密的数据不是16字节的倍数,会发生什么?你必须把它加成16的倍数。怎样有很多不同的方式,比如PKCS7。另外,你应该研究密码块链接和盐析。。。有很多东西要学!