python3は、AES暗号化、復号化、およびエラー処理を実装します

目次

データ1:実際の測定は実行可能ですが、わずかに異なります

暗号化されたテキストの長さを16桁で埋める必要があるのはなぜですか? 

データ2:参照を展開


 

データ1:実際の測定は実行可能ですが、わずかに異なります

 

序文

以前にaes暗号化の記事を書いたのですが、当時は書き方が成熟していませんでしたが、別のブロガーのブログを参考にすると、いきなり気づきました。ここにアドレスを添付してください:http
//blog.csdn.net/hh775313602/article/details/78991340

コーディング

#AES-demo

import base64
from Crypto.Cipher import AES

'''
采用AES对称加密算法
'''
# str不是16的倍数那就补足为16的倍数
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
#加密方法
def encrypt_oracle():
    # 秘钥
    key = '123456'
    # 待加密文本
    text = 'abc123def456'
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #先进行aes加密
    encrypt_aes = aes.encrypt(add_to_16(text))
    #用base64转成字符串形式
    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 执行加密并转码返回bytes
    print(encrypted_text)
#解密方法
def decrypt_oralce():
    # 秘钥
    key = '123456'
    # 密文
    text = 'qR/TQk4INsWeXdMSbCDDdA=='
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #优先逆向解密base64成bytes
    base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
    #执行解密密并转码返回str
    decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') 
    print(decrypted_text)

if __name__ == '__main__':
   # encrypt_oracle()
    decrypt_oralce()

総括する

一般的な考え方は変わっていません、

pyCryptodomeモジュールのaesを使用して、最初に秘密鍵を設定します。

そして、暗号化されるテキストは16ビットで埋められます、

次に、aesによって生成されたバイトコードをbase64ビットでエンコードします。

文字列形式に変換できます。

 

復号化の考え方は逆にすることができます。

最初にbase64をバイトに逆復号化し、復号化暗号化とトランスコードを実行してstrを返し、余分な数字の「\ 0」を空に置き換えます

 


[エラー1]:暗号化されたテキストを16桁の長さで埋める必要があり、エラーを引き起こすには桁数が不十分なのはなぜですか? 

 

[エラーメッセージ]:ECBモードの                   pythonでデータをブロック境界に揃える必要がありますaes ECBモードの暗号化と復号化にCryptoを使用すると、復号化エラーが発生します。

【原因】:暗号化されたデータは補足されておらず、データ長は16の整数倍である必要があります。

[解決策]:元のデータを入力します:

# str不是16的倍数那就补足为16的倍数
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
python aes加解密 ecb模式 加密 
报错ValueError: Data must be aligned to block boundary in ECB mode


from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
BLOCK_SIZE = 32 # Bytes
 
key = 'abcdefghijklmnop'
cipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg = cipher.encrypt(pad(b'hello', BLOCK_SIZE))
print(msg.hex())
decipher = AES.new(key.encode('utf8'), AES.MODE_ECB)
msg_dec = decipher.decrypt(msg)
print(unpad(msg_dec, BLOCK_SIZE))

需要用block_size 补充位数
此处是模拟php openssl_encrypt($data, "AES-128-ECB", $key, OPENSSL_RAW_DATA)

[エラー2]:[エラー情報]:TypeError:オブジェクトタイプ<class'str '>をCコードに渡すことができません           

     

[理由]:エンクリプターに入力されるデータはバイト配列である必要があります

[解決策]:base64トランスコーディング


データ2:参照を展開

 

インターネット上で横行するクローラーと横行するクローラーにより、独自のデータの収集を最大限に制限するために、主要なWebサイトは次のようなさまざまなクロール防止方法を追加しました。

ブラウザのUA指紋認識を生成し、
さまざまな検証方法(テキストメッセージ、スライダー、漢字をクリック、クリック)を使用して識別します
。...
このタイプの登山防止手段は、城の門に似た防御層です。この防衛線を突破する限り、あなたはあなたがやりたいことを何でもすることができます。

さらに、第2層の防御を実行し、難読化や暗号化などのさまざまな制限手段をデータに追加するWebサイトがいくつかあります。城門に入った後、XXの都心部に入るには、門の役員と兵士のバッジと検証を通過する必要があるようなものです。

たとえば、eコマースWebサイトでは、データにAES暗号化が使用されており、返されるデータを次の図に示します。

復号化後、次の図に示すように実際のデータを取得できます。

これは、Python for AES復号化を使用して実現されます。次に、PythonでのデータのAES暗号化とAES復号化を紹介します。

記事のディレクトリ

1. AESアルゴリズムの概要
次のコンテンツはインターネットからのものです。それを見ることができます。詳細を知りたい場合は、学ぶための特別な資料を見つけることができます。

AESのフルネームはAdvancedEncryption Standardで、これはAdvanced EncryptionStandardの頭字語です。

