• 5127阅读
  • 3回复

请教一个加密代码的问题 [复制链接]

上一主题 下一主题
离线etim
 

只看楼主 倒序阅读 楼主  发表于: 2008-04-09
请教一个加密代码的问题
— 本帖被 XChinux 执行加亮操作(2008-04-09) —
在把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;       
}
请各位帮帮忙,谢谢!
离线etim

只看该作者 1楼 发表于: 2008-04-11
请各位帮帮忙,看看有什么qt的类可以代替,谢谢
离线etim

只看该作者 2楼 发表于: 2008-04-12
实在没办法,请各路高人指点迷津~
离线etim

只看该作者 3楼 发表于: 2008-04-17
各位有兴趣的朋友请帮忙看看
快速回复
限100 字节
 
上一个 下一个