加密算法分类

对称加密算法:

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥

发送方和接收方需要持有同一把密钥,发送消息和接收消息均使用该密钥。

相对于非对称加密,对称加密具有更高的加解密速度,但双方都需要事先知道密钥,密钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。

常见的对称加密算法:DES,AES,3DES等等

非对称加密算法:

文件加密需要公开密钥(publickey)和私有密钥(privatekey)。

接收方在发送消息前需要事先生成公钥和私钥,然后将公钥发送给发送方。发送放收到公钥后,将待发送数据用公钥加密,发送给接收方。接收到收到数据后,用私钥解密。

在这个过程中,公钥负责加密,私钥负责解密,数据在传输过程中即使被截获,攻击者由于没有私钥,因此也无法破解。

非对称加密算法的加解密速度低于对称加密算法,但是安全性更高

非对称加密算法:RSA、DSA、ECC等算法

消息摘要算法:

消息摘要算法可以验证信息是否被篡改。

在数据发送前,首先使用消息摘要算法生成该数据的签名,然后签名和数据一同发送给接收者。

接收者收到数据后,对收到的数据采用消息摘要算法获得签名,最后比较签名是否一致,以此来判断数据在传输过程中是否发生修改。

加密库

为了在 Linux 上安装它,你可以使用以下pip 命令:

pip3 install -i https://pypi.douban.com/simple pycryptodome 

在Windows 系统上安装则稍有不同:

pip3 install -i https://pypi.douban.com/simple pycryptodomex

DES加密

全称为Data EncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法

入口参数有三个:Key、Data、Mode

Key为7个字节共56位,是DES算法的工作密钥;

Data为8个字节64位,是要被加密或被解密的数据;

Mode为DES的工作方式,有两种:加密或解密

3DES(即Triple DES)是DES向AES过渡的加密算法,

使用两个密钥,执行三次DES算法,

加密的过程是加密-解密-加密

解密的过程是解密-加密-解密

#coding=utf-
from Cryptodome.Cipher import DES key = b'abcdefgh' # 密钥 8位或16位,必须为bytes def pad(text):
"""
# 加密函数,如果text不是8的倍数【加密文本text必须为8的倍数!】,那就补足为8的倍数
:param text:
:return:
"""
while len(text) % != :
text += ' '
return text des = DES.new(key, DES.MODE_ECB) # 创建一个DES实例
text = 'Python rocks!'
padded_text = pad(text)
encrypted_text = des.encrypt(padded_text.encode('utf-8')) # 加密
print(encrypted_text)
# rstrip(' ')返回从字符串末尾删除所有字符串的字符串(默认空白字符)的副本
plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') # 解密
print(plain_text)

输出

b'>\xfc\x1f\x16x\x87\xb2\x93\x0e\xfcH\x02\xd59VQ'
Python rocks!

AES加密

高级加密标准(英语:Advanced EncryptionStandard,缩写:AES),这个标准用来替代原先的DES

AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特(16、24和32字节)

大致步骤如下:

1、密钥扩展(KeyExpansion),

2、初始轮(Initial Round),

3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,

4、最终轮(Final Round),最终轮没有MixColumns。

普通方式

#coding=utf-
from Cryptodome.Cipher import AES
from binascii import b2a_hex, a2b_hex
#秘钥,此处需要将字符串转为字节
key = 'abcdefgh'
#加密内容需要长达16位字符,所以进行空格拼接
def pad(text):
while len(text) % != :
text += ' '
return text
#加密秘钥需要长达16位字符,所以进行空格拼接
def pad_key(key):
while len(key) % != :
key += ' '
return key
#进行加密算法,模式ECB模式,把叠加完16位的秘钥传进来
aes = AES.new(pad_key(key).encode(), AES.MODE_ECB)
#加密内容,此处需要将字符串转为字节
text = 'hello'
#进行内容拼接16位字符后传入加密类中,结果为字节类型
encrypted_text = aes.encrypt(pad(text).encode())
encrypted_text_hex = b2a_hex(encrypted_text)
print(encrypted_text_hex) # #此处是为了验证是否能将字节转为字符串后,进行解密成功
# #实际上a 就是 encrypted_text ,也就是加密后的内容
# #用aes对象进行解密,将字节类型转为str类型,错误编码忽略不计
de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding='utf-8',errors="ignore")
# #获取str从0开始到文本内容的字符串长度。
print(de[:len(text)])

