【问题标题】:What are weaknesses of XORing with SecureRandom bytestream与 SecureRandom 字节流进行异或运算的弱点是什么
【发布时间】:2016-08-30 14:39:28
【问题描述】:

非常接近已经问过XOR Encryption in Java: losing data after decryption

与种子 SecureRandom 产生的字节流进行异或运算看起来简单快速,例如:

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]));
}

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

【问题讨论】:

  • 这实现了one time pad,这是一种不可能进行密码分析的方法。如果满足以下约束。 1)密钥与输入消息具有相同的长度(生成的随机字节数) 2)您再也不会使用相同的密钥(意味着生成的随机字节永远不会以相同的顺序排列)。在您的示例中,您永远不应该为setSeed() 使用相同的字节数组。有关保存原因的说明,请查看Attempt at cryptanalysis

标签: java encryption xor


【解决方案1】:

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

不要让SecureRandom 在该示例中欺骗您。攻击SHA1PRNG 算法比攻击AES 等真正的加密算法要容易得多。

【讨论】:

  • 谢谢。如果我可以就您的解释提出几个问题:当然,伪随机性会扼杀一次性填充的想法。但是,填充流仍然完全基于提供的种子和随机分布,所以异或消息也将随机分布,对吗?只要攻击者同时拥有原始消息和加密消息,便可以复制 pad - 另一个更好的伪随机 secureRandom 实现可以解决它吗?
  • 并非如此,虽然良好的随机性来源是必不可少的,但这还不够。这就是流密码的工作原理,因此如果您在CTR 模式下使用AES,您将使用AES 作为“安全随机”对数据流进行异或。然而,诸如密钥重用和消息完整性等问题使得理论上好的想法在实践中不太有用。
  • Here,你不是第一个对此感到疑惑的人(也不会是最后一个)。
猜你喜欢
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2013-01-09
  • 2017-03-05
相关资源
最近更新 更多