C = AES_k(P)
现在假设我有另一个我选择的纯文本 - P*。这个纯文本与P无关,我选择它是任意的。
是否可能找到一个密钥k*,使得当我使用k*解密C时,我会得到P*?
即: D_k*( AES_k(P) ) = P*
我假设你的明文和密文P、P*和C都是128位块。
如果你的密钥k和k*长度为128位(即你正在使用AES-128),那么有大约36.8%的概率没有解决方案:更准确地说,如果你考虑所有可能的C和P*值集合(2256个组合),则对于其中约e-1个组合,不存在k*会使AES_k*(P*) = C成立。
这源于这样一个思想:对于给定的P*值,将k*转换成AES_k*(P*)的函数应该表现得像一个随机函数,而从大小为N的集合到相同大小的目标集合的随机函数具有平均覆盖率 1-e-1。这里,对于给定的P*值,有大约63.2%的128位字可以作为使用128位密钥加密P*时的AES加密输出。
另一方面,如果允许k*更宽(AES还接受192位和256位密钥),则应该有很多解k*可以满足你的方程。
无论如何,实际上找到k*(甚至192位或256位的k*)应该是不可行的,其工作量接近于2128个操作。能够以比这更小的工作量找到k*可能被视为AES中的结构缺陷。对P和k的了解在任何方面都没有帮助:对于给定的128位密文C,很容易找到匹配的配对(P,k)。
注意:如果你使用AES并交换明文和密钥的角色,则可以获得有限输入和128位输出的原始哈希函数的粗略仿真。你所要求的是对该哈希函数的预像攻击的可行性。
可以通过使用另一种类型的密码(例如维纳姆密码)对C进行解密,从而获得k*并解密C以获取明文P*。
您可以获得k*,使得D_k*( AES_k(P) )生成您的P*。
只需执行以下操作:P* ^ C即可获得您的k*,然后如果您解密:k* ^ C,您将获得P*(假设C和P*的大小相等)。
但是,如果您的P*的大小小于C,则会产生重复的P*。
^:按位异或
我不确定这是否是您想要的,因为您没有提到您也想使用AES进行解密。
对于您选择的任何明文,这都不应该是可能的。能够将密文解密为任意明文将意味着某种被称为完美安全(或完美保密)的东西。
例如,如果我有密码ADGWTX,并且我知道它是使用简单的异或和6个字母的密钥加密的,我仍然不能在没有更多关于密钥的信息的情况下破解它。因为一个密钥会给我ESCAPE,而另一个密钥会给我ATTACK。
完美安全是“一次性密码本”(http://en.wikipedia.org/wiki/One-time_pad)的特征,但不是AES的特征。