这种加密方式“安全”吗?

4

首先声明,我从未学过密码学,我所知道的一切都只是基本概念。

我们正在寻找一种快速简便的方法,使用密码加密一些数据(存储到数据库中)。 我知道“最安全”的算法是AES,但对于我们来说可能太复杂了,而且我知道它需要我们获得美国政府的授权等。

我们考虑了这个(简单的)算法,它让我想起了一种“一次性密码本”(但我可能错了)。 (它没有用任何特定的语言...只是一个想法 :))

// The string we need to encrypt
string data = "hello world";

// Long string of random bytes that will be generated the first time we need to encrypt something
string randomData = "aajdfskjefafdsgsdewrbhf";

// The passphrase the user selected
string passphrase = "foo";

// Let's generate the encryption key, using randomData XOR passphrase (repeating this one)
string theKey = "";
j = 0;
for(i = 0; i < randomData.length; i++)
{
    theKey += randomData[i] ^ passphrase[j];
    j++;
    if(j == passphrase.length) j = 0;
}

// Encrypt the data, using data XOR theKey (with theKey.length >= data.length)
string encryptedData = "";
for(i = 0; i < data.length; i++)
{
    encryptedData += data[i] ^ theKey[i];
}

在磁盘上,我们只会存储随机数据和加密数据。每次都会要求用户输入密码。
像这样的算法有多安全? 除了暴力破解外,还有其他方法可以破解吗?我觉得统计分析不可能奏效,是吗? 它与一次性密码本一样安全吗?
谢谢!

15
规则 #1:不要发明自己的加密算法(或密码哈希算法)。每十年左右,经验丰富的密码学家们会辛苦工作后找到一两个实用而真正优秀的加密算法。仅凭统计数据就可以知道,你发明的任何东西都注定失败。 - user395760
你说得对。我并不是在假装发明最安全的算法 :) 只是想知道我的想法是否适用于非敏感数据。 - ItalyPaleAle
2
“这将是糟糕的。”如果您想要查找和修复即使对专家来说最明显的缺陷,您需要花费相当多的时间来学习和创建更多算法。这是浪费了很多时间,但仍然没有保证。您应该简单地使用现有的东西。无论数据是否如此不敏感以至于可以省略加密,或者您应该正确地执行它。如果您想学习一些密码学,请不要尝试在任何被视为加密的远程敏感内容上进行尝试。 - user395760
4个回答

9

您可以导入一个AES库,让它完成所有繁重的工作。美国政府的授权?这是一个公共函数,美国政府也在使用它。


我听到了很多不同的意见。许多人告诉我们,每次使用任何AES函数时都需要授权,即使您正在链接开源或系统库。 我们在StackOverflow上发现有人说,当您的应用程序通过https与Web服务器通信时,也需要权限! - ItalyPaleAle
1
请查看http://www.bis.doc.gov/encryption/ccl5pt2.pdf中的注释4。只要任何程序的主要目的是加密数据并将其存储在数据库中,而不是维护数据库,我认为你应该没问题。 - JAB

5

这个加密算法非常弱,统计分析可以轻松破解,一些勤奋的纸笔猜测也可能很快就能破解它。

唯一的例外情况是:(1) randomData 来自真正具有加密强度的源,(2) randomData 至少与你的明文数据一样长,(3) randomData 永远不会被重用于不同的消息中,(4) 你完全摒弃了 passphrase 并将 randomData 视为你的密钥。在这种情况下,你拥有了所谓的一次性密码本。


(1) 好吧,假设randomData已经“足够随机”了……暂时先忽略这个问题…… (2) 你真的看过我的“代码”吗?randomData.length = theKey.length,而theKey.length > data.length。 (3) 好的,我可以每次重新生成randomData。 (4) 我在帖子中写道:“在磁盘上,我们只存储randomData和encryptedData。每次都会要求用户输入密码。” - ItalyPaleAle
@Qualcuno: (1) 只有加密强度的随机数才足够用于密码学。*(2)* 很好,你需要确保每次 key.Length >= data.Length。*(4)* 你需要将 randomData 视为你的密钥。也就是说,要完全保密,不要将其与加密数据一起存储。而且你需要完全放弃口令:如果你想要任何安全性的话,将口令合并到密钥中是不可行的。 - LukeH
即使密钥并非真正等于随机数据,而是派生自它呢?当然,这时一切都取决于密码的安全性... - ItalyPaleAle
@Qualcuno:这实际上取决于密钥是如何从“randomData”派生的,但在您的情况下,派生算法非常薄弱:我怀疑一个半靠谱的攻击者如果可以使用“randomData”,那么很容易解密数据(假设口令本身不是至少与明文一样长的加密强度随机流!) - LukeH
我明白了。谢谢你。不使用这个的话,我们就说今天我学到了很多新东西吧! - ItalyPaleAle

5

不,这是不安全的。

如果随机数据存储在加密数据旁边,那么它等同于用密码短语进行异或操作:这是因为攻击者可以简单地将加密数据与随机数据进行异或运算,并获得明文异或密码短语作为结果。


2

不,这是不安全的。使用随机数据和密码进行异或运算是完全错误的。一次性密码加密需要随机数据与要加密的数据长度相同。


1
嗯,你说得对。不管怎样,它们不再是随机的,因为你正在将其与一系列非随机数据的重复短序列进行异或运算。我认为您可以使用类似的技术来破解维吉尼亚密码(http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher#cite_note-0)。无论如何,@delnan的评论很好。请听从他的建议。 - Heisenbug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接