输出:

b'c9f9f942485373f113dc07443ca8f2bf'
hello

面向对象方式

#coding=utf-
from Cryptodome.Cipher import AES
from binascii import b2a_hex, a2b_hex AES_LENGTH = class prpcrypt():
def __init__(self, key):
self.key = key
self.mode = AES.MODE_ECB
self.cryptor = AES.new(self.pad_key(self.key).encode(), self.mode) # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
# 加密内容需要长达16位字符,所以进行空格拼接
def pad(self,text):
while len(text) % AES_LENGTH != :
text += ' '
return text # 加密密钥需要长达16位字符,所以进行空格拼接
def pad_key(self,key):
while len(key) % AES_LENGTH != :
key += ' '
return key def encrypt(self, text): # 这里密钥key 长度必须为16(AES-)、(AES-)、或32(AES-)Bytes 长度.目前AES-128足够用
# 加密的字符需要转换为bytes
# print(self.pad(text))
self.ciphertext = self.cryptor.encrypt(self.pad(text).encode())
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
# 所以这里统一把加密后的字符串转化为16进制字符串
return b2a_hex(self.ciphertext) # 解密后,去掉补足的空格用strip() 去掉 def decrypt(self, text):
plain_text = self.cryptor.decrypt(a2b_hex(text)).decode()
return plain_text.rstrip(' ') if __name__ == '__main__':
pc = prpcrypt('abcdef') # 初始化密钥
e = pc.encrypt("0123456789ABCDEF")
d = pc.decrypt(e)
print(e, d)
e = pc.encrypt("")
d = pc.decrypt(e)
print(e, d)

输出:

b'011704c9ca48ae83fe63c9b245a48cde' 0123456789ABCDEF
b'efabdcfe552e429226b1d0a88e7fa19cd21c7524b38d9122a5fe0c967ce07409'

RSA加密

公钥加密算法,一种非对称密码算法

公钥加密,私钥解密

3个参数:

rsa_n, rsa_e,message

rsa_n, rsa_e 用于生成公钥

message: 需要加密的消息

安装 pip install rsa

使用

import rsa
from binascii import b2a_hex, a2b_hex class rsacrypt():
def __init__(self, pubkey, prikey):
self.pubkey = pubkey
self.prikey = prikey def encrypt(self, text):
self.ciphertext = rsa.encrypt(text.encode(), self.pubkey)
# 因为rsa加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
# 所以这里统一把加密后的字符串转化为16进制字符串
return b2a_hex(self.ciphertext) def decrypt(self, text):
decrypt_text = rsa.decrypt(a2b_hex(text), prikey)
return decrypt_text if __name__ == '__main__':
pubkey, prikey = rsa.newkeys()
rs_obj = rsacrypt(pubkey,prikey)
text='hello'
ency_text = rs_obj.encrypt(text)
print(ency_text)
print(rs_obj.decrypt(ency_text))

输出:

b'923af53dbc976be4c727589bddd66ffd981120d1b230de4075cc3e06bca4e4f6'
b'hello'

