在把windows下的文件加密程序代码转化为linux下的程序,在windows下程序运行成功,可以加密图像文件,文本文件等文件。在linux平台下出现错误
1、无法打开除字符文件,*bmp文件外的文件
2、运行程序对字符文件进行加密后,无法打开该文件(不是执行解密)查看加密后的内容。不知是否是因为编码转换为了二进制而导致?
附上代码请各位指教:
windows下,vc++:
//给文件加密的函数
BOOL CEcfileDlg::ecfile(LPCTSTR fpath) // fpath是文件路径
{
char *data;
CFile *file;
DWORD flen;
m_password = epass();
file = new CFile;
if ( !file->Open(fpath, CFile::shareDenyNone|CFile::modeReadWrite))
{
return FALSE;
}
flen = file->GetLength(); //获得文件长度
data = new char[(int)flen]; //动态分配数组
file->SeekToBegin(); //指向文件开头
file->Read(data, flen); //写入缓冲区
for(int i=0; i<(int)flen; i++) //文件加密
{
data ^= m_password;
data ^= flen;
}
file->SeekToBegin(); //指向文件开头
file->Write(data, flen); //改写文件
delete[] data; //删除缓冲区
//添加密码验证信息
char cpass[5] = "love";
for(int j=0; j<5; j++)
{
cpass[j] ^= m_password;
}
file->SeekToEnd(); //在文件末尾加入
file->Write(&cpass, 5);
file->Close();
delete file;
return TRUE;
}
//获得密码的函数
__int64 CEcfileDlg::epass()
{
DWORD plen;
char *ppass;
__int64 mc= 8757735233305;
UpdateData(TRUE);
ppass = m_pass.GetBuffer(0);
plen = strlen(ppass);
for(int i=0; i<(int)plen; i++)
{
mc ^= ppass|128;
}
return mc;
}
在linux下:
bool Form1::ecfile(const char *fpath)
{
char *data;
unsigned long flen;
m_password=epass() ; //epass()生成加密密码
QFile f(fpath);
if(! f.open(IO_ReadWrite))
{
return false;
}//判断是否能以读写模式打开文件,不知为什么,如打开图像文件在这一步会返回false
flen=f.size(); //文件长度
data=new char [(int)flen];
f.flush(); //刷新缓存存区
QDataStream s (&f); //读入流
s.readRawBytes( data,flen); //读入长度为flen的数据到data
for(int i=0;i<(int)flen;i++)
{
data ^=m_password;
data ^=flen;
} //加密
f.open(IO_ReadWrite); //返回文件头
QDataStream s1 (&f);
s1.writeRawBytes(data,flen); //从data写入长度为flen的数据到文件
delete[] data; //删除缓冲区
/*-----------加入标识符------------*/
char cpass[5]="love";
for (int j=0;j<5;j++)
{
cpass[j]^=m_password;
}
QDataStream s2 (&f);
f.at(f.size()+1); //到文件末尾
s2.writeRawBytes(cpass,5);
f.close();
return true;
}
请各位帮帮忙,谢谢!