Java 当消息较短且攻击者已知时,是否可以找到对称密钥?

Java 当消息较短且攻击者已知时,是否可以找到对称密钥?,java,security,Java,Security,我需要加密请求中的几个参数(使用Java、AES(cbc)、128位密钥): 我必须假设攻击者可以猜出所有值。这对猜测/查找对称密钥有什么影响?即使攻击者知道已加密的内容,对称密钥是否仍然安全?粗略估计的使找到钥匙更容易的“因素”是什么?(例如,在没有已知内容的情况下,查找密钥的速度可能会快1000…) (我的问题仅仅是关于攻击者可能知道要加密的内容这一事实的影响。由于长度限制,我不可能包含任何“随机”字符或salt等) 还有一个相关的问题。如果我为AES函数的“初始化向量”选择与用于初始化密钥

我需要加密请求中的几个参数(使用Java、AES(cbc)、128位密钥):

我必须假设攻击者可以猜出所有值。这对猜测/查找对称密钥有什么影响?即使攻击者知道已加密的内容,对称密钥是否仍然安全?粗略估计的使找到钥匙更容易的“因素”是什么?(例如,在没有已知内容的情况下,查找密钥的速度可能会快1000…)

(我的问题仅仅是关于攻击者可能知道要加密的内容这一事实的影响。由于长度限制,我不可能包含任何“随机”字符或salt等)

还有一个相关的问题。如果我为AES函数的“初始化向量”选择与用于初始化密钥相同的数据,会对安全性产生什么影响? 这对安全有什么影响吗

多谢各位! 马库斯

这被称为一个。所有像样的加密(包括AES)都不会受到攻击

根据定义,只有加密密钥是机密的。假设已知初始向量、密钥推导算法等。因此,如果您对IV和key使用相同的数据,则可能会削弱您的安全性。您可以通过加密强散列来运行数据,因此从已知IV到密钥需要首先反转散列。但最好不要将任何与密钥生成相关的数据用于任何其他用途。

这称为。所有像样的加密(包括AES)都不会受到攻击

根据定义,只有加密密钥是机密的。假设已知初始向量、密钥推导算法等。因此,如果您对IV和key使用相同的数据,则可能会削弱您的安全性。您可以通过加密强散列来运行数据,因此从已知IV到密钥需要首先反转散列。但最好不要将任何与密钥生成相关的数据用于任何其他用途。

此场景称为“”:

经典密码通常容易受到已知的明文攻击

AES的设计就是为了抵御这种攻击

工作原理:如果你运行一个程序,那么你也应该能够反向运行它,对吗?例如,
a+b=c
。如果您知道
c
(结果)和
a
(纯文本),则可以导出
b

不过,这并不适用于所有操作。取模:
a%b=c
a=0x41
c=1
。在这种情况下,
b
可以是多个值。AES使用了很多这样的方法来确保您无法通过算法计算出从原始消息派生密钥的方法。

此场景称为“”:

经典密码通常容易受到已知的明文攻击

AES的设计就是为了抵御这种攻击

工作原理:如果你运行一个程序,那么你也应该能够反向运行它,对吗?例如,
a+b=c
。如果您知道
c
(结果)和
a
(纯文本),则可以导出
b


不过,这并不适用于所有操作。取模:
a%b=c
a=0x41
c=1
。在这种情况下,
b
可以是多个值。AES使用了很多这样的方法来确保您无法通过算法计算返回,从而从原始消息中导出密钥。

您可以通过向数据中添加随机值来减少猜测因素。再次解密该值后,将其丢弃。

您可以通过向数据中添加随机值来减少猜测因素。再次解密该值后,您将丢弃它。

出现的前两个答案都以“这是一次明文攻击”开头,但事实似乎并非如此。Markus指出,“攻击者可以猜出所有的值”,并且“要加密的内容可能是攻击者已知的”。这与“攻击者知道内容”不同。明文攻击还要求攻击者知道哪些明文导致哪些密文,这在问题中有点含糊不清,但看起来像是“否”。听起来攻击者可以访问加密字符串,并且只能猜测明文中的字段可能是什么,问题是这会对密钥的安全性产生什么影响

好消息是,这两个答案是正确的,“所有像样的密码,包括AES,都不会受到攻击。”而且“AES的设计是为了抵御这种攻击”。因此(再次引用问题)“即使攻击者知道已加密的内容”,答案是否定的-即使明文已知,密钥也不一定容易受到攻击

在更高的层次上,似乎可以对使用加密的动机有更多的了解。Bruce Schneier(《应用密码学》一书的作者)宁愿你不考虑你的密码学有多强大,而是考虑你如何管理你的风险。使用AES加密某些字符串基本上是说“攻击者需要大约某某的计算能力来强行破解密码,而已知的明文攻击将使其减少某某的数量,而在超级计算机上的这种时间将花费X数千美元”,因此,基本上,您是通过考虑秘密的价值以及替换/恢复该秘密的成本来管理风险的。如果你的对手愿意花那么多钱,你最好确保密码是你系统中最薄弱的部分——例如,他们可以花一小部分钱贿赂一个流氓系统管理员和做内部工作。insigh的另一面
String toencrypt = "name+birthdate+appid+userid"