it-swarm-eu.dev

Je vícenásobné šifrování dobrý nápad?

Vím, že mnoho šifrovacích algoritmů, i když jsou bezpečné, má chyby. Chcete-li snížit rizika, by vícenásobné šifrování, jako je tato

Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))

být dobrý nápad?

Vím, že doba provádění se vážně prodlužuje, ale to pro mě není problém. Nějaké návrhy nebo nápady?

20

Osobně bych se většině času vyhnul vícenásobným šifrovacím protokolům. Přidává významnou dodatečnou komplikovanost implementace, aniž by vaše data byla v reálném světě ještě bezpečnější, pokud šifrovací protokol, který používáte, není v konečném důsledku poškozen nebo pokud by se později výpočetně neuskutečnil výpočtově proveditelný.

Je pravda, že nebudu souhlasit s ostatními, kteří tvrdí, že tím máte větší plochu útoku a zvyšujete zranitelnost. Zatímco útočná plocha se technicky zvyšuje (můžete útočit na blowfish; můžete zaútočit na AES), protože musíte úspěšně zaútočit, ale vaše bezpečnost se nesnížila. (Předpokládejme, že vaše zpráva je mnohonásobně šifrována vnořeným způsobem (cokoli jiného nedává smysl), s nezávislými klíči/přístupovými frázemi, jako je multiply_encrypted_file = Blowfish(AES(file)). Pokud útočník udrží multiply_encrypted_file, Není to v žádném případě slabší než chytání encrypted_file = AES(file), ale měli byste si dát pozor na vystavit se útokům se známým prostým textem , což by mohlo oslabit zabezpečení, pokud byste použili stejný klíč/přístupovou frázi na všech úrovních a měli hádatelná hlavička/struktura souboru po první úrovni dešifrování). I když najdou využitelnou chybu v šifrování Blowfish, stále to mohou zvrátit a poté najít šifrovaný soubor AES.

Používám však více vrstev šifrování téměř denně, pokud k tomu existuje legitimní důvod a poskytuje další zabezpečení. Například se často musím připojit k pracovním počítačům z mého domova, ale z bezpečnostních důvodů jsou pracovní počítače na soukromém intranetu, firewallem chráněným před vnějším světem.

Pro připojení se nejprve vytvořím VPN tunel přes veřejný internet na veřejně orientovaný VPN server, který ověří moji identitu, která funguje jako brána k intranetu. Poté veškerý můj síťový provoz odeslaný přes internet mezi mým domem a práci šifrovaný pomocí protokolu IPsec pomocí VPN na server VPN, který jej dešifruje a předá jej místnímu počítači, jako by to bylo na místním intranetu. Možná se ale chci připojit k něčemu v práci pomocí ssh nebo https. To poskytuje vrstvu šifrování pro místní intranet v práci, takže moji spolupracovníci nemohli odposlouchávat v mých síťových připojeních. Pro někoho z mých paketů zachycujících ISP však byla data, která vidí, mnohonásobně šifrována: VPN_encryption(ssh_encryption(actual_data_to_be_transferred)). Opět nepoužívám protokol ssh (na vrcholu VPN), abych zajistil bezpečnost svých dat proti odposlechu ISP; ale v žádném případě to neusnadňuje, aby můj poskytovatel internetových služeb odposlouchával).


EDIT: Někteří stále tvrdí, že implementace by byla mnohem přísnější než standardní šifrování, ale ne nutně. Abych to předvedl, poprvé implementuji Blowfish/AES v python pomocí pycrypto :

from Crypto.Cipher import Blowfish, AES 
from Crypto import Random
from hashlib import sha256, sha512

def encrypt(plaintext, key, crypto_class):
    block_size = crypto_class.block_size
    iv = Random.new().read(block_size)
    cipher = crypto_class.new(key, crypto_class.MODE_CBC, iv)
    pad_len = block_size - (len(plaintext) % block_size)
    padding = ''.join([chr(pad_len)]*pad_len)
    encrypted_msg = iv + cipher.encrypt(plaintext + padding)
    return encrypted_msg

def decrypt(encrypted_msg, key, crypto_class):
    block_size = crypto_class.block_size
    iv = encrypted_msg[:block_size]
    cipher = crypto_class.new(key, crypto_class.MODE_CBC, iv)
    padded_msg = cipher.decrypt(encrypted_msg[block_size:])
    pad_len = ord(padded_msg[-1])
    msg = padded_msg[:len(padded_msg)-pad_len]
    return msg

který se použije v python jako:

>>> plaintext = """CONFIDENTIAL INFO: Wall Street does insider trading.  Also, Israel has nuclear weapons."""
>>> passphrase = 'dinner artist mere trace metal thirty warp better'
>>> key1 = sha256(passphrase).digest()[0:16] # use 16-bytes=128bits for AES128 
>>> key2 = sha512(passphrase).digest()[0:56] # 56 bytes max for Blowfish.
# ideally independent keys but based on same passphrase for simplicity

>>> aes_encrypted_msg = encrypt(plaintext, key1, AES)           # '\r\xd0\x8e\x11\xbd\x9cN3\xd3\xa7a\xce\xd7\x15\xb4\xb2\[email protected]\nBv\x95\xe0\xdb\xd0\xd2\xf2K\x9b\xcd\x80\xc0xr\xb7\x8d/\x16=\xfadV\xf0\xe2\xc8"x,\xa6\xf8\xed\x8b\xee#\xe1\xd1\xd4U4*0\x07\x11\x08\xc5\xe3\x98\r5\x018\xa5\xf1\x84\xb4\x90\xbc\x12\x80E\xbd\xe9\tN\xe1M\x92\xbb=\x06\r\xfe(\xe8\x12\xc7\x86=\n\x0f\x00\xa1R\xe6\x9c\xca\xaa\x15\xc1(\xaa\xe6'
>>> print decrypt(aes_encrypted_msg, key1, AES)
CONFIDENTIAL INFO: Wall Street does insider trading.  Also, Israel has nuclear weapons.

