一般的な暗号化アルゴリズムのPython実装

序文

この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としており、商用目的ではありません。ご不明な点がございましたら、処理についてお問い合わせください。

PS:Pythonの学習教材が必要な場合は、以下のリンクをクリックして自分で入手できます

Pythonの無料の学習資料、コード、交換回答クリックして参加


高度に発達した情報化の時代に生きる中で、情報セキュリティや機密性に対する人々の意識も絶えず高まっています。ネットワークデータ送信の過程で、データセキュリティを確保するために機密データを暗号化する必要があることがよくあります。

この記事では、主にBase64、MD5、SHA-1、HMAC、DES / AES、RSA、これらの暗号化アルゴリズム、およびpython実装コードの例を紹介します。一般的に使用される暗号化メソッドには、基本的に対応するPythonライブラリがあり、使用する特定のメソッドを呼び出すだけで済みます。

Base64暗号化

最も単純な暗号化方式であり、キーがない場合、暗号文が取得されている限り、直接復号化できます。通常、単独で使用することはなく、外部パッケージのレイヤーとして他の暗号化方式と組み合わせることができます。

Python免费学习资料、代码以及交流解答:1136201545



import base64

# 要加密的字符串
str_encrypt = 'hello!'
# 加密方法
# 转化为byte类型
base64_encrypt = base64.b64encode(str_encrypt.encode())
# 将字节串转为字符串
base64_encrypt_str = base64_encrypt.decode()

print("BASE64加密串:", base64_encrypt_str, type(base64_encrypt_str))

#解密方法
# 字符串转为字节串
base64_decrypt = base64_encrypt_str.encode()
# 得到加密的字符串
str_decrypt = base64.b64decode(base64_decrypt).decode()
print("BASE64解密串:", str_decrypt, type(str_decrypt))

BASE64暗号化文字列:aGVsbG / vvIE = <class'str '>
BASE64復号化文字列:こんにちは!<クラス 'str'>

MD5暗号化

高度なセキュリティを備えたMD5メッセージダイジェストアルゴリズム(MD5メッセージダイジェストアルゴリズム)は、128ビット(16バイト)のハッシュ値(ハッシュ値)を生成できます。これは、任意の文字列に対応し、セグメントに暗号化できます。長さコードは、完全で一貫性のある情報送信を保証するために使用されます。現在のMD5暗号化アルゴリズムは元に戻せません。もちろん、この方法で暗号化された暗号文は復号化する必要はなく、必要に応じて元の暗号文を直接送信するだけです。

Pythonコード:

import hashlib

str_encrypt = "hello!"
# 对要加密的字符串进行加密
hash = hashlib.md5(str_encrypt.encode())
hash.update(str_encrypt.encode("utf8"))
value = hash.digest()
# 二进制
print("二进制的字符串", repr(value))

# 十六进制
print("十六进制的字符串", hash.hexdigest())

バイナリ文字列:b '%\ xe2 \ n \ x04 \ x86 \ xa7 \ xf4 \ xc5Y @ \ xfa \ xc7 \ xd6 \ xdc \ t_'
16進文字列:25e20a0486a7f4c55940fac7d6dc095f

SHA1暗号化

セキュアハッシュアルゴリズムは、主にデジタル署名標準DSSで定義されているデジタル署名アルゴリズムDSAに適用できます。SHA1はMD5に基づいており、SHA1はMD5よりも安全です。長さが2 ^ 64ビット未満のメッセージの場合、SHA1は160ビットのメッセージダイジェストを生成します。

デジタル署名はハッシュアルゴリズムで実現できます。デジタル署名の原理は、関数演算(ハッシュ)で送信する平文をメッセージダイジェストに変換することです。メッセージダイジェストは暗号化され、平文と一緒に受信者に送信されます。受信者はそれを受け入れます。プレーンテキストによって生成された新しいメッセージダイジェストは復号化され、送信者のメッセージダイジェストと比較されます。一貫性がない場合は、プレーンテキストが改ざんされています。

Pythonコード:

import hashlib

str_encrypt = "hello!"

# 对要加密的字符串进行加密
hash = hashlib.sha1(str_encrypt.encode())
hash.update(str_encrypt.encode("utf8"))
value = hash.hexdigest()

# 十六进制
print("十六进制的字符串",value)

16進文字列b8b92f40e0c5df69dcf5cdc1e327e1f87188aeb9

