PyCrypto AES-256 による暗号化と復号化
メッセージとキーを操作する PyCrypto を使用した効率的な暗号化および復号化関数を構築するには、特定の考慮事項を考慮する必要があります。
キーの配置とエントロピー:
提供されたキーが期待どおりの長さであることを確認することが重要です。 PyCrypto では、長さが 32 バイトの強力なキーを使用することを推奨しています。これを実現するには、SHA-256 でキーをハッシュし、結果のダイジェストを暗号化キーとして使用します。
暗号化モード:
AES 暗号化の場合、Cipher Block Chaining ( CBC) モードが一般的に使用されます。暗号文の連続ブロックを初期化ベクトル (IV) と組み合わせることで、セキュリティが強化されます。
初期化ベクトル (IV):
IV は、次のようなランダムな値です。暗号化中に暗号文の先頭に追加されます。これにより、暗号化された各メッセージの一意性が保証され、攻撃者が暗号文内のパターンを利用するのを防ぎます。暗号化と復号化に異なる IV を指定できますが、暗号化操作ごとに一意の IV を使用することが重要です。
実装:
以下のサンプル実装には、次の考慮事項が組み込まれています。 :
import base64 import hashlib from Crypto import Random from Crypto.Cipher import AES class AESCipher(object): def __init__(self, key): self.bs = AES.block_size self.key = hashlib.sha256(key.encode()).digest() def encrypt(self, raw): raw = self._pad(raw) iv = Random.new().read(AES.block_size) cipher = AES.new(self.key, AES.MODE_CBC, iv) return base64.b64encode(iv + cipher.encrypt(raw.encode())) def decrypt(self, enc): enc = base64.b64decode(enc) iv = enc[:AES.block_size] cipher = AES.new(self.key, AES.MODE_CBC, iv) return AESCipher._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8') def _pad(self, s): return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs) @staticmethod def _unpad(s): return s[:-ord(s[len(s)-1:])]
この実装では、キーが 32 バイトに安全にハッシュされ、暗号化に CBC モードが使用され、暗号化中にランダムな IV が生成されます。復号化関数は、暗号文から IV を復元し、それを使用して暗号化プロセスを元に戻します。
以上がPython で安全な AES-256 暗号化と復号化を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。