前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3 加密解密技术详解

Python3 加密解密技术详解

作者头像
小小科
发布2018-05-04 17:15:53
3.2K0
发布2018-05-04 17:15:53
举报
文章被收录于专栏:北京马哥教育北京马哥教育

引言

Python 3 的标准库中没多少用来解决加密的,不过却有用于处理哈希的库。

在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto 和 cryptography 上。

我们将学习如何使用这两个库,来加密和解密字符串

哈希

1.哈希简介

使用标准库中的 hashlib 模块可以用来处理安全哈希算法或者消息摘要算法。

这个模块包含了符合 FIPS(美国联邦信息处理标准)的安全哈希算法,例如 SHA1,SHA224,SHA256,SHA384,SHA512 以及 RSA 的 MD5 算法。

当然,Python也支持 adler32 以及 crc32 哈希函数,不过它们在 zlib 模块中。

哈希的最常见的用法是,存储密码的哈希值而非密码本身。这时候使用哈希函数需要稳健一点,否则容易被破解。

另一个常见的用法是,计算一个文件的哈希值,然后将这个文件和它的哈希值分别发送。

接收到文件的人可以计算文件的哈希值,检验是否与接收到的哈希值相符——以此来检验文件是否被篡改。

2.实战示例

  • 创建一个 md5 哈希:

如图所示,我们首先导入hashilb,然后创建一个md5哈希对象的实例。

随后,在示例中添加一个字符串,出现了报错信息。

这是因为计算md5哈希时,必须是用字节形式字符串,正确添加后就可以调用digest函数来得到哈希值了。

  • 十六进制的哈希值

十六进制哈希值可以用以下方法获取:

  • 创建哈希的简单方法

下面我们看一下用这种方法创建一个 sha1 哈希:

可以看到,我们可以同时创建一个哈希实例并且调用其 digest 函数。

然后,我们可以输出这个哈希值看一下。

密钥导出

Python 的标准库对密钥导出支持较弱:hashlib 函数库提供的唯一方法就是 pbkdf2_hmac 函数。

它是 PKCS#5的基于口令的第二个密钥导出函数,并使用 HMAC 作为伪随机函数。

由于它支持“加盐salt”和迭代操作,你可以使用类似的方法来哈希你的密码。

例如,如果你打算使用 SHA-256 加密方法,你将需要至少 16 个字节的“盐”,以及最少 100000 次的迭代操作。

简单来说,“盐”就是随机的数据,被用来加入到哈希的过程中,以加大破解的难度。

这基本可以保护你的密码免受字典和彩虹表rainbow table的攻击。

  • 示例

这里,我们用 SHA256 对一个密码进行哈希,使用了一个糟糕的“盐”,但经过了 100000 次迭代操作。

SHA 实际上并不被推荐用来创建密码的密钥,你应该使用类似scrypt的算法或者使用一个叫 bcrypt 的专门用来哈希密码第三方库。

PyCryptodome

原本是项目分支PyCrytodome 取代了Python中密码学方面最有名的软件包 PyCrypto 。

使用以下命令进行安装PyCrytodome:

  • Linux
  • Windows

如果你遇到了问题,可能是因为你没有安装正确的依赖包(LCTT 译注:如 python-devel),或者你的 Windows 系统需要一个编译器。

DES算法学习

1.DES 算法加密示例

示例步骤如下:

  • 将密钥变量设置为 8 个字符(DES 加密使用的密钥长度为 8 个字节)
  • 创建一个函数pad,来给一个字符串末尾填充空格,直到它的长度是 8 的倍数
  • 创建一个 DES 的实例、需要加密的文本、经过填充处理的文本
  • 尝试着对未经填充处理的文本进行加密,显示ValueError错误
  • 过填充处理的文本进行加密,得到加密的字符串

2.DES解密示例

解密非常容易,调用des对象的decrypt方法就可以得到原来的byte类型字符串了。

下一个任务是学习如何用 RSA 算法加密和解密一个文件。

RSA算法学习

要使用 RSA 算法加密数据,必须拥有访问 RAS 公钥和私钥的权限,否则你需要生成一组自己的密钥对。

在这个例子中,我们将生成自己的密钥对。

1.在 Python 解释器中创建 RSA 密钥:

  • 从 Crypto.PublicKey 包中导入 RSA,创建一个密码
  • 生成 2048 位的 RSA 密钥
  • 调用 RSA 密钥实例的 exportKey 方法,传入密码、使用的 PKCS 标准以及加密方案这三个参数。
  • 将私钥写入磁盘的文件。
  • 使用方法链调用publickey 和 exportKey 方法生成公钥,写入磁盘上的文件。

2.加密文件

有了私钥和公钥之后,我们就可以加密一些数据,并写入文件了。

  • 导入 PyCryptodome 包
  • 打开一个文件用于写入数据
  • 导入公钥赋给一个变量,创建一个 16 字节的会话密钥。例中使用混合加密方法,即 PKCS#1 OAEP,也就是最优非对称加密填充
  • 创建 AES 加密,然后加密数据,得到加密的文本和消息认证码
  • 将随机数、消息认证码和加密的文本写入文件

这里的随机数通常是真随机或伪随机数,只是用来进行密码通信的。对于 AES 加密,其密钥长度最少是 16 个字节。

3.解密示例

  • 以二进制模式读取加密文件
  • 导入私钥。注意,导入私钥时,需要提供密码
  • 文件中读取加密的会话密钥、 16 字节的随机数、16 字节的消息认证码和其他加密数据
  • 解密出会话密钥,重新创建 AES 密钥
  • 解密出数据

接下来就是cryptography包的学习。

cryptography包

cryptography能够创建简单安全、易于使用的加密方案。如果有需要的话,你也可以使用一些底层的密码学基元。

1.安装

如果你使用的 Python 版本是 3.5, 你可以使用 pip 安装,如下:

如果安装成功,我们就可以试着加密一些文本了。

建议使用 Fernet 对称加密算法,它保证了加密信息在不知道密码的情况下不能被篡改或读取。Fernet 还通过 MultiFernet 支持密钥轮换。

2.示例

下面看一个简单的例子:

  • 导入 Fernet
  • 生成一个密钥,它是一个随机的字节串。
  • 使用这个密钥生成 Fernet 密码
  • 现在我们有了用来加密和解密消息的密码
  • 创建一个消息,然后使用 encrypt 方法对它加密
  • 输出出加密的文本
  • 调用 decrypt 方法,并传入加密的文本作为参数
  • 得到了消息字节串形式的纯文本,完成解密

小结

本文浅显地介绍了 PyCryptodome 和 cryptography 这两个包的使用,即关于如何加密解密字符串和文件的简述。

如果想要获取更多的更深度的内容,可以阅读官方文档或进行实战练习。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档