python 加密与解密的更多相关文章

  1. Python加密与解密

    前言 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话 保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用. 随着信息化 ...

  2. Python档案袋( Json、pickle、加密与解密)

    Json是各程序通用的数据格式:pickle是Python特有的,可以存储很多Python特有的数据,如函数地址等 Json的简单使用: import json jsondata={ "us ...

  3. Python: AES加密与解密

    起源: 视频下载,解析到一个网站时,发现其视频id是用AES加密过的,用的是https://code.google.com/archive/p/crypto-js/这个库.解密很简单的一句js代码: ...

  4. DES的加密与解密算法(Python实现)

    DES的加密与解密算法(Python实现) 密码学实验:实现了DES的简单的加密和解密算法,DES算法的相关资料网上很多,这里不再赘述,仅仅贴出源代码给大家分享,源码中包含很多汉字注释,相信大家都是可 ...

  5. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  6. 使用Python进行AES加密和解密

    摘录于:http://blog.csdn.net/nurke/article/details/77267081 另外参考:http://www.cnblogs.com/kaituorensheng/p ...

  7. javascript的rsa加密和python的rsa解密

    先说下目前测试情况:javascript加密后的数据,python无法完成解密,我估计是两者的加密解密方法不同 1.看了这篇文章:http://blog.nsfocus.net/python-js-e ...

  8. Python中的Base64编码的加密与解密

    Base64 可以干些啥? Base64编码的作用: 由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法. 图片(and种子)base64 ...

  9. python RSA加密、解密、签名

    python RSA加密.解密.签名 python中用于RSA加解密的库有好久个,本文主要讲解rsa.M2Crypto.Crypto这三个库对于RSA加密.解密.签名.验签的知识点. 知识基础 加密是 ...

随机推荐

  1. [py][mx]django使用class写views-免去判断方法的烦恼

    修改views使用class模式 类模式写views - 免去了函数模式的判断的烦恼 users/views.py from django.views.generic import View clas ...

  2. 关于Python类属性与实例属性的讨论

    标题名字有点长. 之所以想写这个文章是因为碰巧看到网上一篇关于Pyhon中类属性及实例属性区别的帖子.因为我之前也被这个问题困扰过,今天碰巧看到了这篇帖子,发现帖子的作者只是描述了现象,然后对原因的解 ...

  3. webdriver模拟鼠标悬浮

    未经作者允许,禁止转载! 有时候会遇到这样的情况,鼠标停留在某一区域,不需要点击,悬浮在这一区域的上方就会显示该区域的下拉框,如下图 下面将鼠标停留在“日历”和“星座”这两个部分之间来回悬浮,下面是代 ...

  4. cocos代码研究(6)有限时间动作类(FiniteTimeAction)学习笔记

    理论部分 有限时间动作类继承自Action类,被 ActionInstant(即时动作) , 以及 ActionInterval(持续动作) 继承. 即时动作是会立即被执行的动作,被 CallFunc ...

  5. 010-centos上安装matlab

    #001-下载matlab_R2015b和破解文件(四个)到百度云盘上下载7.6g#002-上传matlab大文件先安装vm tools,然后直接复制到虚拟机桌面#003-挂载matlab镜像并安装m ...

  6. Atcoder Tenka1 Programmer Contest 2019 E - Polynomial Divisors

    题意: 给出一个多项式,问有多少个质数\(p\)使得\(p\;|\;f(x)\),不管\(x\)取何值 思路: 首先所有系数的\(gcd\)的质因子都是可以的. 再考虑一个结论,如果在\(\bmod ...

  7. Python消息队列工具 Python-rq 中文教程

    原创文章,作者:Damon付,如若转载,请注明出处:<Python消息队列工具 Python-rq 中文教程>http://www.tiangr.com/python-xiao-xi-du ...

  8. linux 安装软件的几种方法

    一. 解析Linux应用软件安装包: 通常Linux应用软件的安装包有三种: 1) tar包,如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包的. 2) rp ...

  9. js dom 操作技巧

    1.创建元素 创建元素:document.createElement() 使用document.createElement()可以创建新元素.这个方法只接受一个参数,即要创建元素的标签名.这个标签名在 ...

  10. Linux基础命令---e2image

    e2image e2Image程序将位于设备上的ext2.ext3或ext4文件系统元数据保存到由图像文件指定的文件中.通过对这些程序使用-i选项,image文件可以由dupe2fs和调试器来检查.这 ...