QT C++ - OpenSSL AES - EVP.h
QT C++ - OpenSSL AES - EVP.h
在过去的几天里,我一直在尝试使用OpenSSL与QT,但文档和示例很少或没有。
总之,我写了这段代码:
void qkCrypto::AES_CBC(const unsigned char *string, const unsigned char *key, const unsigned char *iv)
{
int outlen;
unsigned char *out;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
const EVP_CIPHER *cipher = EVP_aes_128_cbc();
EVP_EncryptInit(&ctx,cipher,key,iv);
EVP_EncryptUpdate(&ctx,out,&outlen,string,strlen(string));
EVP_EncryptFinal(&ctx,out,&outlen);
EVP_CIPHER_CTX_cleanup(&ctx);
qDebug() << out;
}
但是当我编译它时,我得到一些错误…这是转换和强制转换错误,因为我不是最好的c++程序员,我真的很感谢一些帮助来解决它们:
[...]/qkcrypto.cpp: In member function 'void qkCrypto::AES_CBC(const unsigned char*, const unsigned char*, const unsigned char*)':
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const unsigned char*' to 'const char*'
[...]/qkcrypto.cpp:39: error: initializing argument 1 of 'size_t strlen(const char*)'
无论如何,我怎样才能使这个更QT友好转换字符到QByteArrays?
最诚挚的问候,谢谢大家;)
代码更新
我一直在"胡搞",我正试图做到这一点,没有任何运气:
void qkCrypto::AES_CBC(QByteArray string, QByteArray key, QByteArray iv)
{
int outlen;
QByteArray out;
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
const EVP_CIPHER *cipher = EVP_aes_128_cbc();
EVP_EncryptInit(&ctx,cipher, key.constData() , iv.constData() );
EVP_EncryptUpdate(&ctx, out.constData() ,&outlen, string.constData() ,strlen((const char*)string));
EVP_EncryptFinal(&ctx, out.constData() ,&outlen);
EVP_CIPHER_CTX_cleanup(&ctx);
qDebug() << "OUT: "<< out;
}
我得到了很多关于转换的错误:
[...]/qkcrypto.cpp: In member function 'void qkCrypto::AES_CBC(QByteArray, QByteArray, QByteArray)':
[...]/qkcrypto.cpp:38: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:38: error: initializing argument 3 of 'int EVP_EncryptInit(EVP_CIPHER_CTX*, const EVP_CIPHER*, const unsigned char*, const unsigned char*)'
[...]/qkcrypto.cpp:38: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:38: error: initializing argument 4 of 'int EVP_EncryptInit(EVP_CIPHER_CTX*, const EVP_CIPHER*, const unsigned char*, const unsigned char*)'
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const char*' to 'unsigned char*'
[...]/qkcrypto.cpp:39: error: initializing argument 2 of 'int EVP_EncryptUpdate(EVP_CIPHER_CTX*, unsigned char*, int*, const unsigned char*, int)'
[...]/qkcrypto.cpp:39: error: invalid conversion from 'const char*' to 'const unsigned char*'
[...]/qkcrypto.cpp:39: error: initializing argument 4 of 'int EVP_EncryptUpdate(EVP_CIPHER_CTX*, unsigned char*, int*, const unsigned char*, int)'
[...]/qkcrypto.cpp:41: error: invalid conversion from 'const char*' to 'unsigned char*'
[...]/qkcrypto.cpp:41: error: initializing argument 2 of 'int EVP_EncryptFinal(EVP_CIPHER_CTX*, unsigned char*, int*)'
谢谢。
嗯,正如错误所说,您试图在指向char
和unsigned char
的指针之间进行转换,这是不允许的。您必须添加显式强制转换,例如
EVP_EncryptUpdate(&ctx, out, &outlen, string, strlen((const char*)string));
^^^^^^^^^^^^^
似乎strlen
需要一个指向有符号char
的const指针。所以你需要投那个。使用普通的C类型转换((const char*)
)、static_cast<const char*>
或reinterpret_cast<const char*>
。一切都会顺利的。
无论如何,我怎样才能使这个更QT友好转换字符到QByteArrays?
查看文档,最简单的解决方案是这样的:
QByteArray arr((const char*)string);
我的新代码现在几乎完美了。
QByteArray qkCrypto::encrypt_AES_CBC(QByteArray string, QByteArray key, QByteArray ivv)
{
char mykey[EVP_MAX_KEY_LENGTH] = { 0 };
strcpy(mykey,key.constData());
char iv[EVP_MAX_IV_LENGTH] = { 0 };
strcpy(iv,ivv.constData());
char ciphertext[1024];
const EVP_CIPHER *cipher = EVP_aes_256_cbc();
int in_len;
int out_len=0;
in_len = (string.length());
qDebug() << "Before encrypt: " << string << "rn";
EVP_EncryptInit(&ctx, cipher, (const unsigned char*)mykey, (const unsigned char*)iv);
EVP_EncryptUpdate(&ctx, ( unsigned char*)ciphertext, &out_len, (const unsigned char*)string.data(), in_len);
EVP_EncryptFinal(&ctx, ( unsigned char*)&ciphertext[out_len], &out_len);
EVP_CIPHER_CTX_cleanup(&ctx);
qDebug() << "Encrypted: " << ciphertext << "rn";
return ciphertext;
}
由于某些原因,输出只在某些时候是正确的…其他时候输出是错误的,我不能在以后用OpenSSL解密它。
这是怎么了?: S
谢谢。
相关文章:
- AES加密到解密未正确输出
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- OpenSSL API,使用GCM(伽罗瓦计数器模式)进行AES加密
- 压缩天然气.AES.错误解密(可能加密)的文件
- 用于 AES-gcm 加密的 IV 中是否有不起作用的值?
- OpenSSL AES加密似乎无法正常工作
- AES ECB已知文本攻击
- AES-128 CFB-8解密的前16个字节已损坏
- C++中AES NI加密的正确方法
- aes cbc反向加密
- 在Crypto++中向AES解密传递密钥
- 如何使用 AES 和 sha256 哈希作为密钥加密++进行加密
- 无法为 AES 加密创建 contex.视窗XP
- 短消息 AES 性能C++
- QT:AES-256-CBC 根据 PHP 代码在C++中加密/解密
- 在加密++中使用RSA加密对称AES密钥
- 错误:AES 加密密钥:从"char*"到"无符号字符"的转换无效
- AES加密/解密接收所有明文
- 我在 c++ 中的 AES 代码有问题。明文正在更改,但加密邮件是相同的。我找不到我的错误
- QT C++ - OpenSSL AES - EVP.h