Cryptography 使用确定性算法对布尔值进行加密的最安全方法是什么?

Cryptography 使用确定性算法对布尔值进行加密的最安全方法是什么?,cryptography,boolean,primes,deterministic,Cryptography,Boolean,Primes,Deterministic,在我的一个学校作品中,我被要求使用确定性算法(http://en.wikipedia.org/wiki/Deterministic_encryption)对几个字段进行加密 在这种特殊情况下,我必须用布尔值对一个表进行加密。这很好,但使用确定性算法这样做几乎毫无用处 为什么会这样?(你可以问) 碰巧的是,当我对(每个示例)值“true”进行加密时,我总是得到“AB1”的密文,而当我对值“false”进行加密时,我总是得到“SQ2”的密文。因此,我没有用“true”和“false”值填充一个表,而

在我的一个学校作品中,我被要求使用确定性算法(http://en.wikipedia.org/wiki/Deterministic_encryption)对几个字段进行加密

在这种特殊情况下,我必须用布尔值对一个表进行加密。这很好,但使用确定性算法这样做几乎毫无用处

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

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


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

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

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

我关于奇怪的假设正确吗? 还有其他解决办法吗? 你们有什么想法吗


我非常感谢任何帮助或想法,请提前告诉佩德罗。

你可以将布尔数分组,并将它们视为二进制数。

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


选择的数据结构(即选择如何将表打包为单个二进制实体)与加密无关。

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

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

当他们需要对列执行相等性检查时(对于联接、分组等),他们会将加密降级为
Deterministic
encryption。这种加密级别的主要要求是,给定的明文始终加密为相同的密文。因此对于这个级别,布尔列对于密文只有两个可能的值。是的,这会将信息泄漏给可以观察表的攻击者,但无法绕过它。相反,存储素数/非素数将不起作用:数据库将无法执行所需的操作


抱歉,但你需要为你的家庭作业找到另一个想法。

好吧,我不知道这是否对你们有帮助,但我的最终结论是我的想法和你的一些建议的结合

我通过做以下作业解决了这个问题: 真=随机整数素数 false=随机整数(非素数)

现在一个明显的问题来了: 问:如果我选择的是随机数,我如何保证在不保存每个生成的数字的情况下不会重复这些数字? 答:我将随机数转换为字节,并将其与同一个表的ID混合。通过这种方式,我不在乎是否生成了一个随机的重复数,因为当我将它与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>
虽然我们选择了being prime属性作为true布尔值的等价物,但我们也可以使用其他属性,例如:
    • 用随机奇数表示真布尔值 由随机偶数值构成的假布尔值
      用数字序列表示真布尔值 它属于π和一个伪布尔,由一个随机数组成 不属于PI的数字序列
  • 这对我来说是一个非常有趣和意想不到的挑战。我从来没有想到如此简单的事情需要如此的创造力


    我希望我的解决方案能帮助大家,如果你喜欢加密技术,请看一下这个项目:p

    我目前正在使用“AES/PKCS5Padding/CBC/BC”作为加密设置。我需要使用这种模式。我最大的问题是我有一个表,我必须加密该表上的每个值(该表实际上是MySQL数据库中的一个BLOB值)。谢谢你的建议,我很感激。@Flame_Phoenix:你必须对整个表进行加密。正如您所看到的,单独加密每个值是无用的。不幸的是,我不能这样做。我的表的格式是:“ID | FieldA | Boolean”。然而,我能做的是对ID+FieldA+Boolean进行摘要,并最终对其进行加密。我想这会很好用的。感谢您的想法:P“因此,我的表将填充许多不同的素数和非素数。”这是如何确定的?使用奇数表示
    true
    ,偶数表示
    false
    ,表示布尔值由数字中的最低位表示。如果你随机选择其他位,如果数字足够大(比如64位),那么它应该是安全的