- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下一段代码可以加密和解密消息。
QString AesUtils::encrypt(QString message, QString aesKey)
{
string plain = message.toStdString();
qDebug() << "Encrypt" << plain.data() << " " << plain.size();
string ciphertext;
// Hex decode symmetric key:
HexDecoder decoder;
string stdAesKey = aesKey.toStdString();
decoder.Put((byte*)stdAesKey.data(), aesKey.size());
decoder.MessageEnd();
word64 size = decoder.MaxRetrievable();
char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);
// Generate Cipher, Key, and CBC
byte key[ AES::MAX_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
StringSource( reinterpret_cast<const char *>(decodedKey), true,
new HashFilter(*(new SHA256), new ArraySink(key, AES::MAX_KEYLENGTH)) );
memset( iv, 0x00, AES::BLOCKSIZE );
CBC_Mode<AES>::Encryption Encryptor( key, sizeof(key), iv );
StringSource( plain, true, new StreamTransformationFilter( Encryptor,
new HexEncoder(new StringSink( ciphertext )) ) );
return QString::fromStdString(ciphertext);
}
QString AesUtils::decrypt(QString message, QString aesKey)
{
string plain;
string encrypted = message.toStdString();
// Hex decode symmetric key:
HexDecoder decoder;
string stdAesKey = aesKey.toStdString();
decoder.Put( (byte *)stdAesKey.data(), aesKey.size() );
decoder.MessageEnd();
word64 size = decoder.MaxRetrievable();
char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);
// Generate Cipher, Key, and CBC
byte key[ AES::MAX_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
StringSource( reinterpret_cast<const char *>(decodedKey), true,
new HashFilter(*(new SHA256), new ArraySink(key, AES::MAX_KEYLENGTH)) );
memset( iv, 0x00, AES::BLOCKSIZE );
try {
CBC_Mode<AES>::Decryption Decryptor
( key, sizeof(key), iv );
StringSource( encrypted, true,
new HexDecoder(new StreamTransformationFilter( Decryptor,
new StringSink( plain )) ) );
}
catch (Exception &e) { // ...
qDebug() << "Exception while decrypting " << e.GetWhat().data();
}
catch (...) { // ...
}
qDebug() << "decrypt" << plain.data() << " " << AES::BLOCKSIZE;
return QString::fromStdString(plain);
}
问题是我随机得到:
StreamTransformationFilter: invalid PKCS #7 block padding found
解密内容时。加密应该完全支持QString
,因为它可能包含一些 Unicode 数据。但即使是最基本的,它也不起作用,仅包含 [A-z][a-z][0-9]
aesKey
大小为 256。
根据 Stack Overflow 上的一些答案,有人建议使用 HexDecoder
/HexEncoder
,但它并没有解决我的问题。
最佳答案
我的代码的第一个问题是我在 aesKey QString 中输入普通字符串。
因此,您需要提供一个十六进制格式的 key ,而不是“1231fsdf$5r4”:[0-9][A-F]
那么问题来了:
char *decodedKey = new char[size];
decoder.Get((byte *)decodedKey, size);
我猜这个字符串是完整的 64 个字节,最后没有 NULL 的空间。改成:
char *decodedKey = new char[size+2];
现在代码可以正常工作了。希望这对将来的人有所帮助。
关于c++ - QStrings 上的 AES 加密,libcrypto++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34548646/
我在Linux上安装了Openssl,Openssl-dev。配置Thrift时,出现以下错误: 正在检查-lcrypto中的BN_init ...否 配置:错误:“错误:需要libcrypto。”
当我尝试编译使用 openssl 'crypto' 库函数和命令行 -lcrypto 和 gcc 4.4.3 的 C 代码时> 它给出了一个错误 `@ubu:$ gcc -ggdb aes_m.c -
我正在尝试在 XCODE 4.2 上为 mac 编译一个较旧的 objective-c 应用程序 尝试编译时出现链接错误 无法直接与架构 x86_64 的/usr/lib/libssl.0.9.7.d
我正在遵循以下位置的代码示例:http://www.openssl.org/docs/crypto/sha.html# 执行以下操作后: EVP_DigestFinal_ex(&mdctx, md_v
我正在使用 libcrypto++ 进行 aes 加密。我想在我的代码中添加以下方法:EVP_CipherInit_ex()、EVP_CipherUpdate()、EVP_CipherFinal_ex
我正在尝试将一个共享库放在一起,该库向远程服务器发出 HTTP GET 请求。我的库将由另一个应用程序加载,我想将一些统计数据发布到网络服务器 API。我的代码目前看起来像这样: void conne
我以某种方式设法在 Ubuntu 14.04 上安装了 libcrypto++ 库。现在,我在 Eclipse CDT 中有一个项目,我想创建一个可执行文件并使其独立运行在其他 linux 风格和 w
我有以下生成文件,我将以静态方式添加库“libcrypto.a”。我需要这样做,因为目标系统无法安装 openssl 库。 # Environment MKDIR=mkdir
我想尝试一个带有 makefile 的程序,但是当我将 make 放入 shell 时,错误是: g++ -g -DaUNIX -I../../acroname/aInclude -I../../a
我使用以下方法创建了一个 RSA key : RSA_generate_key(2048, RSA_F4, NULL, NULL); 现在我想将公钥导出到另一方 B。现在,我刚刚存储了整个 RSA*
我使用的是 Mac OS X 10.6 SDK,并且我的部署目标设置为 Mac OS 10.5。我链接到 libcrypto(AquaticPrime 需要这个)并发现我的应用程序无法在 Leopar
我自己编译php7。 下载php7源代码。 yum安装libxml2-devel openssl-devel.i686 配置 ./configure --prefix=/usr/local/php7
我看到了这个问题“找不到包‘libcrypto’”。我几个月前修复的相同错误是遵循以下解决方案:https://github.com/scipr-lab/libsnark/issues/99 我今天尝
我需要签署一个字符串,将公钥作为字符串发布,然后在其他地方使用公钥来验证签名的消息。这是消息签名的部分: // RSA keypair generation EVP_P
我正在尝试使用 Debian Wheezy 和 g++4.7 在我的系统上编译一个程序。我希望它能够在另一个带有 Debian Squeeze 的系统上运行(并且没有最近的 g++)。我无法在 Squ
这更像是一个假设,而我正在调试一些代码。假设我有一个应用程序(称为 X)调用一个库以通过 TLS 加密的 SMTP 连接发送电子邮件,同时 X 正在与另一个库交谈,该库通过相同的 libcrypto
我正在为 Android 应用构建一个帮助程序库,我需要为我正在使用的一些支持库提供完整的 OpenSSL 实现。我正在创建一个构建链并用它编译 libssl 和 libcrypto 但在运行时我得到
我有一个 C 文件需要在 Windows7 上编译。我已经为 gcc 安装了 MinGW。我还需要 OpenSSL,因此点击他们网站上的链接并从 Shining Light Productions 下
近 3 天以来,我一直在尝试这样做。它让我发疯。 正如您想象的那样,我对 C++ 还很陌生。 任何人都可以一步一步地指导我使用 openssl 中的函数编写一个 hello world 程序,并从 W
案例: 我正在构建一个使用 libcrypto 和 libssl 的应用程序。我正在尝试使用预构建的 libcrypto.so 和 libssl.so 并编译我的应用程序。 但我不断收到 undefi
我是一名优秀的程序员,十分优秀!