HMAC暗号化

ハッシュメッセージ認証コード(ハッシュメッセージ認証コード)、HMAC暗号化アルゴリズムは、暗号化されたハッシュ関数と共有キーに基づく安全なメッセージ認証プロトコルです。

実現の原則は、パブリック関数とキーを使用して認証識別子として固定長の値を生成し、この識別子を使用してメッセージの整合性を認証することです。

Pythonコード:

import hmac
import hashlib

str_encrypt = "hello!"
key="abc"
# 第一个参数是密钥key,第二个参数是待加密的字符串,第三个参数是hash函数

mac = hmac.new(key.encode(encoding="utf-8"),str_encrypt.encode("utf8"),hashlib.md5)

value=mac.hexdigest()  # 加密后字符串的十六进制格式

# 十六进制
print("十六进制的字符串",value)

16進文字列221479c27474cdf1ee245ffef26cfeee

DES暗号化

データ暗号化標準(データ暗号化標準)は、対称暗号化アルゴリズムです。これは、キーを使用して暗号化するブロックアルゴリズムです。3つのインターフェイスパラメータがあります:キー、データ、モード、キーは作業キーです。データは8バイトと64ビットで、暗号化または復号化されるデータです。モード作業モード:暗号化または復号化。

Pythonコード:

import binascii
from pyDes import des, CBC, PAD_PKCS5
# 需要安装 pip install pyDes

#加密过程
def des_encrypt(secret_key,s):
    iv = secret_key
    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    en = k.encrypt(s, padmode=PAD_PKCS5)
    return binascii.b2a_hex(en)

#解密过程
def des_decrypt(secret_key, s):
    iv = secret_key
    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
    de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
    return de

secret_str = des_encrypt('12345678', 'hello!')
print(secret_str)

clear_str = des_decrypt('12345678', secret_str)
print(clear_str)

b'7c48af7e37ecd280 '

b「こんにちは!」

AES暗号化

Rijndael暗号化方式とも呼ばれるAdvancedEncryption Standard(Advanced Encryption Standard)は、米国連邦政府によって採用されたブロック暗号化標準です。暗号化速度とキーのバイト数には特定の要件があります。AESキーの長さの最小サポートは128、192、256であり、暗号化ブロックのパケット長は128ビットです。あなたはそれを解読するために鍵を知る必要があります。
コマンドpip3install pycryptodomeを使用して、pycryptodomeをインストールします。

ブロック暗号暗号化の4つのモードは、ECB、CBC、CFB、OFBです。最も一般的なものはECBとCBCです。
1. ECBモード
平文をグループ化し、平文の各グループは暗号化アルゴリズムとキービット演算によって暗号文を取得し、計算された暗号文を順番に接続します。各データは相互に影響を与えません。
2. CBCモード(最も使用されるモード)
CBCモードには、初期化ベクトルiv(キーの長さに等しい文字列が必要です。これは通常、キージェネレーターを介して取得されます。
暗号化の手順は次のとおりです
。1)最初にデータをグループ化してD1D2 ... Dnを取得します。2
)最初のデータグループD1と初期化ベクトルivビット操作結果を暗号化して、暗号文C1の最初のグループを取得します
。3)2番目のグループデータのグループD2と暗号化結果の最初のグループC1ビット操作は暗号化されて暗号文C2の2番目のセットを取得
します4)そして4)の後のデータ
Cnを取得するために類推によって推定されます5)C1C2C3に接続されます... Cnは暗号化の結果です。
特徴:
1。積極的に攻撃することは容易ではなく、そのセキュリティはECBよりも優れており、長いメッセージの送信に適しています。これはSSLおよびIPSecの標準です。各暗号文ブロックはすべての情報ブロックに依存し、平文メッセージの変更はすべての暗号文ブロックに影響します
2.送信者と受信者は初期化ベクトルを知る必要があります
3.暗号化プロセスはシリアルであり、並列化できません(復号化時に1つの平文ブロックは、2つの隣接する暗号文ブロックから取得できます。したがって、復号化プロセスを並列化できます。)
4。初期化ベクトルは復号化中に同じである必要があります

Pythonコード:

ECB暗号化モード

import base64
from Crypto.Cipher import AES

#ECB加密模式

import base64
from Crypto.Cipher import AES


#使用补0方法

