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

  • 相关阅读:
    "科林明伦杯"哈理工第九届——分布式服务(概率期望+思维)
    Nim游戏——简单博弈论
    acwing 1252搭配购买(并查集 + 01背包 )
    [LeetCode] 67. Add Binary
    [LeetCode] 415. Add Strings
    [LeetCode] 43. Multiply Strings
    [LeetCode] 412. Fizz Buzz
    [LeetCode] 201. Bitwise AND of Numbers Range
    [LeetCode] 389. Find the Difference
    [LeetCode] 326. Power of Three + 342. Power of Four
  • 原文地址:https://www.cnblogs.com/godzza/p/3309634.html
Copyright © 2011-2022 走看看