我用des加密后,对原始密文解密没有问题。
但是使用这两个函数
void MessageName2::setCiphertxt(const char * ciphertxt_var)
{
this->ciphertxt_var = ciphertxt_var;
}
const char * MessageName2::getCiphertxt() const
{
return ciphertxt_var.c_str();
}
原始数据我是通过随机数生成的,转为char[]后进行加密,对密文先用setCiphertxt(),再用解密函数对getCiphertxt()解密,测试五十次大概就会有一次出现问题。
比如,原始数据是21001839,解密后变成210018ßt,后面几位出现乱码,或者解密出来都是乱码。
加解密代码是网上找的,测试过是没有问题的。
纠结了好久,有没有大神知道是怎么回事?
void yxyDES2::EncryptData(char* _srcBytes,unsigned int keyN)
{
char szSrcBits[64] = {0};
char sz_IP[64] = {0};
char sz_Li[32] = {0};
char sz_Ri[32] = {0};
char sz_Final64[64] = {0};
Bytes2Bits(_srcBytes,szSrcBits,64);
//IP
InitialPermuteData(szSrcBits,sz_IP);
memcpy(sz_Li,sz_IP,32);
memcpy(sz_Ri,sz_IP + 32,32);
for(int i=0;i<16;i++)
{
FunctionF(sz_Li,sz_Ri,i,keyN);
}
//so D=LR
memcpy(sz_Final64,sz_Ri,32);
memcpy(sz_Final64 + 32,sz_Li,32);
//~IP
for(int j=0;j<64;j++)
{
szCiphertextRaw[j] = sz_Final64[IPR_Table[j]-1];
}
Bits2Bytes(szCiphertextInBytes,szCiphertextRaw,64);
}
void yxyDES2::DecryptData(char* _srcBytes,unsigned int keyN)
{
char szSrcBits[64] = {0};
char sz_IP[64] = {0};
char sz_Li[32] = {0};
char sz_Ri[32] = {0};
char sz_Final64[64] = {0};
Bytes2Bits(_srcBytes,szSrcBits,64);
//IP --- return is sz_IP
InitialPermuteData(szSrcBits,sz_IP);
//divide the 64 bits data to two parts
memcpy(sz_Ri,sz_IP,32); //exchange L to R
memcpy(sz_Li,sz_IP + 32,32); //exchange R to L
//16 rounds F and xor and exchange
for(int i=0;i<16;i++)
{
FunctionF(sz_Ri,sz_Li,15-i,keyN);
}
memcpy(sz_Final64,sz_Li,32);
memcpy(sz_Final64 + 32,sz_Ri,32);
// ~IP
for(int j=0;j<64;j++)
{
szPlaintextRaw[j] = sz_Final64[IPR_Table[j]-1];
}
Bits2Bytes(szPlaintextInBytes,szPlaintextRaw,64);
}