it-swarm-id.com

Apakah beberapa enkripsi merupakan ide yang bagus?

Saya tahu bahwa banyak algoritma enkripsi, meskipun aman, memiliki kerentanan. Untuk mengurangi risiko, akankah banyak enkripsi seperti ini

Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))

menjadi ide yang bagus?

Saya tahu bahwa waktu eksekusi meningkat dengan serius, tetapi ini bukan masalah bagi saya. Ada saran atau ide?

20

Secara pribadi, saya akan menghindari beberapa protokol enkripsi sebagian besar waktu. Ini menambah kompleksitas implementasi tambahan yang signifikan tanpa membuat data Anda lebih aman di dunia nyata, kecuali jika protokol enkripsi yang Anda gunakan pada akhirnya rusak atau menjadi layak secara komputasi di kemudian hari untuk dilanggar.

Memang, saya akan tidak setuju dengan orang lain yang mengklaim bahwa dengan melakukan itu Anda memiliki permukaan serangan yang lebih besar dan meningkatkan kerentanan Anda. Sementara permukaan serangan secara teknis meningkat (Anda dapat menyerang blowfish; Anda dapat menyerang AES), karena Anda harus berhasil menyerang kedua keamanan Anda tidak menurun. (Anggap pesan Anda dienkripsi berlipat ganda dengan cara bersarang (apa pun yang tidak masuk akal) dengan kunci/frasa sandi independen seperti multiply_encrypted_file = Blowfish(AES(file)). Jika penyerang mendapatkan multiply_encrypted_file Itu adalah sama sekali tidak lebih lemah daripada mendapatkan encrypted_file = AES(file) meskipun Anda harus berhati-hati mengekspos diri Anda terhadap serangan plaintext yang diketahui yang dapat melemahkan keamanan jika Anda menggunakan kunci/frasa sandi yang sama di semua tingkatan dan memiliki header/struktur file yang dapat ditebak setelah dekripsi tingkat pertama). Bahkan jika mereka menemukan kelemahan yang dapat dieksploitasi dalam enkripsi Blowfish, mereka masih hanya dapat membalikkannya dan kemudian menemukan file terenkripsi AES.

Namun, saya menggunakan beberapa lapis enkripsi hampir setiap hari ketika ada alasan yang sah untuk itu dan memberikan keamanan ekstra. Sebagai contoh, saya sering harus terhubung ke komputer kantor dari rumah saya, tetapi untuk keamanan komputer kantor berada di intranet pribadi, yang dipadamkan dari dunia luar.

Untuk menghubungkan, saya pertama-tama membuat terowongan VPN melalui internet publik ke server VPN yang menghadap publik yang memverifikasi identitas saya yang bertindak sebagai gateway ke intranet. Kemudian semua lalu lintas jaringan saya mengirim melalui internet antara rumah saya dan pekerjaan yang dienkripsi menggunakan protokol IPsec oleh VPN ke server VPN yang mendekripsi dan meneruskannya ke mesin lokal seolah-olah itu di intranet lokal. Namun, saya kemudian mungkin ingin terhubung ke sesuatu di tempat kerja menggunakan ssh atau https. Ini memberikan lapisan enkripsi untuk intranet lokal di tempat kerja, sehingga rekan kerja saya tidak bisa mengatakan menguping koneksi jaringan saya. Namun, bagi seseorang di ISP saya yang mengambil paket data yang mereka lihat telah dienkripsi berlipat ganda: VPN_encryption(ssh_encryption(actual_data_to_be_transferred)). Sekali lagi, saya tidak menggunakan protokol ssh (di atas VPN) untuk membuat data saya lebih aman terhadap ISP saya yang menguping; tetapi sama sekali tidak membuatnya lebih mudah bagi ISP saya untuk menguping).


EDIT: Beberapa tetap berpendapat bahwa implementasi akan jauh lebih sulit daripada enkripsi standar, tetapi tidak harus. Untuk menunjukkan, saya pertama-tama mengimplementasikan Blowfish/AES di python menggunakan 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

yang digunakan dalam python seperti:

>>> 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.

Sekarang, Anda dengan detail minimal Anda dapat mengimplementasikan sesuatu seperti:

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))

Yang bisa digunakan seperti:

>>> 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.

Saya tidak melihat bagaimana implementasi multiply-terenkripsi memiliki lebih banyak permukaan serangan dan lebih lemah daripada implementasi tunggal. Implementasi ke dunia luar masih dapat memasukkan kata sandi untuk mendekripsi file yang disimpan.

11
dr jimbob

Dengan menambahkan lebih banyak algoritma, Anda melakukan dua hal:

  1. Berpotensi meningkatkan kekuatan enkripsi.
  2. Tingkatkan permukaan serangan aplikasi Anda.

AES128-CBC kuat. Jika Anda menerapkannya dengan benar, dan menggunakan kunci acak yang kuat dan infus acak unik, Anda sangat aman. Pemerintah AS (NSA) mengesahkan AES untuk digunakan dalam mengamankan dokumen rahasia. Saya agak ragu bahwa persyaratan keamanan Anda mendekati mereka, jadi Anda harus mempertimbangkan AES lebih dari cukup kuat saja. Jika Anda benar-benar paranoid, naik ke AES 256-bit.

Algoritme perangkaian hanya menyediakan keamanan yang lebih dapat dibuktikan jika Anda menggunakan kunci independen untuk masing-masingnya. Menggunakan kunci yang sama untuk semua sandi berarti Anda masih harus menekan satu kunci saja, meskipun pada 128 bit sudah diprediksi bahwa kami mungkin tidak akan pernah memiliki peralatan untuk melakukannya.

Chaining multi algoritme masuk akal dalam situasi penyimpanan jangka panjang paranoia tinggi dengan keamanan tinggi seperti volume TrueCrypt, di mana lingkungan penyebaran benar-benar tidak diketahui. Namun, kecuali Anda kemungkinan menyimpan rahasia militer yang akan dikirim ke negara yang bermusuhan, dan kebetulan menjadi seorang ahli kriptografi profesional, saya akan tetap menggunakan hanya menggunakan AES.

16
Polynomial

Sangat jarang bahwa algoritma itu sendiri adalah kerentanan. Bahkan algoritma yang lemah seperti RC4 seringkali merupakan bagian terkuat dari sistem di mana mereka digunakan. Kerentanan biasanya bersembunyi di bagaimana Anda menerapkan enkripsi (padding, keacakan IV, pemeriksaan integritas ...) dan dalam manajemen kunci. Kegiatan yang tampaknya periferal ini cukup sulit dilakukan dengan benar, dan telah berulang kali terbukti menjadi sumber kelemahan nomor satu dalam sistem enkripsi apa pun. Dengan mengenkripsi tiga kali, Anda telah melipattigakan peluang untuk kelemahan jahat seperti itu.

Jadi jangan lakukan itu.

13
Thomas Pornin