【问题标题】:Most secure way to cipher a boolean using a deterministic algorithm?使用确定性算法加密布尔值的最安全方法?
【发布时间】:2013-01-26 19:35:24
【问题描述】:

在我的一项学校工作中,我需要使用确定性算法 (http://en.wikipedia.org/wiki/Deterministic_encryption) 来加密几个字段。

在这种特定情况下,我必须用布尔值对表进行加密。这很好,除了使用确定性算法这样做几乎没有用处。

为什么会这样? (你可能会问)

当我加密(例如)值“true”时,我总是得到“AB1”的密文,而当我加密值 false 时,我总是得到“SQ2”的密文。因此,我没有用值“真”和“假”填充表,而是用值“AB1”和“SQ2”填充表。 任何攻击者都会立即明白我的表存储布尔值,并且他很快就会发现 AB1=true 和 SQ2=false。

这是我想在作业中避免的。为了避免这个问题,我尝试使用具有某些属性的数字。例如,“真”的值被一个素数替换,而“假”的值被一个非素数替换。因此,我的表格将充满许多不同的素数和非素数。

如果不是为了一件小事,这将是一个可接受的解决方案:我们可以计算的素数数量是“有限的”(计算大素数需要很长时间)。在 10000000 个数字的区间中,只有 664579 是素数(只有 6.64579%)。

所以我考虑使用奇数而不是质数,但我不确定奇数的质量。我认为攻击者将能够从密码中检索“奇怪”的属性,从而进行攻击。

我对奇数的假设正确吗? 还有其他解决方案吗? 大家有什么想法吗?

如果有任何帮助或想法,我将不胜感激,提前感谢 Pedro。

【问题讨论】:

  • "因此,我的表将充满许多不同的素数和非素数。"这是如何确定的?
  • true 使用奇数,对false 使用偶数意味着您的布尔值由数字中的最低位表示。如果您随机选择其他位,如果数字足够大(比如 64 位),它应该是安全的。
  • @starblue 哇,我没想到。很棒的反馈,谢谢!如果您将此作为答案而不是评论发布,我会选择它作为我问题的最终答案:P

标签: cryptography boolean primes deterministic


【解决方案1】:

根据论文,CryptDB 的工作原理是根据执行的查询调整加密级别。

当不执行查询时,所有值都使用他们所谓的Random 加密存储。这基本上是 CBC 模式下的 AES,带有随机 IV。由于所有字段的 IV 都不同,因此所有字段将具有不同的加密方式。

当他们需要对列(对于 JOIN、GROUP BY 等)执行相等检查时,他们会将加密降级为 Deterministic 加密。这种加密级别的主要要求是给定的明文总是被加密为相同的密文。所以对于这个级别,一个布尔列将只有两个可能的密文值。是的,这会将信息泄露给可以观察表格的攻击者,但没有办法绕过它。存储素数/非素数将不起作用:数据库将无法执行所需的操作。

对不起,你需要为你的家庭作业找到另一个想法。

【讨论】:

  • 感谢您的建议!然而,我的工作是实现 CryptDB 的“搜索层”:css.csail.mit.edu/cryptdb(真的很棒的项目,你应该看看)。在这一层中,他们使用零的 IV,因此他们可以稍后解密信息。
【解决方案2】:

您可以获取一组布尔值并将它们视为二进制数

【讨论】:

  • 不幸的是我做不到。我的表的格式为:“ ID | FieldA | Boolean ”。但是我可以做的是对 ID+FieldA+Boolean 进行摘要并最终加密。猜猜它会很好用。感谢您的想法:P
【解决方案3】:

这里最大的误解是您不会单独加密每个值。您应该做的是将所有值打包到某种数据结构中(例如bool 的数组),然后将数据结构作为一个整体加密(使用 CBC 模式,如果您还没有这样做的话)。

就加密而言,选择的数据结构(即如何选择将表打包成单个二进制实体)并不重要。

【讨论】:

  • 我目前使用“AES/PKCS5Padding/CBC/BC”作为加密设置。我需要使用此模式。我的大问题是我有一个表,我必须加密该表上的每个值(该表实际上是 MySQL 数据库中的 BLOB 值)。不过谢谢你的建议,我很感激。
  • @Flame_Phoenix:您必须加密整个表。如您所见,单独加密每个值是没有用的。
【解决方案4】:

好吧,我不知道这是否会对你们有所帮助,但我的最终结论是结合了我的一些建议。

我通过以下作业解决了这个问题:

true = 随机整数 PRIME 数

false = 随机整数(非素数)

现在明显的问题来了:

Q:如果我选择随机数,不保存每个生成的数字,如何保证不重复?

A:我把随机数转换成字节,和同一张表的ID混在一起。这样,如果我生成一个随机重复的数字并不重要,因为当我将它与 ID(这是唯一的)混合时,我搞砸了输出。

然而,计算素数可能非常繁重,所以我将在此处发布我的报告的一小部分,其中有其他建议:

Although we selected the property of being prime as an equivalent to the boolean of true, we could have also used other properties, such as:
  <li>
    <ul>
        Representing a true boolean by a random odd number and 
        a false boolean by a random even value
    </ul>
    <ul>
        Representing a true boolean by a sequence of numbers 
        that belongs to PI and a false boolean by a random 
        number sequence that doesn't belong to PI
    </ul>
  </li>

这对我来说是一个非常有趣和意想不到的挑战。我从来没有想过,这么简单的事情需要这么聪明。

我希望我的解决方案对大家有所帮助,如果你喜欢密码学,请看看这个项目:P

【讨论】:

  • 除了 li/ul 的混合嵌套 :) - 我认为你不会很幸运地找到“不属于 PI 的随机数序列”
猜你喜欢
  • 2011-02-04
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多