加密算法如何知道他们是否拥有正确的密钥

Ton*_*Nam 2 security encryption encryption-symmetric

我知道尝试实现自己的加密算法是个坏主意.这是我认为不是的一个原因:

例如,假设我想发送plainText = new byte[]{2,5,1,6,7}给bob.

如果我使用AES加密或其他熟知的算法,那么我将:

cipherText = Aes.Encrypt(plainText, key, iv); // now I have some cipher text that is not readable to anyone if they do not have the key and iv vector.
Run Code Online (Sandbox Code Playgroud)

如果有人想要解密该消息,那么他们将不得不做以下事情:

newPlainText = Aes.Decrypt(cipherText, key, iv);
Run Code Online (Sandbox Code Playgroud)

现在我的问题是AES如何知道你是否输入了正确的密钥?我认为使用一种不会出现暴力攻击的算法会更安全.换句话说,如果黑客知道你使用了AES,它可以继续尝试很多密码,直到method Aes.DecryptThorw也不例外.现在考虑这个算法:

假设我想将相同的字节数组发送{2,5,1,6,7}到bob.我的加密算法可能如下所示:

password is ="securePassword";

我将迭代我的纯文本上的每个字节,并对密码上每个字符的ASCII值执行Xor运算符.例如,第一个字节将是2 Xor (ASCII value of 's')下一个值将5 Xor (ASCII value of 'e')结束我将结束{2 Xor 's', 5 Xor 'e', 1 Xor 'c', 6 Xor 'u', 7 Xor 'r'} 这个算法的好处是,如果你有正确的密钥,你现在永远不会!

使用这种算法,不可能知道你是否有写密钥,这使得我无法破译它.如果您使用众所周知的算法,如果您的密码不长,则会提示您进行暴力攻击.

*所以我的问题是众所周知的AES等对称加密算法如何知道你是否输入了正确的密钥?有一个算法,你不知道你是否提供正确的密钥将不会更安全?*

dus*_*uff 9

加密算法知道输入密钥是否正确!该算法可以很好地解密任何密钥; 如果您使用错误的密钥,它最终会被垃圾邮寄.使用加密的应用程序可能能够在完成后检测到这一点,因为解密的消息可能具有无效的填充或者在其他方面会出现格式错误,但AES本身永远不会"抛出异常".

您描述的算法是一次性填充.其致命的缺陷是,它的键必须至少只要该消息,并且不能重复使用-如果相同的密钥与两个消息,则使用的两个消息A ? KB ? K可以一起进行异或以产生A ? K ? B ? K = A ? B-的键具有现在已从消息中删除,并且可以猜测消息来自此消息.