it-swarm-tr.com

Çoklu şifreleme iyi bir fikir midir?

Birçok şifreleme algoritmasının güvenli olsa da güvenlik açıkları olduğunu biliyorum. Riskleri azaltmak için böyle birden fazla şifreleme

Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))

iyi bir fikir olabilir mi?

Yürütme süresinin ciddi şekilde arttığını biliyorum, ama bu benim için bir sorun değil. Herhangi bir öneriniz veya fikriniz var mı?

20

Şahsen, çoğu zaman çoklu şifreleme protokollerinden kaçınırım. Kullandığınız şifreleme protokolü eninde sonunda kırılmadıkça veya daha sonraki bir tarihte kırılmayacak şekilde hesaplanabilir hale gelmedikçe, verilerinizi gerçek dünyada daha güvenli hale getirmeden önemli ek uygulama karmaşıklığı ekler.

Kabul edersek, bunu yaparak daha geniş bir saldırı yüzeyine sahip olduğunuzu ve kırılganlıklarınızı artırdığınızı iddia eden diğerlerine katılmayacağım. Saldırı yüzeyi teknik olarak artarken (blowfish'e saldırabilirsiniz; AES'e saldırabilirsiniz), çünkü her iki güvenliğiniz de başarılı bir şekilde saldırmanız gerekir. (İletinizin yuvalanmış bir şekilde (başka bir şey anlamsız) multiply_encrypted_file = Blowfish(AES(file)) gibi bağımsız anahtarlar/parolalar ile çarpılarak şifrelenmiş olduğunu varsayarsak. Bir saldırgan multiply_encrypted_file Her durumda encrypted_file = AES(file) 'i elde etmekten daha zayıf değil --- her zaman aynı anahtarı/parolayı kullanırsanız güvenliği zayıflatabilecek olan kendinizi bilinen düz metin saldırılarına maruz bırakma ve ilk şifre çözme düzeyinden sonra dosyanın tahmin edilebilir bir üstbilgisine/yapısına sahip). Blowfish şifrelemesinde yararlanılabilir bir kusur bulsalar bile, yine de bunu tersine çevirebilir ve sonra AES şifreli bir dosya bulabilirler.

Ancak, bunun meşru bir nedeni olduğunda ve ekstra güvenlik sağladığı için neredeyse her gün birden fazla şifreleme katmanı kullanıyorum. Örneğin, genellikle evimdeki iş bilgisayarlarına bağlanmam gerekiyor, ancak güvenlik için iş bilgisayarları dış dünyadan güvenlik duvarı olan özel bir intranette bulunuyor.

Bağlanmak için önce genel internet üzerinden halka açık bir VPN sunucusuna, intranete ağ geçidi görevi gören kimliğimi doğrulayan bir VPN tüneli oluşturuyorum. Sonra tüm ağ trafiğim, evim ve VPN arasında IPsec protokolü kullanılarak şifrelenmiş işler arasında internet üzerinden gönderdi ve bu şifre çözülüyor ve yerel intranette sanki yerel makineye iletiliyor. Ancak, daha sonra ssh veya https kullanarak işteki bir şeye bağlanmak isteyebilirim. Bu, işyerindeki yerel intranet için bir şifreleme katmanı sağlar, bu nedenle iş arkadaşlarım ağ bağlantılarımda kulak misafiri olamazdı. Ancak, ISS'imdeki paketleri yakalayan birine gördükleri veriler çarpılarak şifrelenmiştir: VPN_encryption(ssh_encryption(actual_data_to_be_transferred)). Yine, verilerimi ISS gizlice dinlemeye karşı daha güvenli hale getirmek için ssh protokolünü (VPN'nin üstünde) kullanmıyorum; ancak hiçbir şekilde ISS'mizin kulak misafiri olmasını kolaylaştırmaz).


EDIT: Bazıları, uygulamanın standart şifrelemeden çok daha zor olacağını savunuyorlar, ancak zorunlu olarak değil. Göstermek için, ilk önce python pycrypto kullanarak Blowfish/AES uyguluyorum:

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

hangi python gibi kullanılır:

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

Şimdi, asgari ayrıntılarla aşağıdakileri uygulayabilirsiniz:

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

Hangi gibi kullanılabilir:

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

Çarpma şifreli uygulamanın bir saldırı yüzeyine nasıl sahip olduğunu ve tek başına uygulanan bir uygulamadan daha zayıf olduğunu görmüyorum. Dış dünyaya uygulama saklanan bir dosyanın şifresini çözmek için yine de bir parola girilebilir.

11
dr jimbob

Daha fazla algoritma ekleyerek iki şey yaparsınız:

  1. Potansiyel olarak şifrelemenin gücünü artırın.
  2. Uygulamanızın saldırı yüzeyini artırın.

AES128-CBC güçlüdür. Düzgün bir şekilde uyguluyorsanız ve güçlü rastgele anahtarlar ve benzersiz rastgele IV'ler kullanıyorsanız, çok güvendesiniz. ABD hükümeti (NSA), AES'i çok gizli belgelerin güvenliğini sağlamak için kullanmaktadır. Güvenlik gereksinimlerinizin kendilerine yakın herhangi bir yerde olduğundan şüpheliyim, bu yüzden AES'i tek başına yeterince güçlüden daha fazla düşünmelisiniz. Gerçekten paranoyaksanız 256 bit AES'e geçin.

Zincirleme algoritmaları, yalnızca her biri için bağımsız anahtarlar kullanırsanız daha kanıtlanabilir güvenlik sağlar. Tüm anahtarlar için aynı anahtarı kullanmak, yalnızca bir anahtarı bruteforce etmeniz gerektiği anlamına gelir, ancak 128 bit'te ekipmanı asla bunu yapamayacağımız tahmin edilmektedir.

Birden fazla algoritmanın zincirlenmesi, dağıtım ortamının tamamen bilinmediği TrueCrypt birimleri gibi gülünç derecede yüksek güvenlikli yüksek paranoya uzun süreli depolama durumlarında bir anlam ifade eder. Ancak, düşman bir ülkeye gönderilecek ve profesyonel bir kriptograf olacak askeri sırları saklayamazsanız, sadece AES kullanmaya devam edeceğim.

16
Polynomial

Algoritmanın kendisinin bir güvenlik açığı olması oldukça nadirdir. RC4 gibi zayıf algoritmalar bile genellikle kullanıldıkları sistemin en güçlü kısmıdır. Güvenlik açıkları genellikle how şifreleme (dolgu, IV rasgelelik, bütünlük denetimleri ...) ve anahtar yönetiminde gizlenir. Görünüşte bu çevresel faaliyetlerin doğru yapılması oldukça zordur ve herhangi bir şifreleme sisteminde bir numaralı zayıflık kaynağı olduğunu defalarca kanıtlamıştır. Üç kez şifreleyerek, bu kötü zayıflıkların fırsatlarını üçe katladınız.

Öyleyse yapma.

13
Thomas Pornin