最近在项目中用到QT结合cryptlib使用的情况,折腾了两天,总算解决了,把问题记录一下
1、代码生成里边QT默认的是多线程DLL,而crypt使用的是多线程,如果crypt使用多线程dll问题会非常多,非常麻烦,使用静态库是最省事的,这就需要设置代码生成为多线程,此时编译是QT会报错,需要在链接器命令行增加/ENTRY:"mainCRTStartup" ,解决编译问题。
2、crypt AES加密,key如果使用AES::MAX_KEYLENGTH最大长度,Debug模式运行没有问题,Release运行时会报错。如果设置为AES::DEFAULT_KEYLENGTH标准长度就没有问题,因为这个密钥长度的问题,折腾了两天。。。
附上QT+crypt加密解密的代码:
//AES加密字符串
QString EncryptTool::Encrypt(QString pStr)
{
std::string strData = pStr.toStdString();
size_t len = strData.length();
std::string outstr;
//填key
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
memset(key, 0x30, m_DesKey.size());
m_DesKey.size() <= AES::DEFAULT_KEYLENGTH ? memcpy(key, m_DesKey.c_str(), m_DesKey.size()) : memcpy(key, m_DesKey.c_str(), AES::DEFAULT_KEYLENGTH);
AES::Encryption aesEncryption((byte *)key, AES::DEFAULT_KEYLENGTH);
ECB_Mode_ExternalCipher::Encryption ecbEncryption(aesEncryption);
StreamTransformationFilter ecbEncryptor(ecbEncryption, new HexEncoder(new StringSink(outstr)));
ecbEncryptor.Put(reinterpret_cast<const unsigned char*>(strData.c_str()), len);
ecbEncryptor.MessageEnd();
return QString::fromStdString(outstr);
}
//AES解密字符串
QString EncryptTool::Decrypt(QString pStr)
{
std::string strData = pStr.toStdString();
size_t len = strData.length();
std::string outstr;
//填key
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
memset(key, 0x30, m_DesKey.size());
m_DesKey.size() <= AES::DEFAULT_KEYLENGTH ? memcpy(key, m_DesKey.c_str(), m_DesKey.size()) : memcpy(key, m_DesKey.c_str(), AES::DEFAULT_KEYLENGTH);
AES::Decryption aesDecryption((byte *)key, CryptoPP::AES::DEFAULT_KEYLENGTH);
ECB_Mode_ExternalCipher::Decryption ecbDecryption(aesDecryption);
HexDecoder decryptor(new StreamTransformationFilter(ecbDecryption, new StringSink(outstr)));
decryptor.Put(reinterpret_cast<const unsigned char*>(strData.c_str()), len);
decryptor.MessageEnd();
return QString::fromStdString(outstr);
}
//CBC加密字符串
QString EncryptTool::EncryptCBC(QString pStr)
{
byte iv[AES::BLOCKSIZE] = "9768";
std::string strData = pStr.toStdString();
size_t len = strData.length();
std::string outstr;
//填key
SecByteBlock key(AES::DEFAULT_KEYLENGTH);
memset(key, 0x30, m_DesKey.size());
m_DesKey.size() <= AES::DEFAULT_KEYLENGTH ? memcpy(key, m_DesKey.c_str(), m_DesKey.size()) : memcpy(key, m_DesKey.c_str(), AES::DEFAULT_KEYLENGTH);
AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
StreamTransformationFilter stfEncryptor(cbcEncryption, new HexEncoder(new StringSink(outstr)));
stfEncryptor.Put(reinterpret_cast<const unsigned char*>(strData.c_str()), strData.length());
stfEncryptor.MessageEnd();
return QString::fromStdString(outstr);
}