# Crypto算法库详解

### 安装与使用

Crypto 算法库在 python 中最初叫 pycrypto，这个作者有点懒，好几年没有更新，后来就有大佬写了个替代库 pycryptodome。这个库目前只支持 python3，安装也很简单`pip install pycryptodome`就行了！详细的用法可以看看 官方文档

### 对称密码AES

• 导入所需库

`from Crypto.Cipher import AES`

• 初始化 key

`key = b'this_is_a_key'`

• 实例化加解密对象

`aes = AES.new(key,AES.MODE_ECB)`

• 使用实例加解密

`text_enc = aes.encrypt(b'helloworld')`

```from Crypto.Cipher import AES
import base64

key = bytes('this_is_a_key'.ljust(16,' '),encoding='utf8')
aes = AES.new(key,AES.MODE_ECB)

# encrypt
plain_text = bytes('this_is_a_plain'.ljust(16,' '),encoding='utf8')
text_enc = aes.encrypt(plain_text)
text_enc_b64 = base64.b64encode(text_enc)
print(text_enc_b64.decode(encoding='utf8'))

# decrypt
msg_enc = base64.b64decode(text_enc_b64)
msg = aes.decrypt(msg_enc)
print(msg.decode(encoding='utf8'))```

### 对称密码DES

```from Crypto.Cipher import DES
import base64

key = bytes('test_key'.ljust(8,' '),encoding='utf8')
des = DES.new(key,DES.MODE_ECB)

# encrypt
plain_text = bytes('this_is_a_plain'.ljust(16,' '),encoding='utf8')
text_enc = des.encrypt(plain_text)
text_enc_b64 = base64.b64encode(text_enc)
print(text_enc_b64.decode(encoding='utf8'))

# decrypt
msg_enc = base64.b64decode(text_enc_b64)
msg = des.decrypt(msg_enc)
print(msg.decode(encoding='utf8'))```

### 非对称密码RSA

```from Crypto.PublicKey import RSA

rsa = RSA.generate(2048) # 返回的是密钥对象

public_pem = rsa.publickey().exportKey('PEM') # 生成公钥字节流
private_pem = rsa.exportKey('PEM') # 生成私钥字节流

f = open('public.pem','wb')
f.write(public_pem) # 将字节流写入文件
f.close()
f = open('private.pem','wb')
f.write(private_pem) # 将字节流写入文件
f.close()
#
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArreg3IX19DbszqSdBKhR
9cm495XAk9PBQJwHiwjKv6S1Tk5h7xL9/fPZIITy1M1k8LwuoSJPac/zcK6rYgMb
DT9tmVLbi6CdWNl5agvUE2WgsB/eifEcfnZ9KiT9xTrpmj5BJql9H+znseA1AzlP
iTukrH1frD3SzZIVnq/pBly3QbsT13UdUhbmIgeqTo8wL9V0Sj+sMFOIZY+xHscK
IeDOv4/JIxw0q2TMTsE3HRgAX9CXvk6u9zJCH3EEzl0w9EQr8TT7ql3GJg2hJ9SD
biebjImLuUii7Nv20qLOpIJ8qR6O531kmQ1gykiSfqj6AHqxkufxTHklCsHj9B8F
8QIDAQAB
-----END PUBLIC KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEArreg3IX19DbszqSdBKhR9cm495XAk9PBQJwHiwjKv6S1Tk5h
7xL9/fPZIITy1M1k8LwuoSJPac/zcK6rYgMbDT9tmVLbi6CdWNl5agvUE2WgsB/e
ifEcfnZ9KiT9xTrpmj5BJql9H+znseA1AzlPiTukrH1frD3SzZIVnq/pBly3QbsT
13UdUhbmIgeqTo8wL9V0Sj+sMFOIZY+xHscKIeDOv4/JIxw0q2TMTsE3HRgAX9CX
vk6u9zJCH3EEzl0w9EQr8TT7ql3GJg2hJ9SDbiebjImLuUii7Nv20qLOpIJ8qR6O
531kmQ1gykiSfqj6AHqxkufxTHklCsHj9B8F8QIDAQABAoI...
-----END RSA PRIVATE KEY-----```

