具有多个密钥的级联加密

时间:2012-03-12 14:35:34

标签: aes encryption

AES是对称加密,所以如果我使用key1加密,我总是可以使用key1解密。如果我使用key2加密,我总是可以使用key2解密。

我希望使用多个密钥多次应用此加密来强化它。我想首先使用key1加密我的密码,然后使用key2加密结果,然后使用key3加密结果,依此类推。如下图所示:

  • 密码 - > enc with key1 - > enc with key2 - >用key3封装 - >结果

为了解密结果,我必须反向解密:

  • 结果 - > dec with key3 - > dec with key2 - > dec with key1 - >密

我的问题是,是否存在代表key1,key2和key3的产品的密钥,以便它会在一次传递中解密结果?意思是,攻击者是否可以简单地找到一个会使我的方案短路的密钥4?

  • 结果 - > dec with key4 - >密

3 个答案:

答案 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更快。