2016-08-24 4 views
1

私はransom wareのコードを読んでいました。コードに従って、著者はファイルを暗号化するために64kbのチャンクに分割しました。なぜ私は理解できません。暗号化のためにファイルをチャンクに分割する必要がありますか

+0

。 – sascha

+0

@sascha AESのブロックサイズが128ビットであるのはなぜですか? – zaph

+0

おそらく、その実装で必要とされるように、メモリフットプリントとファイル全体をメモリにロードすることを制限することができます。あなたのリンクされたコードのトップラインは、stackoverflow上のここにその起源へのリンクです、なぜ@コメントを著者に追加し、説明を求めてください。 –

答えて

0

攻撃コードライターがなぜ不明で、選択肢だったのですか?

AESなどの現在の暗号化方法を使用してファイルサイズを64KBに制限する必要はありません。ほとんどの実装では、AESのサイズを2^68バイトに制限することが賢明ですが、任意のサイズのファイルを処理します。

1

コードを見ると、encryptorは1024 * blocksizeバイト(実際には16KB)を単一のチャンクとして読み取り、同じ暗号オブジェクトを使用して各チャンクを個別に暗号化します。

大きなファイルを暗号化できるようにするには、このファイルを暗号化してから書き戻すには大きすぎるファイルがあるため、これを実行する必要があります。つまり、空きメモリは、暗号化する必要があるファイルのサイズの3倍以上でなければなりません。

PyCryptoはストリームベースの暗号実装をしていないため、メモリの占有スペースを小さくして同じタスクを実行するのに最も近い方法です。

一般に、各チャンクの暗号化は、書き込まれたのと同じチャンク形式で読み返す必要がある独立した暗号文チャンクを生成しますが、ここでは必要ありません。 AES-CBCは、現在の平文ブロックを前の暗号文ブロックとXORします。それが最初のブロックであれば、IVは前の暗号文ブロックとして使用されます。 IVは暗号オブジェクト上でリセットされないので、常に前の暗号文ブロックを保持する。その結果、生成された暗号文は実際には単一の大きなチャンクとしての暗号化と同等です。参考のため


、私はこのことについて話している:彼はおそらく**ブロック暗号を使用しているので

def encrypt(in_file, out_file, password, key_length=32): 
    bs = AES.block_size 
    salt = Random.new().read(bs - len('Salted__')) 
    key, iv = derive_key_and_iv(password, salt, key_length, bs) 
    cipher = AES.new(key, AES.MODE_CBC, iv) 
    out_file.write('Salted__' + salt) 
    finished = False 
    while not finished: 
     chunk = in_file.read(1024 * bs) 
     if len(chunk) == 0 or len(chunk) % bs != 0: 
      padding_length = (bs - len(chunk) % bs) or bs 
      chunk += padding_length * chr(padding_length) 
      finished = True 
    out_file.write(cipher.encrypt(chunk)) 
関連する問題