security之加密算法如何知道它们是否拥有正确的 key

rubylouvre 阅读:26 2025-05-04 20:05:19 评论:0

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

例如,假设我要发送 plainText = new byte[]{2,5,1,6,7}鲍勃。

如果我使用 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. 

如果有人想解密该消息,那么他们将不得不执行以下操作:
newPlainText = Aes.Decrypt(cipherText, key, iv); 

现在我的问题是 AES 如何知道您是否输入了正确的 key ? 我认为拥有一种不会立即进行暴力攻击的算法会更安全。换句话说,如果黑客知道您使用了 AES,它可以继续尝试大量密码,直到 method Aes.Decrypt也不异常(exception)。现在考虑这个算法:

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

密码是 = "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'} 这个算法的好处是,如果你有正确的 key ,你现在永远不会!

使用此算法,无法知道您是否拥有写入 key ,这使得我相信无法破译它。如果您使用众所周知的算法,如果您的密码不是很长,您会提示进行暴力攻击。

*所以我的问题是众所周知的对称加密算法(如 AES)如何知道您输入的 key 是否正确?拥有一个您不知道是否提供正确 key 的算法不会更安全吗? *

请您参考如下方法:

加密算法知道输入键是否正确!该算法可以很好地使用任何 key 解密;如果您使用错误的 key ,它将最终变成垃圾。一旦完成,使用加密的应用程序可能能够检测到这一点,因为解密的消息可能会有无效的填充或以其他方式格式错误,但 AES 本身永远不会“抛出异常”。

您描述的算法是 one-time pad .它的致命缺陷是它的 key 必须至少和消息一样长,并且永远不能重复使用——如果相同的 key 用于两条消息,那么两条消息A ⊕ KB ⊕ K可以一起异或得到 A ⊕ K ⊕ B ⊕ K = A ⊕ B -- 现在已经从消息中删除了 key ,并且可以从中猜出消息是什么。


标签:加密算法
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号