Java 使用SecureRandom ByTestStream进行XORing的缺点是什么

Java 使用SecureRandom ByTestStream进行XORing的缺点是什么,java,encryption,xor,Java,Encryption,Xor,非常接近于已经提出的问题: 使用种子SecureRandom生成的ByTestStream进行xoring看起来简单而快速,例如: byte[] data = <data to encrypt> SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); random.setSeed("myPassword".getBytes(Charset.forName("UTF-8"))); byte[] mask =

非常接近于已经提出的问题:

使用种子SecureRandom生成的ByTestStream进行xoring看起来简单而快速,例如:

byte[] data = <data to encrypt>
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
random.setSeed("myPassword".getBytes(Charset.forName("UTF-8")));
byte[] mask = new byte[1];
for(int ii = 0; ii < len; ii++) {
  sr.nextBytes(mask);
  data[ii] = (byte)(0xFF & (data[ii] ^ mask[0]));
}
byte[]数据=
SecureRandom=SecureRandom.getInstance(“SHA1PRNG”、“SUN”);
random.setSeed(“myPassword”.getBytes(Charset.forName(“UTF-8”)));
字节[]掩码=新字节[1];
对于(int ii=0;ii

由于这种方法不是最常用的对称加密,它有什么问题?

有几个问题,但主要问题是,如果只有伪随机性,那么就有伪安全性。另一方面,True random不会基于一个种子发出相同的字节,因此您必须将整个密钥流放在手边


不要让
SecureRandom
在该示例中愚弄您。攻击
SHA1PRNG
算法要比攻击真正的加密(如
AES
)容易得多,谢谢。如果我能就你的解释问几个问题:当然,伪随机性扼杀了一次性pad的想法。然而,填充流仍然完全基于提供的种子和随机分布,因此xor'ed消息也将随机分布,对吗?只要攻击者同时拥有原始消息和加密消息,就可以复制pad——另一个更好的伪随机secureRandom实现可以解决这个问题吗?不太可能,尽管良好的随机性源是必不可少的,但这还不够。这就是流密码的工作原理,因此如果您在
CTR
模式下使用
AES
,您将使用
AES
作为“securerandom”对数据流执行异或操作。然而,密钥重用和消息完整性等问题使得理论上好的想法在实践中不那么有用。你不是第一个对此感到疑惑的人(也不会是最后一个)。这实现了密码分析不可能实现的目标。如果满足以下约束条件。1) 该键的长度(生成的随机字节数)与输入消息的长度相同2)您不再使用同一个键(表示生成的随机字节的顺序不同)。在您的示例中,您永远不应该对
setSeed()
使用相同的字节数组。要想了解它为什么会被保存,请看下面的例子。