OpenSSL AES_CBC-256解密的字符串并不总是正确的
OpenSSL AES_CBC-256 decrypted string is not always correct
我对OpenSSL AES CBC-256有问题,这导致几乎15%的消息未正确解码。该程序使用QT,这就是为什么我使用QT类型的原因。有什么方法可以解决此问题,或者我应该放弃与AES加密。
void fillIV(unsigned char* IN) //Function to fill initialization vector with alphanumerics (for now,in future replaced by RAND())
{
QString charset="ABCDEFGIJKLMNOPQRSTOWXYZabcdefghijklmnopqrstuwxyz0123456789";
for(int i=0;i<AES_BLOCK_SIZE;i++)
{
IN[i]=charset[qrand()%charset.length()].toAscii(); //Random QChar from QString
}
}
bool qorgIO::TEST(QString Password,MainWindow *main)
{
//ENCRYPT SECTION-------------------------------------------------------------------
QString OUT="HEADERHEADERHEA";
{
QString data="<ORG><CALENDAR></CALENDAR></ORG>";
if(data.length()%AES_BLOCK_SIZE==0)
{
data+=".";
}
//To prevent the length of data being multiplicity of 16(AES_BLOCK_SIZE)
//It cause a bunch of trash following the decrypted text
if(Password.length()< 32)
{
Password.append(QString(32-Password.length(),' '));
}
//Password is padded to 32 chars == 256 bits
AES_KEY *aesKey = new AES_KEY;
AES_set_encrypt_key((unsigned char*)Password.toAscii().data(), 256, aesKey);
//Setting AES-KEY Password.toAscii().data() is a char*
const size_t encslength = ((data.length() + AES_BLOCK_SIZE) / AES_BLOCK_SIZE) * AES_BLOCK_SIZE;
//Size of output: better have 16 bytes free then 16 bytes too little
unsigned char IV[AES_BLOCK_SIZE+1]; //16 bytes of IV and
fillIV(IV); //Create alphanumeric IV
//RAND_bytes(IV, AES_BLOCK_SIZE); //Random IV
OUT.append(QByteArray((const char*)IV).toBase64());
//Add to output data base64 representation of IV(in future IV will be random chars)
//IV during enryption change
unsigned char* aOUT;
aOUT=new unsigned char[encslength]; //Create the output space
memset(aOUT, 0, sizeof(encslength)); //Clear the output space
AES_cbc_encrypt((unsigned char*)data.toAscii().data(),aOUT,data.length(),aesKey,IV,AES_ENCRYPT);
//Encrypt the data
//AES_cbc_encrypt(unsigned char* data,unsigned char* output, AESKEY,unsigned char* IV, MODE)
OUT+="n";
OUT.append(QByteArray((const char*)aOUT).toBase64());
//Add base64 representation of encoded data
}
//END OF ENCRYPT SECTION------------------------------------------------------------
//Output:
//HEADERHEADERHEA(base64 IV)n(base64 data)(dot because data is 16*k charactes long)
//In this given example: HEADERHEADERHEA(base64 IV)n(base64 data).
//DECRYPT SECTION-------------------------------------------------------------------
QString text=OUT;
QString Header=text.mid(0,15); //Get "HEADERHEADERHEA"
QString IV=text.mid(15,text.indexOf("n")-15); //Get IV(base64)
QString Data=text.mid(text.indexOf("n")+1,text.length()-text.indexOf("n")-1);
//Get encrypted data(base64)
QByteArray IVBA=QByteArray::fromBase64(IV.toAscii()); //Decode base64
QByteArray DataBA=QByteArray::fromBase64(Data.toAscii()).data(); //Decode base64
if(Password.length()< 32)
{
Password.append(QString(32-Password.length(),' '));
}
//Password padding
AES_KEY *aesKey = new AES_KEY;
AES_set_decrypt_key((unsigned char*)Password.toAscii().data(), 256, aesKey);
//Set decryption key
int sizeofinput=DataBA.size();
//Size of output is <= size of input data
unsigned char *Output;
Output=new unsigned char[sizeofinput]; //Create the output array
memset(Output, 0 , sizeof(sizeofinput)); //Clear the output space
AES_cbc_encrypt((unsigned char*)DataBA.data(),Output,sizeofinput,aesKey,(unsigned char*)IVBA.data(),AES_DECRYPT);
//Decryption
//AES_cbc_encrypt(unsigned char* data,unsigned char* output, AESKEY,unsigned char* IV, MODE)
QString Decrypted=Header; //Header was plain text
Decrypted.append((const char*)Output); //Add output to the text
//END OF DECRYPT SECTION------------------------------------------------------------
if(Decrypted!="HEADERHEADERHEA<ORG><CALENDAR></CALENDAR></ORG>.")
{
qDebug()<<Decrypted; //Show the decrypted string
//up == "cout<<Decrypted.toStdString()";
return false;
}
else
{
return true;
}
}
解码的字符串并不总是我想接收的数据(10000个试验的错误字符串的15%)。是AES算法的问题(密码中不忍受 0')还是在创建代码时的错误?
?对于任何语言错误,我非常抱歉。
问题是输出中的无效字符。构造函数QByTearray(const char*)将数据收集到第一个 0。该解决方案是使用构造函数qbyTearray(const char*,int),该曲线允许将所有数据从输出char流到qbyTearray。
AES_cbc_encrypt((unsigned char*)data.toAscii().data(),aOUT,data.length(),aesKey,IV,AES_ENCRYPT);
//Encrypt the data
//AES_cbc_encrypt(unsigned char* data,unsigned char* output, AESKEY,unsigned char* IV, MODE)
OUT+="n";
//!!OUT.append(QByteArray((const char*)aOUT).toBase64());
//Here we change line to:
OUT.append(QByteArray((const char*)aOUT,encslength).toBase64());
相关文章:
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 将浮点数转换为无符号字符数组并打印出来
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 如何存储 unicode 字符并将其输出到文件?
- 仅读取文件末尾的最后 3 个字符,并将其另存为 int
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 拆分字符数组并存储为向量
- 在函数中连接两个字符,并在 C++ 中返回输出
- Boost Asio SerialPort。无法创建并打开串口服务
- 如何从字符数组C++中提取2个整数并将它们存储在2个变量中(初学者)
- (C++) 取字符串的每个字符并将其放入数组中并获取所述数组的大小?
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 如何加入两个指针以将其串在一起并将其存储在数组或字符中
- 我有编译器的情况。当我运行代码来去除一串特殊字符时,它在一个编译器中运行,但在另一个编译器中不运行?
- 将标准字符串转换为 ascii 字符并通过串行端口 c++ 发送
- 编写一个程序,读取一串包含标点符号的字符,并写入被读取的内容,但删除了标点符号
- 汇编:循环遍历一串字符并交换它们