【问题标题】:Shuffling with Java SecureRandom for crypto purposes?出于加密目的使用 Java SecureRandom 洗牌?
【发布时间】:2013-01-17 18:37:11
【问题描述】:

我有一个整数列表,其中的顺序是必不可少的。该列表可以非常大,最多 2^24 个元素。我想以原始值及其频率保持不变的方式“加密”它;本质上,就是对列表进行洗牌。我发现一种非常简单(但非常不安全!)的方法是使用 PRNG,如 Java.Random。该过程将使用发送方和接收方共享的密钥为 PRNG 播种,然后应用任何随机排序算法(例如 Fisher-Yates)。这样一来,知道密钥的接收者就能够“恢复”洗牌。

我知道这是一个非常糟糕的想法,但使用 SecureRandom 真的会变得更好吗?我知道它适用于加密的东西,但我不认为它是用来输出大量数字的。

(总的来说,我知道“从不做你自己的算法”是加密 101,但到目前为止,我还没有找到任何其他具有我想要的属性的算法,即“重新排序”但将值和频率保持在原始列表。如果有这样的东西,请您指点一下吗?)

谢谢! :)

【问题讨论】:

  • 您要解决的真正问题是什么。它不能像保持发送方和接收方之间的通信安全那么简单,因为您只需加密整个流即可。那么你真正想要达到什么目的。
  • 本质上,以可逆的方式“混淆”照片的一部分。有帮助吗?
  • 你为什么不简单地加密你想要混淆的照片部分?哦,等等,你想让它们保持“有效”的照片吗?
  • 没错!否则会对画面产生非常大的影响,这是我试图避免的。
  • 我建议您在 StackOverflow 上关闭此问题并在 crypto.stackexchange.com 上重新发布。对于像这样的开放式设计问题,这将是一个更好的论坛。 StackOverflow 旨在解决特定的编程问题(通常伴随着代码),这些问题具有特定、客观的答案。

标签: java random cryptography shuffle


【解决方案1】:

你的想法很好,你只需要使用一个安全的伪随机流。创建它的最简单方法是流密码,例如 CTR 模式下的 AES。

实现一个函数int Random(int count),它从流中读取 8 个字节,采用整数模数,并将其用作 Fisher-Yates shuffle 中的构建块。这不是完全一致的,但足够接近,在实践中并不重要。如果偏执,最多 16 个字节而不是 8 个字节。

【讨论】:

  • 谢谢!我没有想过以这种方式使用流加密(我只是从加密开始),它似乎很有希望!我会调查一下,接受这个作为答案!
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 2018-08-06
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2017-01-26
  • 2011-04-02
相关资源
最近更新 更多