Maison  >  Article  >  développement back-end  >  Qu'est-ce que la bibliothèque d'algorithmes Crypto ? Explication détaillée de la bibliothèque d'algorithmes Crypto

Qu'est-ce que la bibliothèque d'algorithmes Crypto ? Explication détaillée de la bibliothèque d'algorithmes Crypto

不言
不言avant
2018-11-15 13:40:4312497parcourir

Le contenu de cet article porte sur ce qu'est la bibliothèque d'algorithmes Crypto ? L'explication détaillée de la bibliothèque d'algorithmes Crypto a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'elle vous sera utile.

Installation et utilisation

La bibliothèque d'algorithmes Crypto s'appelait à l'origine pycrypto en python. L'auteur était un peu paresseux et ne l'a pas mise à jour pendant plusieurs années. Plus tard, un grand gars a écrit une bibliothèque alternative. pycryptodome. Cette bibliothèque ne prend actuellement en charge que python3, et l'installation est très simple, il suffit de pip install pycryptodome ! Pour une utilisation détaillée, veuillez consulter la documentation officielle

Les mots de passe symétriques courants se trouvent sous la bibliothèque Crypto.Cipher, comprenant principalement : DES 3DES AES RC4 Salsa20
Les mots de passe asymétriques se trouvent sous la bibliothèque Crypto.PublicKey, comprenant principalement : RSA ECC DSA
Les mots de passe de hachage se trouvent dans la bibliothèque Crypto.Hash. Ceux couramment utilisés sont : MD5 SHA-1 SHA-128 SHA-256
Les nombres aléatoires se trouvent dans la bibliothèque Crypto.Random
Les gadgets utilitaires sont. sous la bibliothèque Crypto.Util. Suivant
La signature numérique se trouve sous la bibliothèque Crypto.Signature

Chiffrement symétrique AES

Remarque : il existe une différence évidente entre python3 et python2 en termes de chaînes. - python3 中有字节串 b'byte',python2 中没有字节. Puisque cette bibliothèque est sous python3, le chiffrement et le déchiffrement utilisent des octets !

Utiliser cette bibliothèque pour chiffrer et déchiffrer est très simple, rappelez-vous ces quatre étapes :

  • Importez la bibliothèque requise

from Crypto.Cipher import AES
  • Initialiser la clé

key = b'this_is_a_key'
  • Instancier l'objet de chiffrement et de déchiffrement

aes = AES.new(key,AES.MODE_ECB)
  • Utiliser le chiffrement et le déchiffrement d'instance

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'))

Remarque : La clé et le texte en clair doivent être remplis selon le nombre de chiffres spécifié. Vous pouvez le faire. utilisez ljust ou zfill Vous pouvez également utiliser la fonction pad() dans Util pour remplir !

Chiffrement symétrique 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'))

Chiffre asymétrique RSA

Le RSA de cette bibliothèque est principalement utilisé pour les 生成fichiers de clé publique/fichiers de clé privée ou 读取 Fichier de clé publique/fichier de clé privée
Générer un fichier de clé publique/privée :

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-----

Lire le chiffrement et le déchiffrement du fichier de clé publique/privée :

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:
        data = f.read()
        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:
        data = f.read()
        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)

Remarque : RSA en a deux Il existe deux méthodes de remplissage, l'une est PKCS1_v1_5, l'autre est PKCS1_OAEP

L'algorithme de hachage

est similaire à l'utilisation de la bibliothèque hashlib. Instanciez d'abord un certain algorithme de hachage, puis appelez-le avec mise à jour. () C'est ça!

Exemples spécifiques :

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())

Signature numérique

L'expéditeur signe avec une clé privée et le vérificateur utilise la clé publique pour vérifier

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

# 签名
message = 'To be signed'
key = RSA.import_key(open('private_key.der').read())
h = SHA256.new(message)
signature = pkcs1_15.new(key).sign(h)

# 验证
key = RSA.import_key(open('public_key.der').read())
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."

Nombre aléatoire

Similaire à la bibliothèque aléatoire. La première fonction est très couramment utilisée

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的随机整数

D'autres fonctions

sont couramment utilisées dans la fonction pad() dans Util pour remplir la clé

from Crypto.Util.number import *
from Crypto.Util.Padding import *

# 按照规定的几种类型 pad,自定义 pad可以用 ljust()或者 zfill()
str1 = b'helloworld'
pad_str1 = pad(str1,16,'pkcs7') # 填充类型默认为'pkcs7',还有'iso7816'和'x923'
print(unpad(pad_str1,16))
# 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)) # 判断是不是素数


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer