AES是对称加密,所以如果我使用key1加密,我总是可以使用key1解密。如果我使用key2加密,我总是可以使用key2解密。
我希望使用多个密钥多次应用此加密来强化它。我想首先使用key1加密我的密码,然后使用key2加密结果,然后使用key3加密结果,依此类推。如下图所示:
为了解密结果,我必须反向解密:
我的问题是,是否存在代表key1,key2和key3的产品的密钥,以便它会在一次传递中解密结果?意思是,攻击者是否可以简单地找到一个会使我的方案短路的密钥4?
答案 0 :(得分:1)
目前AES没有这样的东西,也不可能存在。只有AES算法存在严重缺陷才能实现这一点。
这并不意味着您无法找到可能存在此类密钥的具体示例(仍然非常不可能),但是没有从多个其他密钥中提取组合密钥的过程。
答案 1 :(得分:1)
CryptoLib(https://github.com/IcyApril/CryptoLib)支持使用不同加密密码的级联(分层)加密;它使用1个密钥,但在每个加密级别进行PBKDF2散列(在Whirlpool和SHA512之间进行SOHA交替)。这可以保护你,以防一个密码被破坏,其他密码仍然站在它的位置,为了调用它,你只需这样做(替换路径/与你放置CryptoLib的位置):
<?php
require_once('path/to/cryptolib.php');
$encryptedString = CryptoLib::encryptData("Test string.", "password");
$decryptedString = CryptoLib::decryptData($encryptedString, 'password');
?>
要直接回答最初的问题,建立在此基础上:为了使用三个独立的密钥(以级联方式)与CryptoLib,您可以只调用加密函数三次。
<?php
require_once('path/to/cryptolib.php');
$encryptedString = CryptoLib::encryptData("Test string.", "password1");
$encryptedString = CryptoLib::encryptData($encryptedString, "password2");
$encryptedString = CryptoLib::encryptData($encryptedString, "password3");
?>
要解密字符串,请反向调用解密函数3次:
<?php
require_once('path/to/cryptolib.php');
$decryptedString = CryptoLib::decryptData($encryptedString, "password3");
$decryptedString = CryptoLib::decryptData($decryptedString, "password2");
$decryptedString = CryptoLib::decryptData($decryptedString, "password1");
?>
CryptoLib源位于GitHub上:https://cryptolib.ju.je/,文档站点为https://cryptolib.ju.je。
答案 2 :(得分:0)
由于meet-in-the-middle attack,对于AES-128,三重加密的安全性为O(2 ^ 256)。
这种攻击是在设计3-DES时发现的。
实际上,AES设计有不同的密钥大小,用于将来的攻击开发以及可能的硬件改进(量子计算除外)。 AES通过设计具有128、192和256位。具有相同安全性的AES-256将比3-AES-128更快。