it-swarm-vi.com

Là nhiều mã hóa là một ý tưởng tốt?

Tôi biết rằng nhiều thuật toán mã hóa, trong khi an toàn, có lỗ hổng. Để giảm thiểu rủi ro, sẽ mã hóa nhiều lần như thế này

Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))

là một ý tưởng tốt?

Tôi biết rằng thời gian thực hiện tăng nghiêm trọng, nhưng đây không phải là vấn đề đối với tôi. Bất kỳ đề xuất hoặc ý tưởng?

20
Surfer on the fall

Cá nhân, tôi sẽ tránh nhiều giao thức mã hóa hầu hết thời gian. Nó bổ sung thêm độ phức tạp thực hiện bổ sung đáng kể mà không làm cho dữ liệu của bạn an toàn hơn trong thế giới thực, trừ khi giao thức mã hóa bạn đang sử dụng cuối cùng bị phá vỡ hoặc trở nên khả thi về mặt tính toán vào một ngày sau đó để phá vỡ.

Cấp, tôi sẽ không đồng ý với những người khác cho rằng bằng cách làm như vậy bạn có bề mặt tấn công lớn hơn và tăng các lỗ hổng của bạn. Mặc dù bề mặt tấn công về mặt kỹ thuật không tăng (bạn có thể tấn công blowfish; bạn có thể tấn công AES), vì bạn phải tấn công thành công cả an ninh của bạn không bị giảm. (Giả sử tin nhắn của bạn được mã hóa nhiều lần theo kiểu lồng nhau (bất cứ điều gì khác không có ý nghĩa) với các khóa/cụm mật khẩu độc lập như multiply_encrypted_file = Blowfish(AES(file)). Nếu kẻ tấn công nắm giữ multiply_encrypted_file Thì đó là không phải bằng cách nào yếu hơn việc nắm giữ encrypted_file = AES(file) mặc dù bạn nên cẩn thận phơi bày bản thân trước các cuộc tấn công bằng văn bản đã biết có thể làm suy yếu bảo mật nếu bạn sử dụng cùng một khóa/cụm mật khẩu ở mọi cấp độ và có một tiêu đề/cấu trúc có thể đoán được của tệp sau cấp độ giải mã đầu tiên). Ngay cả khi họ tìm thấy lỗ hổng có thể khai thác trong mã hóa Blowfish, họ vẫn chỉ có thể đảo ngược điều đó và sau đó tìm tệp được mã hóa AES.

Tuy nhiên, tôi sử dụng nhiều lớp mã hóa trên cơ sở gần như hàng ngày khi có một lý do chính đáng cho nó và nó cung cấp bảo mật bổ sung. Ví dụ, tôi thường cần kết nối với máy tính làm việc từ nhà của tôi, nhưng để bảo mật, máy tính làm việc nằm trong mạng nội bộ riêng tư, được tường lửa từ thế giới bên ngoài.

Để kết nối, trước tiên tôi tạo một đường hầm VPN qua internet công cộng tới máy chủ VPN đối mặt công khai để xác minh danh tính của tôi hoạt động như một cổng vào mạng nội bộ. Sau đó, tất cả lưu lượng truy cập mạng của tôi được gửi qua internet giữa nhà tôi và công việc được mã hóa bằng giao thức IPsec bằng VPN đến máy chủ VPN giải mã nó và chuyển tiếp đến máy cục bộ như thể nó nằm trên mạng nội bộ cục bộ. Tuy nhiên, sau đó tôi có thể muốn kết nối với một cái gì đó tại nơi làm việc bằng cách sử dụng ssh hoặc https. Điều này cung cấp một lớp mã hóa cho mạng nội bộ cục bộ tại nơi làm việc, vì vậy đồng nghiệp của tôi không thể nói nghe lén các kết nối mạng của tôi. Tuy nhiên, với ai đó tại ISP của tôi chụp các gói dữ liệu, dữ liệu họ thấy đã được mã hóa nhân lên: VPN_encryption(ssh_encryption(actual_data_to_be_transferred)). Một lần nữa, tôi không sử dụng giao thức ssh (trên VPN) để làm cho dữ liệu của tôi an toàn hơn trước việc nghe lén ISP của tôi; nhưng không có cách nào nó giúp ISP của tôi nghe lén dễ dàng hơn).