>>> blowfish_encrypted_msg = encrypt(plaintext, key2, Blowfish) # "a\xd2\xe5mf\xac\x81f\xe9Q\xbd.\xd9SwA\x8a)\xcc\x84S\x08\x00\x84\xc6Y\xf5\xa1\x16\x88JaUoF\t4\xa2\xf2b\x89s\xaa\xa6\xb3\xda\xe2\xdd\xff\x0f\xc2\xe2\x1dW\xf6\x840\xe9\x08Eje\xfa\x14\xb77\x99\x00a\xe0\xcd\xaf\xbe\x83\x08\xc0'\x81\x8b\x85\xf0\xdaxT\x94!o\xd0\x07\x0f#\xae$,\x91Q"
>>> print decrypt(blowfish_encrypted_msg, key2, Blowfish)
CONFIDENTIAL INFO: Wall Street does insider trading.  Also, Israel has nuclear weapons.

Nyní, s minimálními detaily, můžete implementovat něco jako:

def double_encrypt_using_keys(plaintext, key1, key2):
    tmp_encrypted_msg = encrypt(plaintext, key1, AES)    
    encrypted_msg = encrypt(tmp_encrypted_msg, key2, Blowfish)
    return encrypted_msg

def double_decrypt_using_keys(encrypted_msg, key1, key2):
    tmp_encrypted_msg = decrypt(encrypted_msg, key2, Blowfish)
    plaintext = decrypt(tmp_encrypted_msg, key1, AES)    
    return plaintext

def passphrase_to_keys(passphrase):
    return sha256(passphrase).digest()[0:16], sha512(passphrase).digest()[0:56]

def double_encrypt(plaintext, passphrase):        
    return double_encrypt_using_keys(plaintext, *passphrase_to_keys(passphrase))

def double_decrypt(encrypted_msg, passphrase):
    return double_decrypt_using_keys(encrypted_msg, *passphrase_to_keys(passphrase))

Které lze použít jako:

>>> double_encrypted_msg = double_encrypt(plaintext, passphrase) # '\xe9\xcd\x89\xed\xb1f\xd4\xbel\xcb\x8b2!\x98\xf0\xe7\xcd.\xefE\x1b\x92>\x82(\x8dG\xdaUS\x8f!\xe2rgkJ\xfb\xed\xb0\x10~n\xae\xe1\xce\x10\xf0\xa4K\x9f\xe6\xff\x8b\x7f\xdex]\x9a<\x9d\xc7\xa9\xb8\x9a\xbbx\xa4\xcekoA\xbc=)\xcc\xe6R\xd7\xb7\xd0[\xc3\xfc\xbfOU\x86\x18\xec5\xa9N\xed\xaa=\x9f\x06.\xbd\x0cMy\xcch\r\xf8\x8cR\xc0\xc5\xdeO\xef\xb0\xe01\x162\xaf\xf2\x1f\xd5\xb5"\x8a\xea\x96'
>>> print double_decrypt(double_encrypted_msg, passphrase)
CONFIDENTIAL INFO: Wall Street does insider trading.  Also, Israel has nuclear weapons.

Nevidím, jak má mnohonásobně šifrovaná implementace více útočné plochy a je v každém případě slabší než implementace prováděná samostatně. Implementaci do vnějšího světa lze stále ještě zadat heslem pro dešifrování uloženého souboru.

11
dr jimbob

Přidáním dalších algoritmů uděláte dvě věci:

  1. Potenciálně zvýšit sílu šifrování.
  2. Zvyšte úroveň útoku vaší aplikace.

AES128-CBC je silný. Pokud ji implementujete správně a používáte silné náhodné klíče a jedinečné náhodné IV, jste velmi v bezpečí. Americká vláda (NSA) osvědčuje AES pro použití při zajišťování přísně tajných dokumentů. Trochu pochybuji, že vaše bezpečnostní požadavky jsou kdekoli blízko jejich, takže byste měli zvážit AES více než dostatečně silně sami. Pokud jste opravdu paranoidní, přesuňte se až na 256bitový AES.

Algoritmy řetězení poskytují prokazatelnější zabezpečení, pokud používáte pro každý z nich nezávislé klíče. Používání stejného klíče pro všechny šifry znamená, že stále musíte broušit pouze jeden klíč, ačkoli u 128 bitů bylo předpovězeno, že bychom k tomu nikdy neměli zařízení posess.

Řetězování více algoritmů dává smysl v směšně vysoce zabezpečených vysoce paranoických dlouhodobých úložných situacích, jako jsou svazky TrueCrypt, kde je prostředí nasazení zcela neznámé. Pokud však nebudete pravděpodobně ukládat vojenská tajemství, která budou přepravena do nepřátelské země, a nestanete-li se profesionálním kryptografem, držím se jen pomocí AES.

16
Polynomial

Je velmi vzácné, že samotný algoritmus je zranitelností. Dokonce i slabé algoritmy, jako je RC4, jsou často nejsilnější součástí systému, ve kterém jsou použity. Zranitelnosti se obvykle skrývají v how, když použijete šifrování (padding, IV náhodnost, kontroly integrity ...) a ve správě klíčů. Tyto zdánlivě periferní činnosti jsou docela obtížně proveditelné a opakovaně se ukázaly být zdrojem slabosti v každém šifrovacím systému. Šifrováním třikrát jste ztrojnásobili příležitosti pro takové ošklivé slabosti.

Takže to nedělej.

13
Thomas Pornin