Python常见加密算法 MD5\SHA\AES\DES\ECC\SM2\SM3\SM4\Paillier\ckks

文章里所有算法代码可以在资源中下载

MD5算法 hashlib

MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5处理之后产生的是一个固定长度(32位或16位)的数据。

常规讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大MD5是可以被破解的。但是要注意,破解MD5是需要考虑破解的成本(时间和机器性能)。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。

增加破解成本的方法:
使用一段无意义且随机的私钥进行MD5加密会生成一个加密串,我们暂且称之为串1;
将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2 ;
将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。
注:我们在注册账号时的密码一般都是用MD5进行加密

hashlib库

Python3中可以使用hashlib库实现加密,hashlib提供了多个不同的加密算法接口,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等

hash是一种算法(不同的hash算法只是复杂度不一样)(python3.x里面 代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256, SHA384, SHA512, MD5算法),该算法接收传入的内容,经过运算得到一串hash值。

import hashlib
m=hashlib.md5() # 括号内也可以传内容
m.update(‘str1’,encode(‘utf-8’)) # 必须是bytes类型
m.update(‘str2’,encode(‘utf-8’)) # 内容可以分开放进去
print(m.hexdigest())

将文件加密:
import hashlib
with open(‘r.txt’,‘rb’)
  m=hashlib.md5()
  for line in f:
    m.update(line)
   print(m.hexdigest())
补充: 逐行打开文件,速度太慢,一般都选择抽样进行效验

hash.digest() :返回摘要,作为二进制数据字符串值
hash.hexdigest():返回摘要,作为十六进制数据字符串值

SHA1

SHA1比MD5的安全性更强,但也比MD5慢

.HMAC

全称:散列消息鉴别码(Hash Message Authentication Code),HMAC加密算法是一种安全的基于加密hash函数和共享密钥的消息认证协议。一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即 MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

要想保证hmac最终结果一致,必须保证:
hmac.new括号内指定的初始key一样
.无论update多少次,校验的内容累加到一起是一样的内容

Base64伪加密 base64

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已。Base64使用A–Z,a–z,0–9,+,/ 这64个字符实现对数据进行加密。

DES、AES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。AES全称为Advanced Encryption Standard,即高级加密标准,现在用AES这个标准替代原来的DES。

AES和DES的区别
· 加密后密文长度不同:
DES加密后,密文长度是8的整数倍
AES加密后,密文长度是16的整数倍
· 应用场景不同:
企业级开发使用DES足够安全
如果要求高,使用AES
· 使用DES/AES进行数据交换时,要求双方都拥有相同的私钥

破解方法:暴力破解
DES如果使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。只要计算足够强大是可以被破解的
2.5.1.DES pyDes
DES是一个分组加密算法,它以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。DES是一个包含16个阶段的“替换–置换”的分组加密算法,64位的分组明文序列作为加密算法的输入,经过16轮加密得到64位的密文序列。

AES base64 crypto

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

crypto

https://www.php.cn/python-tutorials-412934.html
Crypto 算法库在 python 中最初叫 pycrypto,这个作者有点懒,好几年没有更新,后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3,安装也很简单pip install pycryptodome就行了

常见对称密码在 Crypto.Cipher 库下,主要有:DES 3DES AES RC4 Salsa20
非对称密码在 Crypto.PublicKey 库下,主要有:RSA ECC DSA
哈希密码在 Crypto.Hash 库下,常用的有:MD5 SHA-1 SHA-128 SHA-256
随机数在 Crypto.Random 库下
实用小工具在 Crypto.Util 库下
数字签名在 Crypto.Signature 库下

RSA rsa

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。

一次一密 onetimepad

一次一密(OPT)加密法:是牢不可破的加密法,这个加密法不便于日常使用,通常只用于高度机密消息。
1.密钥和要加密的消息同样长
2.密钥由真正随机符号组成
3.密钥只用一次,永不对其他消息复用
一次一密加密法的密钥叫做密码本.

为什么牢不可破
1.如果密钥和消息一样长,那么每个可能的密文字母都有相同的概率解密成相同的明文字母,这样就无法使用频率分析来工作。
2.暴力破译的话,要尝试26^(消息字母数目),对于计算机来说太多了。
3.相同密文可以来自两个非常不同的明文消息。任何明文都有同等的可能性用来创建密文,所以完全不可能破译通过一次一密加密法加密的消息

ECC

全称:椭圆曲线加密(Elliptic Curve Cryptography),ECC加密算法是一种公钥加密技术,以椭圆曲线理论为基础。利用有限域上椭圆曲线的点构成的Abel群离散对数难解性,实现加密、解密和数字签名。将椭圆曲线中的加法运算与离散对数中的模乘运算相对应,就可以建立基于椭圆曲线的对应密码体制。

SM2

SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve Cryptosystem)算法的一种,基于椭圆曲线离散对数问题,计算复杂度是指数级,求解难度较大,同等安全程度要求下,椭圆曲线密码较其他公钥算法所需密钥长度小很多。

SM2公钥加密适用于加密长度较短的数据,如会话密钥和消息报文。SM2公钥加密不仅对数据加密,还提供防篡改的特性,即被篡改的或伪造的密文可以在解密的过程中被检查发现,因此通过SM2公钥加密的消息无需格外的校验机制。消息经过SM2公钥加密后长度会增加不到100字节的长度,加密方在准备缓冲区时需要加以留意。

.gmssl库

GmSSL是一个开源的加密包的python实现,支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证,开源且可以用于闭源的商业应用。

SM4

国密SM4(无线局域网SMS4)算法, 一个分组算法, 分组长度为128bit, 密钥长度为128bit, 算法具体内容参照SM4算法。

gmssl是包含国密SM4算法的Python实现, 提供了 encrypt_ecb、 decrypt_ecb、 encrypt_cbc、 decrypt_cbc等函数用于加密解密

SM3

SM3是国密密码杂凑算法标准,由国家密码管理局于2010年12月公布。SM3的输出杂凑值长度为256比特(32字节),与国际标准SHA-256等长。SM3设计安全性为128比特,安全性与256比特椭圆曲线/SM2、SM4/SMS4、AES-128等同。

Paillier

import gmpy2 as gy
import libnum

libnum库是一个关于各种数学运算的函数库,结合gmpy2库、PyCrypto库一起来使用会使计算变得非常简便。

CKKS

tenseal库

TenSEAL是一个具有Python接口的C++库

你可能感兴趣的:(密码,python,开发语言,哈希算法)