Advanced Encryption Standard Rijndael暗号化方式としても知られるAES暗号化標準は、米国国立標準技術研究所(NIST)がDESに取って代わることを目的とした21世紀の暗号化標準です。AESの基本的な要件は、対称ブロック暗号システムを採用することです。キーの長さは128、192、または256ビットで、ブロックの長さは128ビットです。アルゴリズムはさまざまなハードウェアおよびソフトウェアに簡単に実装できる必要があります。1998年、NISTはAES分析、テスト、および要請の最初のラウンドを開始し、合計15の候補アルゴリズムが作成されました。[1]

AES2の分析とテストの第2ラウンドは、1999年3月に完了しました。2000年10月2日、米国政府は、ベルギーの暗号学者JoanDaemenとVincentRijmenによって提案された暗号化アルゴリズムであるRijndaelをAES暗号化アルゴリズムとして選択したことを正式に発表しました。

AESで暗号化されたデータブロックとキーの長さは、128b、192b、および256bのいずれかになります。AES暗号化には、多くの繰り返しと変換があります。一般的な手順は次のとおりです。①キー拡張;②InitialRound;③繰り返しラウンド(Rounds)、繰り返される各ラウンドには、サブバイト(SubBytes)、行シフト(ShiftRows)、列ミックス(MixColurmns)、ラウンドキー追加操作(AddRoundKey)などの操作が含まれます。 ①最終ラウンド(最終ラウンド)、最終ラウンドでの列混合操作(MixColumns)はありません。

2. AES暗号化
ここでは、AES暗号化アルゴリズムでCBCモードを選択して説明します。

前述のように、AES暗号化アルゴリズムのCBCモードは、キーとオフセットを使用してデータを暗号化するため、最初に、元のデータ、キー、オフセット、AES CBCモードなど、いくつかの公開パラメーターを定義します。コードは次のとおりです。

a = '' '(' name ':' Mr. State '、' url ':' zmister.com '、' desc ':'プログラミングアプリケーションの戦闘 ')' ''#生データ
k = 'zmistercomzmiste'.encode( 'utf-8')#​​キー
iv = b'1234567890asdfgh '#オフセット
モード= AES.MODE_CBC#モード
とPython学習qqスカート:10667510基本的な学習教材チュートリアルの無料フルセット、交換ベースキャンプを学習するプログラマー
はここにあります。キーの長さは16ビットの文字列(128ビットバイト)です。AES暗号化アルゴリズムでは、キーの長さは16ビットの文字列(128バイト)、34ビットの文字列(192バイト)、32ビットである必要があります。文字列(256バイト)。

次に、元のデータを暗号化する関数を作成します。

#暗号化されたデータ
def cryp_str(value):
    value = value.encode( 'utf-8')#​​utf-8でデータをエンコードします
    cryptor = AES.new(k、mode、iv)#新しいAESインスタンスの
    長さ= 16
    カウントを作成します= len(value)
    #データ長がキー長より短い
    場合count <length:
        add =(length-count)
        #\ 0 backspace
        text = value +( '\ 0' * add).encode( 'utf- 8 ')
    elif count> length:
        add =(length-
        (count%length))text = value +(' \ 0 '* add).encode(' utf-8 ')
    ciphertext = cryptor.encrypt(text)#暗号化character String
    print( "元の暗号化データ:"、ciphertext)
    ciphertext_hex = b2a_hex(ciphertext)#文字列から16進数のデータ
    print( "16進暗号化:"、ciphertext_hex)
次の図に示すように、     ciphertext_hex_de = ciphertext_hex.decode()
    print( "16進暗号化文字列:"、ciphertext_hex_de)
    return ciphertext_hex_de
元のデータを渡して実行すると、暗号化されたデータを取得できます。

Pythonを使用してデータのAES暗号化を完了した後、引き続きPythonを使用してAES暗号化データを復号化します。

3. AES復号化AES暗号化
と比較して、AES復号化ははるかに簡単です。最初にAESクラスをインスタンス化し、次に暗号化された16進データを文字列形式に変換し、次にAESインスタンスのdecrypt()メソッドを呼び出してデータを復号化し、最後に復号化されたデータをデコードします。元のデータ、コードを取得できます。以下のとおりであります:

#データの復号化
def decry_str(value):
    cryptor = AES.new(k、mode、iv)
    #AESインスタンスの作成value_hex = a2b_hex(value)#16進データを文字列に変換
    plain_text = cryptor.decrypt(value_hex)#復号化string
    print( "decrypted data:"、plain_text)
    print( 'データのデコードと復号化:'、bytes.decode(plain_text).rstrip( '\ 0'))
    return bytes.decode(plain_text).rstrip( '\ 0' )
次の図に示すように、以前にAESで暗号化されたデータをパラメーターとして渡して実行し、最後に復号化された元のデータを取得します。

このようにして、Pythonを使用したデータのAES暗号化と復号化が完了しました。

4.最後に
、実際のWebサイトでは、データが1つの暗号化方法で暗号化されるだけでなく、複数の暗号化方法を使用してさらに暗号化されたデータが難読化および暗号化される可能性があります。このような状況に直面した場合、最初にデータ暗号化プロセスを見つけて、盲目的に試してはいけません。
 

おすすめ

転載: blog.csdn.net/zzddada/article/details/115208255