我知道许多加密算法虽然安全,但也存在漏洞。为了降低风险,会不会像这样进行多重加密
Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))
是个好主意吗?
我知道执行时间会严重增加,但这对我来说不是问题。有什么建议或想法吗?
我知道许多加密算法虽然安全,但也存在漏洞。为了降低风险,会不会像这样进行多重加密
Blowfish_CbC ( Rc2_OFB ( AES128_CBC (myfilecontent)))
是个好主意吗?
我知道执行时间会严重增加,但这对我来说不是问题。有什么建议或想法吗?
通过添加更多算法,您可以做两件事:
AES128-CBC 很强大。如果您正确实施它,并使用强随机密钥和唯一随机 IV,那么您将非常安全。美国政府 (NSA) 认证 AES 用于保护绝密文件。我有点怀疑您的安全要求是否接近他们的要求,因此您应该考虑单独使用 AES 足够强大。如果您真的很偏执,请升级到 256 位 AES。
如果您为每个算法使用独立的密钥,则链接算法仅提供更可证明的安全性。对所有密码使用相同的密钥意味着您仍然只需要暴力破解一个密钥,尽管据预测,在 128 位时,我们可能永远不会让设备这样做。
在部署环境完全未知的 TrueCrypt 卷等高安全性、高度偏执的长期存储情况下,链接多个算法是有意义的。但是,除非您可能存储将被运送到敌对国家的军事机密,并且恰好是专业的密码学家,否则我会坚持使用 AES。
算法本身存在漏洞的情况极为罕见。即使像 RC4 这样的弱算法也常常是使用它们的系统中最强大的部分。漏洞通常隐藏在您应用加密的方式(填充、IV 随机性、完整性检查......)和密钥管理中。这些看似外围的活动很难做到正确,并且一再被证明是任何加密系统的第一大弱点。通过 3 次加密,您将出现此类令人讨厌的弱点的机会增加了两倍。
所以不要这样做。
就个人而言,大多数时候我会避免使用多种加密协议。它增加了显着的额外实现复杂性,而不会使您的数据在现实世界中更加安全,除非您使用的加密协议最终被破坏或在以后变得在计算上可行以破坏。
当然,我不同意其他人声称这样做会增加攻击面并增加漏洞的说法。虽然攻击面在技术上确实增加了(你可以攻击河豚;你可以攻击 AES),因为你必须成功地攻击你的安全性并没有降低。(假设你的消息是嵌套方式(什么都没有意义),具有独立的密钥多次加密/密码口令一样 multiply_encrypted_file = Blowfish(AES(file))
。如果一个攻击者得到的保持multiply_encrypted_file
它是不以任何方式比得到的保持较弱encrypted_file = AES(file)
但应提防的暴露自己已知明文攻击如果您在所有级别使用相同的密钥/密码并且在第一级解密后具有可猜测的文件头/结构,这可能会削弱安全性)。即使他们在Blowfish
加密中发现了可利用的漏洞,他们仍然只能将其反转,然后找到一个 AES 加密文件。
但是,如果有正当理由,我几乎每天都会使用多层加密,并且它提供了额外的安全性。例如,我经常需要从家里连接到工作计算机,但为了安全起见,工作计算机位于私有 Intranet 上,与外界隔离。
为了连接,我首先在公共互联网上创建一个 VPN 隧道,连接到一个面向公众的 VPN 服务器,该服务器验证我的身份,充当通往 Intranet 的网关。然后我的所有网络流量都通过互联网在我的房子和工作之间通过 VPN 使用 IPsec 协议加密发送到 VPN 服务器,该服务器对其进行解密并将其转发到本地计算机,就好像它在本地 Intranet 上一样。ssh
但是,我可能想使用或连接到工作中的某些东西https
。这为工作中的本地 Intranet 提供了一层加密,因此我的同事无法窃听我的网络连接。但是,对于我的 ISP 捕获数据包的人来说,他们看到的数据已被多重加密:VPN_encryption(ssh_encryption(actual_data_to_be_transferred))
. 同样,我没有使用 ssh 协议(在 VPN 之上)来使我的数据更安全,以防止我的 ISP 窃听;但绝不会让我的 ISP 更容易窃听)。
编辑:一些人一直认为实施比标准加密要困难得多,但不一定。为了演示,我首先使用pycrypto在 python 中实现 Blowfish/AES :
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
可以在 python 中使用,例如:
>>> 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\xd7@\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.
现在,你可以用最少的细节来实现类似的东西:
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))
可以像这样使用:
>>> 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.
我看不出多重加密的实现如何具有更多的攻击面,并且无论如何都比单一实现的弱。对外界的实现仍然可以通过输入密码来解密存储的文件。