zoukankan      html  css  js  c++  java
  • 简单的压缩文件加解密方法

    注:

      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值来判定密码是否正确。当然还可以更进一步,例如判断解密后的文件头是否和源设定格式一样。

  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/godzza/p/3309634.html
Copyright © 2011-2022 走看看