2

私はプログラミングの経験がなく、PyCrypto のドキュメントは初心者にはかなりまばらです。以下に書いたコードでファイルを暗号化し、インターネット経由で送信するとしましょう。私が懸念しているのは、コンピューター A と B の間のファイルのセキュリティです。コンピューター自体が安全であり、キーが安全に転送されると仮定しましょう。物事を正しく実装しましたか? 他に知っておくべきことはありますか?Python 2.7 と PyCrypto 2.6 の使用

ご回答ありがとうございます。

from Crypto.Cipher import AES
from Crypto import Random

def get_random(length):
    r = Random.new().read(length)
    return r

def aes_encrypt(key, file_in, file_out):
    data_source = open(file_in, 'rb')
    data = data_source.read()
    data_source.close()
    iv = get_random(AES.block_size)
    cipher = AES.new(key, AES.MODE_CFB, iv)
    data_encrypted = iv+cipher.encrypt(data)
    file_encrypted = open(file_out, 'wb')
    file_encrypted.write(data_encrypted)
    file_encrypted.close()

def aes_decrypt(key, file_in, file_out):
    data_source = open(file_in, 'rb')
    data = data_source.read()
    data_source.close()
    iv = data[:AES.block_size]
    data = data[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CFB, iv)
    data_decrypted = cipher.decrypt(data)
    file_decrypted = open(file_out, 'wb')
    file_decrypted.write(data_decrypted)
    file_decrypted.close()

#testing
key = get_random(32)
#encrypting the file on computer A
aes_encrypt(key, 'file.dat', 'file.enc')
#decrypting the file on computer B
aes_decrypt(key, 'file.enc', 'file.dat')
4

1 に答える 1

2

暗号を実装する上で最も重要な考慮事項の 1 つ、つまりメッセージの整合性が欠けています。残念ながら、メッセージを暗号化するだけでは、特に CTR、CFB、OFB などのストリーミング モードの場合、メッセージが改ざんされないようにするのに十分ではありません。

CFB モード (MODE_CFB) を使用しているようです。これが機能する方法は、ランダムなキーストリームが AES で生成され、その結果がプレーンテキストに対して XOR されます。これは、誰かが暗号文でビットを反転すると、対応するビットが復号化された平文で反転することを意味します。攻撃者はメッセージをまったく別の意味に変更する可能性があり、それを検出する方法はありません。CFB モード (復号化) の仕組みについては、以下を参照してください。

CFBモード

暗号文の最初のブロックの最初のビットを反転すると、復号化された平文の最初のブロックの最初のビットが反転します。

HMACを適用するか、機密性と整合性を一緒に処理するAES-GCMモードを使用する必要があります。

CFB よりも優れたモードの選択肢があるため、それを優先する強い理由がない場合は、最初に AES-GCM をお勧めし、次に HMAC を使用した AES-CTR をお勧めします。

于 2012-12-12T17:25:12.437 に答える