この記事の内容は、暗号アルゴリズム ライブラリとは何ですか?暗号アルゴリズムライブラリの詳細な説明は一定の参考価値がありますので、必要な友人は参照してください。
暗号アルゴリズム ライブラリは、もともと Python では pycrypto と呼ばれていました。作者は少し怠け者で、数年間更新していませんでした。その後、偉い人が代替ライブラリを作成しましたパイクリプトドーム。このライブラリは現在 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 ライブラリにあります。
実用的なガジェットは次のとおりです。 Next
デジタル署名は Crypto.Signature ライブラリの下にあります
注: 文字列の点では、python3 と python2 には明らかな違いがあります。 - python3 文字列 b'byte' にはバイトがありますが、python2 にはバイト
がありません。このライブラリは python3 の下にあるため、暗号化と復号化にはバイトが使用されます。
このライブラリを使用して暗号化および復号化するのは非常に簡単です。次の 4 つの手順を覚えておいてください:
必要なライブラリをインポートします
from Crypto.Cipher import AES
キーの初期化
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'))
注: キーとプレーンテキストは、指定された桁数まで入力する必要があります。ljust または zfill を使用して入力することも、次のように使用することもできますPad(in Util) 関数を埋めてください!
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 は、主に 公開キー ファイル/秘密キー ファイルを生成するために使用されます。 ##Read
公開キー ファイル/秘密キー ファイル公開キー/秘密キー ファイルの生成:
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: 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)
注: RSAには 2 つの充填メソッドがあり、1 つは PKCS1_v1_5、もう 1 つは PKCS1_OAEP
ハッシュ アルゴリズム
具体的な例:
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' 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."
ランダムnumber
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的随机整数
その他の関数
関数は、キーを埋めるためによく使用されます 以上が暗号アルゴリズムライブラリとは何ですか?暗号アルゴリズムライブラリの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。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)) # 判断是不是素数