# # 需要补位,补足为16的倍数
def add_to_16(s):
    while len(s) % 16 != 0:
        s += '\0'
    return str.encode(s)  # 返回bytes

# 密钥长度必须为16、24或32位,分别对应AES-128、AES-192和AES-256
key = 'abc4567890abc458'
# 待加密文本
text = 'hello'
# 初始化加密器
aes = AES.new(add_to_16(key), AES.MODE_ECB)
# 加密
encrypted_text = str(base64.encodebytes(aes.encrypt(add_to_16(text))), encoding='utf8').replace('\n', '')
# 解密
decrypted_text = str(
    aes.decrypt(base64.decodebytes(bytes(encrypted_text, encoding='utf8'))).rstrip(b'\0').decode("utf8"))

print('加密值:', encrypted_text)
print('解密值:', decrypted_text)

暗号化された値:p3i7p25Ypel2X2yrFG4rCQ ==復号化された値:
hello

CBC暗号化モード(1)

#CBC加密模式
import base64
from Crypto.Cipher import AES
from urllib import parse

AES_SECRET_KEY = 'helloBrook2abcde'  # 此处16|24|32个字符
IV = 'helloBrook2abcde' 


# padding算法

BS = len(AES_SECRET_KEY)

# 填充方案
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

# 解密时删除填充的值

unpad = lambda s: s[0:-ord(s[-1:])]

def cryptoEn(string, key, iv):

# param string: 原始数据
# param key: 密钥
# param iv: 向

    mode = AES.MODE_CBC

    cipher = AES.new(key.encode("utf8"),mode,iv.encode("utf8"))

    encrypted = cipher.encrypt(bytes(pad(string), encoding="utf8"))

    return base64.b64encode(encrypted).decode("utf-8")


#CBC模式的解密代码

def cryptoDe(destring, key, iv):

# param destring: 需要解密的数据
# param key: 密钥
# param iv: 向量

    mode = AES.MODE_CBC
    
    decode = base64.b64decode(destring)

    cipher = AES.new(key.encode("utf8"),mode,iv.encode("utf8"))

    decrypted = cipher.decrypt(decode)

    return unpad(decrypted).decode("utf-8")


secret_str = cryptoEn('hello', AES_SECRET_KEY,IV)
print(secret_str)

clear_str = cryptoDe(secret_str.encode("utf8"), AES_SECRET_KEY,IV)
print(clear_str)

sqlpZ0AdaRAOQRabchzltQ ==
こんにちは

CBC暗号化モード(2)

import base64
from Crypto.Cipher import AES
from urllib import parse

AES_SECRET_KEY = 'helloBrook2abcde'  # 此处16|24|32个字符
IV = 'helloBrook2abcde' 

# padding算法
BS = len(AES_SECRET_KEY)
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s: s[0:-ord(s[-1:])]


class AES_ENCRYPT(object):
    def __init__(self):
        self.key = AES_SECRET_KEY
        self.mode = AES.MODE_CBC

    # 加密函数
    def encrypt(self, text):
        cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
        self.ciphertext = cryptor.encrypt(bytes(pad(text), encoding="utf8"))
        # AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题,使用base64编码
        return base64.b64encode(self.ciphertext).decode("utf-8")

    # 解密函数
    def decrypt(self, text):
        decode = base64.b64decode(text)
        cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
        plain_text = cryptor.decrypt(decode)
        return unpad(plain_text).decode("utf-8")


if __name__ == '__main__':
    aes_encrypt = AES_ENCRYPT()
    text = "Python"
    e = aes_encrypt.encrypt(text)
    d = aes_encrypt.decrypt(e)
    print(text)
    print(e)
    print(d)

暗号化する文字列:Python
暗号化値:X09JC6IqnsDFp9b9C57cUA ==
復号化値:Python

文字列に中国語が含まれている場合は、最初にテキストをASCIIコードに変換すると、中国語の暗号化がサポートされます

text = base64.b64encode(text.encode('utf-8')).decode('ascii')

RSA暗号化

Rivest-Shamir-Adleman、RSA暗号化アルゴリズムは非対称暗号化アルゴリズムです。公開鍵暗号化、秘密鍵復号化、RSAは、公開鍵暗号化と電子商取引で広く使用されています。現時点で最も重要な暗号化アルゴリズム!

おすすめ

転載: blog.csdn.net/pythonxuexi123/article/details/114668524