EDIT: Một số người cho rằng việc triển khai sẽ khó khăn hơn nhiều so với mã hóa tiêu chuẩn, nhưng không nhất thiết phải như vậy. Để chứng minh, trước tiên tôi triển khai Blowfish/AES trong python bằng cách sử dụng 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

mà một được sử dụng trong python như:

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

Bây giờ, bạn với các chi tiết tối thiểu bạn có thể thực hiện một cái gì đó như:

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

Mà có thể được sử dụng như:

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

Tôi không thấy cách triển khai được mã hóa nhân có nhiều bề mặt tấn công và dù sao cũng yếu hơn so với cách triển khai đơn lẻ. Việc triển khai ra thế giới bên ngoài vẫn có thể được nhập mật khẩu để giải mã một tệp được lưu trữ.

11
dr jimbob

Bằng cách thêm nhiều thuật toán, bạn thực hiện hai điều:

  1. Có khả năng tăng cường độ mã hóa.
  2. Tăng bề mặt tấn công của ứng dụng của bạn.

AES128-CBC rất mạnh. Nếu bạn đang thực hiện đúng cách và sử dụng các khóa ngẫu nhiên mạnh và IV ngẫu nhiên duy nhất, bạn sẽ rất an toàn. Chính phủ Hoa Kỳ (NSA) chứng nhận AES để sử dụng trong việc bảo mật các tài liệu tuyệt mật. Tôi hơi nghi ngờ rằng các yêu cầu bảo mật của bạn là bất cứ nơi nào gần họ, vì vậy bạn nên xem xét AES hơn là đủ mạnh một mình. Nếu bạn thực sự hoang tưởng, hãy chuyển lên AES 256 bit.

Các thuật toán chuỗi chỉ cung cấp bảo mật có thể chứng minh hơn nếu bạn sử dụng các khóa độc lập cho mỗi khóa. Sử dụng cùng một khóa cho tất cả các mật mã có nghĩa là bạn vẫn chỉ phải đánh bại một khóa, mặc dù ở mức 128 bit, chúng tôi dự đoán rằng chúng tôi có thể không bao giờ đặt thiết bị để làm như vậy.

Xâu chuỗi nhiều thuật toán có ý nghĩa trong các tình huống lưu trữ dài hạn có độ bảo mật cao, cực kỳ bảo mật cao như khối lượng TrueCrypt, trong đó môi trường triển khai hoàn toàn không xác định. Tuy nhiên, trừ khi bạn có khả năng lưu trữ các bí mật quân sự sẽ được chuyển đến một quốc gia thù địch và tình cờ trở thành một nhà mật mã học chuyên nghiệp, tôi sẽ chỉ sử dụng AES.

16
Polynomial

Điều cực kỳ hiếm là bản thân thuật toán là một lỗ hổng. Ngay cả các thuật toán yếu như RC4 thường là phần mạnh nhất của hệ thống mà chúng được sử dụng. Các lỗ hổng thường ẩn trong cách bạn áp dụng mã hóa (phần đệm, tính ngẫu nhiên IV, kiểm tra tính toàn vẹn ...) và trong quản lý khóa. Các hoạt động ngoại vi dường như này khá khó để thực hiện đúng và đã nhiều lần được chứng minh là nguồn yếu nhất trong bất kỳ hệ thống mã hóa nào. Bằng cách mã hóa ba lần, bạn đã tăng gấp ba cơ hội cho những điểm yếu khó chịu như vậy.

Vì vậy, đừng làm điều đó.

13
Thomas Pornin