Python sha256+zlib库 实现简易文件加密算法

数字化时代下,数据安全对各大公司及个人的重要性不言而喻。作为Python语言使用者, 如何进行数据的加密和解密呢?本文带领大家来了解一下。

sha256算法

sha256算法是目前应用非常广泛的数据加密算法, 可以简单的理解为:通过一个函数,把任意长度的数据转换为一个长度固定的数据串。

性质
不可逆性:sha256加密是一个单向密码体制,即从明文到密文的不可逆映射,只有加密过程没有解密过程。(本文会使用其他方法使数据可以解密。)

压缩性:任意长度的数据,算出的sha256值长度都是固定的。

抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的sha256值都有很大区别。

抗碰撞性:已知原数据和其sha256值,想找到一个具有相同sha256值的数据(即伪造数据)是非常困难的。

标准库知识

*已经熟悉这些模块的, 请忽略。
hashlib模块

  • hashlib.sha256(byte)
    返回一个sha256加密对象obj, 用于后续操作。注意参数必须是bytes类型。
    • obj.hexdigest()
      获取sha256加密对象的十六进制sha256值, 返回一个字符串。
    • obj.digest()
      获取sha256加密对象的二进制sha256值, 返回一个bytes类型数据。

zlib模块

  • zlib.compress(data, [level])
    压缩一个二进制数据, 返回值为压缩后的数据。
    data: 待压缩的数据, bytes类型。
    level: 压缩级别, 可选参数, 可以是zlib.Z_BEST_COMPRESSION, Z_DEFAULT_COMPRESSION, 或Z_NO_COMPRESSION
  • zlib.decompress(data)
    解压数据, 与zlib.compress相反。注意如果data数据有损坏, 那么zlib会报错。

加密与解密数据

加密部分首先计算密码的sha256值, 再将数据用zlib压缩,
然后将压缩数据密码变换得到的sha256进行异或运算, 得到结果。

由于密码经过了变换处理, 在不知道密码的情况下, 找到密码变换得到的sha256是非常困难的。另外, 使用zlib压缩也是为了防止找到密码变换得到的sha256, 避免数据被直接破解。
比如,原始文件里有一大段的由"00"字节组成的数据,经过异或之后的数据就直接含有sha256值,会导致数据被破解。

def encrypt(data,password,compress_level=-1):
    data = zlib.compress(data,compress_level) # 先使用zlib压缩
    sha256=hashlib.sha256(password.encode("utf-8")).hexdigest() # 获取密码的sha256
    head = sha256.encode() + len(data).to_bytes(8,"big") # 文件头
    mask = hashlib.sha256((password*2).encode("utf-8")
                          ).hexdigest() # 使用密码的变体(重复2次)的sha256作为掩码
    mask_num = int.from_bytes(mask.encode(),"little")

    encrypted=b''
    for i in range(0,len(data),64): # sha256结果为64字节长
        num = int.from_bytes(data[i:i+64],"little") # 截取data的一部分
        num_enc = num ^ mask_num # 将data的一部分与掩码进行异或运算
        encrypted += num_enc.to_bytes(64,"little")

    return head + encrypted[:len(data)]

解密部分首先将密码的sha256值与已加密数据头部的sha256值进行比对, 如果不匹配, 就提示错误。
再重新把加密数据密码变换得到的sha256进行异或运算, 还原得到压缩数据。再解压, 得到结果。

def decrypt(encrypted,password):
    sha256 = encrypted[:64]
    if hashlib.sha256(password.encode("utf-8")).hexdigest().encode()\
                   != sha256: # 检验密码是否正确
        raise TypeError("Invalid password")

    mask = hashlib.sha256((password*2).encode("utf-8")).hexdigest() # 掩码
    mask_num = int.from_bytes(mask.encode(),"little")
    length = int.from_bytes(encrypted[64:64+8],"big") # (压缩的)数据长度

    data = b''
    for i in range(64+8,len(encrypted),64):
        num_enc = int.from_bytes(encrypted[i:i+64],"little")
        num = num_enc ^ mask_num # 与掩码进行异或运算
        data += num.to_bytes(64,"little")

    return zlib.decompress(data[:length]) # 返回原长度的数据

def test(): # 用于程序测试
    seq=b"Hello world!";password="123"
    #若不等于则引发AssertionError
    assert decrypt(encrypt(seq,password),password)==seq

主程序

主程序部分用于处理文件的加密、解密, 以及程序参数sys.argv

FILETYPE=".encrypt"

def __ask_replace(filename):
    if not os.path.isfile(filename):return True
    result=input("文件 %s已存在,要替换它吗? "%filename)
    return result.lower().startswith('y')
def main():
    if len(sys.argv)==1:
        print("命令行: encryption.py 文件名1 [文件名2] [...]\n未提供文件。")
        return
    for arg in sys.argv[1:]:
        print("处理文件 "+arg)

        with open(arg,'rb') as fin:
            if arg.lower().endswith(FILETYPE):#解密
                newfile = arg[:-len(FILETYPE)]
                if not __ask_replace(newfile):continue
                password = input("输入密码: ")
                data = decrypt(fin.read(),password)
            else: #加密
                newfile = arg + FILETYPE
                if not __ask_replace(newfile):continue
                password = input("输入密码: ")
                data = encrypt(fin.read(),password)

            with open(newfile,"wb") as fout:
                fout.write(data)

if __name__=="__main__":main()

还有更好的数据加密、解密方法吗? 欢迎读者在评论区留言。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在VS2013编译libcurl时,需要使用OpenSSL和zlib。libcurl是一个功能强大的开源网络,能够实现跨平台的HTTP、FTP、SMTP等协议的数据传输。 OpenSSL是一个开源的加密,提供了各种加密算法和安全协议的实现,可以用于SSL/TLS的加密和解密通信。在编译libcurl时,需要将OpenSSL的头文件文件加入到VS2013的编译环境。这样在编译libcurl时,可以使用OpenSSL提供的加密算法和安全协议进行网络通信的加密zlib一个开源的数据压缩,可以实现数据的高效压缩和解压。在编译libcurl时,需要将zlib的头文件文件加入到VS2013的编译环境。这样在编译libcurl时,可以使用zlib提供的数据压缩和解压功能,提高数据传输的效率。 在编译过程,应首先确保已正确安装了OpenSSL和zlib,并设置了相应的环境变量。然后,在VS2013创建一个新的项目,将libcurl的源代码添加到项目。接着,在项目属性设置包含目录和目录,指定OpenSSL和zlib的头文件文件的位置。 最后,进行编译和链接操作,生成libcurl的文件和可执行文件。编译成功后,就可以在VS2013使用libcurl的各种功能了。 总结来说,编译libcurl时需要使用OpenSSL和zlib,并确保已正确配置VS2013的编译环境,包含相关的头文件文件。完成配置后,就可以在VS2013编译和使用libcurl了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qfcy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值