```from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64

def rsa_encrypt(plain):
with open('public.pem','rb') as f:
key = RSA.importKey(data)
rsa = PKCS1_v1_5.new(key)
cipher = rsa.encrypt(plain)
return base64.b64encode(cipher)

def rsa_decrypt(cipher):
with open('private.pem','rb') as f:
key = RSA.importKey(data)
rsa = PKCS1_v1_5.new(key)
plain = rsa.decrypt(base64.b64decode(cipher),'ERROR') # 'ERROR'必需
return plain

if __name__ == '__main__':
plain_text = b'This_is_a_test_string!'
cipher = rsa_encrypt(plain_text)
print(cipher)
plain = rsa_decrypt(cipher)
print(plain)```

### Hash算法

`hashlib` 库的用法类似，先实例化某个 Hash 算法，再用 update() 调用就可以了！

```from Crypto.Hash import SHA1,MD5

sha1 = SHA1.new()
sha1.update(b'sha1_test')
print(sha1.digest()) # 返回字节串
print(sha1.hexdigest()) # 返回16进制字符串
md5 = MD5.new()
md5.update(b'md5_test')
print(md5.hexdigest())```

### 数字签名

```from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA

# 签名
message = 'To be signed'
h = SHA256.new(message)
signature = pkcs1_15.new(key).sign(h)

# 验证
h = SHA.new(message)
try:
pkcs1_15.new(key).verify(h, signature):
print "The signature is valid."
except (ValueError, TypeError):
print "The signature is not valid."```

### 随机数

`random` 库类似。第一个函数很常用

```import Crypto.Random
import Crypto.Random.random

print(Crypto.Random.get_random_bytes(4)) # 得到n字节的随机字节串
print(Crypto.Random.random.randrange(1,10,1)) # x到y之间的整数，可以给定step
print(Crypto.Random.random.randint(1,10)) # x到y之间的整数
print(Crypto.Random.random.getrandbits(16)) # 返回一个最大为N bit的随机整数```

### 其它功能

```from Crypto.Util.number import *

str1 = b'helloworld'
# number
print(GCD(11,143)) # 最大公约数
print(bytes_to_long(b'hello')) # 字节转整数
print(long_to_bytes(0x41424344)) # 整数转字节
print(getPrime(16)) # 返回一个最大为 N bit 的随机素数
print(getStrongPrime(512)) # 返回强素数
print(inverse(10,5)) # 求逆元
print(isPrime(1227)) # 判断是不是素数```

0 条评论

• ### python pickle 工作原理

http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pd...

• ### python 实现elk接口获取数据

[root@ctum2A0703016 ~]# cat jiaoyihao.py #!/usr/bin/python2.7

• ### 强化学习如何使用内在动机？

「内在动机」 (Intrinsic Motivation) 这一概念最初是在心理学中提出并发展起来的。由于其在制造开放式学习机器和机器人方面的潜力，这一概念正日...

• ### AS3 mvc应用

在程序开发中，为了降低程序的耦合度，我们经常会对程序进行模式化，这一节中，我们介绍MVC的设计模式，MVC由三层结构构成,分别是视图器(vi...

• ### 中国人工智能安防峰会

去年3月31日，雷锋网与AI掘金志在深圳主办了首届中国人工智能安防峰会。 大会上，多位享誉世界的院士、Fellow、安防企业首席智能技术高管，以及AI独角兽创...

• ### 团体程序设计天梯赛-练习集 L1-040 最佳情侣身高差

专家通过多组情侣研究数据发现，最佳的情侣身高差遵循着一个公式：（女方的身高）×1.09 =（男方的身高）。如果符合，你俩的身高差不管是牵手、拥抱、接吻，都是最和...