关于QT结合cryptlib加密的使用

最近在项目中用到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);
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值