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.
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
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 !
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'))
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
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())
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."
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的随机整数
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!