ホームページ  >  記事  >  バックエンド開発  >  暗号アルゴリズムライブラリとは何ですか?暗号アルゴリズムライブラリの詳細説明

暗号アルゴリズムライブラリとは何ですか?暗号アルゴリズムライブラリの詳細説明

不言
不言転載
2018-11-15 13:40:4312499ブラウズ

この記事の内容は、暗号アルゴリズム ライブラリとは何ですか?暗号アルゴリズムライブラリの詳細な説明は一定の参考価値がありますので、必要な友人は参照してください。

インストールと使用

暗号アルゴリズム ライブラリは、もともと 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 ライブラリの下にあります

対称パスワード AES

注: 文字列の点では、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) 関数を埋めてください!

対称パスワード 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

このライブラリの 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

ハッシュ アルゴリズム

は hashlib ライブラリに似ています。最初にハッシュ アルゴリズムをインスタンス化し、次に 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'
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的随机整数

その他の関数

Util の

pad()

関数は、キーを埋めるためによく使用されます<pre class="brush:php;toolbar:false">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)) # 判断是不是素数</pre>

以上が暗号アルゴリズムライブラリとは何ですか?暗号アルゴリズムライブラリの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。