2016-08-24 31 views
1

我正在閱讀代碼ransom ware。根據代碼,作者已經將這些文件分成64 kb的塊進行加密。我無法理解爲什麼。是否需要將文件分成塊進行加密

+0


僅供參考,我說的是這個。 – sascha

+0

@sascha爲什麼給出AES的塊大小爲128位? – zaph

+0

可能會限制內存佔用量vs將整個文件加載到內存中,如該實現中所需要的那樣。鏈接代碼的最上面一行是在源代碼中的鏈接,爲什麼不添加註釋@作者並要求澄清。 –

回答

0

爲什麼不明,是攻擊代碼作者的選擇。

使用AES等當前加密方法不需要將文件大小限制爲64KB。大多數實現都可以處理任何大小的文件,但將AES的大小限制爲2^68個字節是明智之舉。

1

如果您查看代碼,加密器會將1024 * blocksize的字節(實際上是16 KiB)作爲單個塊讀取,並使用相同的密碼對象分別加密每個塊。

爲了能夠加密大文件,必須完成此操作,因爲有些文件太大而無法全部讀入內存,然後進行加密並寫回。這意味着可用內存必須比需要加密的文件大三倍以上。

由於PyCrypto沒有基於流的密碼實現,所以這是最接近的,通過保持較小的內存佔用來完成相同的任務。

通常,每個塊的加密都會產生獨立的密文塊,需要按照它們的寫入方式以相同的塊形式讀回,但這裏並不是必需的。 AES-CBC將當前明文塊與先前的密文塊異或。如果它是第一個塊,則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)) 
相關問題