GodZza

导航

简单的压缩文件加解密方法

注:

  1.文章只是个人猜想之个人方案,不是常用的压缩软件所用算法。
  2.只涉及到加解密,跟压缩无关。

 

这个假期想了点系统文件加密的方法,系统要求只在当前系统能读取到正确的文件信息,作为从盘时读取到的是错误信息,硬盘数据不能被拷贝,等等。有一些简单的解决方法,就是利用系统提供的方案,例如Bitlocker或者EFS。

BitLocker的问题是

  1.需要Windows Vista 系统及以上,而当前系统使用Win Xpe系统。
  2.需要手动输入密码,这就相当于公布了密码。如果使用硬件加密,则成本增加。

而EFS加密也会有相近问题,

  1.EFS是针对账户加密的(搜索下EFS破解可知道大概原理),最好是需要用户增加账户密码。
  2.系统要求禁止鼠标键盘,开机启动游戏。需要设置成账户带密码自动登录。
  3.设置自动登录的数据在注册表,可以使用外部PE工具读取其他系统的注册表数据。(这3点其实也就是一点= =)

 

以目前的要求,还没想到相应的解决办法,但在过程中却想到了压缩软件的简单加解密方案。

方法跟目前网站上的加密原理相似,目前网站后台保存的账户密码不再是明文,而是经过MD5加密(此算法是不可逆的,所以只能暴力破解),还有写比较安全的做法是为了避免用户密码设置得过于简单,会在用户密码后加上一串码之后再进行MD5加密。这样的情况是就算网站被爆库也不用怕账户信息被泄漏。

同理,在使用加密时候先对文件使用密码原文进行加密,在文件末端添加密码的Hash值(可以使用CRC,使用一个无符号32位的整型,比MD5的长度小)而在解密时先将用户输入的密码进行Hash,再与文件末端的Hash值进行对比,如果两值相等则可以进行解密。

这样的做法好处是:

  1.无需保存密码原文,增加了安全性
  2.暴力破解生成的Hash可能会产生碰撞,但如果非原密码,解密的文件也是乱数。

 

以下是伪代码:

u32 GetHash(vector<char> password);

u32 GetFileHash(vector<char> buf); //read file end crc code
u32 GetNextRepeatId(vector<char> buf, next); //repeat next to 0 ~ len-1
vector<char> Encrypt(vector<char> buf, vector<char> password)
{
    Assert(password.size() > 0);
    vector<char> res;
    size_t next = 0;
    for(size_t i=0;i<buf.size();++i)
    {
        res.push_back(buf[i] ^ password[next]);
        next = GetNextRepeatId(password, next);
    }
    res.push_back(GetHash(password));//TODO:u32 to char convert.
}

vector<char> Decrypt(vector<char> buf, vector<char> password)
{
    Assert(password.size() > 0);
    if(GetHash(password) != GetFileHash(buf))
    {
         Assert(0);
         throw PasswordException();
    }

    vector<char> res;
    size_t next = 0;
    for(size_t i=0;i<buf.size();++i)
    {
        res.push_back(buf[i] ^ password[next]);
        next = GetNextRepeatId(password, next);
    }
    res.remove the crc code
    return res;
}

代码中看到,解密部分就算if(GetHash(password) != GetFileHash(buf)) 被hack成if(false),导致下面直接执行解密,但解密出来的文件还是错误的。

 

更新:13.09.29

总的来说,就是加解密使用用户输入的密码,而使用密码的Hash值来判定密码是否正确。当然还可以更进一步,例如判断解密后的文件头是否和源设定格式一样。

posted on 2013-09-09 13:19  GodZza  阅读(885)  评论(0编辑  收藏  举报