-
大小: 20KB文件類型: .7z金幣: 1下載: 1 次發布日期: 2021-06-14
- 語言: Java
- 標簽: Qt??AES??ECB??PKCS5Padding??
資源簡介
最近找Qt下可用的與java通用的AES加密解密代碼。
openssl不是很好用(不會和Qt編譯到一起。。。)
所以參考網上的資料,終于找到了一個C++可用的代碼,稍作修改。
代碼片段和文件信息
#include?“aestools.h“
#include?
AESTools::AESTools(QString?*keyqs)
{
????QByteArray?key?=?keyqs->toLocal8Bit();
????if(key.size()?!=?16)
????{
???????char?keys[17]?=?“\0“;
????????for(int?i?=?0;i?16;i++)
????????{
????????????keys[i]?=?key.at(i?%?key.size());
????????}
????????keys[16]?=?‘\0‘;
????????crijndael.MakeKey(keys““);
????}?else{
????????crijndael.MakeKey(key.data()““);
????}
}
QString*?AESTools::Decrypt(const?QString?*hexData)
{
????char?*da?=?NULL;
????try{
????????QByteArray?a?=?QByteArray::fromHex(hexData->toLocal8Bit());
????????int?length?=?a.size()?+?1;
????????da?=?new?char[length?*?2];
????????crijndael.Decrypt(a.data()?da?length?-?1);
????????int?max?=?0;
????????for(int?i?=?length?-?2;i?>?-1;i--){
????????????if(da[i]?<=?‘\x10‘?&&?da[i]?>=?‘\x00‘){
????????????????da[i]?=?0;
????????????????max++;
????????????}?else{
????????????????break;
????????????}
????????}
????????QString?*r2?=?new?QString(QString::fromLocal8Bit(dalength?-?max)?);
????????delete[]?da;
????????da?=?NULL;
????????return?r2;
????}catch(QString?exc){
????????if(da?!=?NULL){
????????????delete?[]da;
????????}
????????return?NULL;
????}
}
QString*?AESTools::Encrypt(const?QString?*?data)
{
????char*?p_data?=?NULL;
????char?*szDataOut?=?NULL;
????try{
????????//待加密字節數
????????int?length=data->toLocal8Bit().size();
????????//塊數
????????int?block_num=length/16;
????????if(length%16)
????????{
????????????block_num++;
????????}
????????//構造加密塊padding方式為PKCS7加密過程中,使用的塊
????????p_data=new?char[block_num*16+1];
????????memset(p_data0x00block_num*16+1);
????????memcpy(p_data?data->toLocal8Bit().data()?length);
????????//padding塊前一部分長度
????????int?k=length%16;
????????//不padding塊數
????????int?j=length/16;
????????//padding塊后一部分長度
????????int?padding=16-k;
????????for(int?i=0;i ????????{
????????????p_data[j*BLOCK_SIZE+k+i]=padding;
????????}
????????p_data[j*BLOCK_SIZE+k+padding]=‘\0‘;
????????//padding?結束
????????//加密后的密文
????????szDataOut?=?new?char[block_num*16+1];
????????memset(szDataOut?0?block_num*16+1);
????????//加密字符串
????????crijndael.Encrypt((char*)p_data?szDataOut?block_num*16);
????????QString?*result?=?new?QString(QByteArray(szDataOut?block_num*16).toHex());
????????delete[]?p_data;
????????p_data?=?NULL;
????????delete[]??szDataOut;
????????szDataOut?=?NULL;
????????return?result;
????}catch(QString){
????????if(p_data?!=?NULL){
????????????delete?p_data;
????????}
????????if(szDataOut?!=?NULL){
????????????delete?szDataOut;
????????}
????????return?NULL;
????}
}
評論
共有 條評論