Security 这是一种加密吗;“安全”吗;?

Security 这是一种加密吗;“安全”吗;?,security,encryption,cryptography,Security,Encryption,Cryptography,首先,我必须说我从来没有学过密码学,关于这个话题我所知道的只是一些基本的概念 我们正在寻找一种使用密码对某些数据(存储到数据库中)进行加密的快速简便方法。 我知道“最安全”的算法是AES,但它对我们来说可能太复杂了,我知道它需要我们从美国政府获得授权,等等 我们考虑过这个(简单的)算法,它提醒我(但我可能错了)一种“一次性键盘”。 (它不是用任何特定的语言写的……只是想法:)) //我们需要加密的字符串 string data=“hello world”; //第一次需要加密时将生成的随机字节的

首先,我必须说我从来没有学过密码学,关于这个话题我所知道的只是一些基本的概念

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

我们考虑过这个(简单的)算法,它提醒我(但我可能错了)一种“一次性键盘”。 (它不是用任何特定的语言写的……只是想法:))

//我们需要加密的字符串
string data=“hello world”;
//第一次需要加密时将生成的随机字节的长字符串
string randomData=“aajdfskjefafdsgsdewrbhf”;
//用户选择的密码短语
字符串密码短语=“foo”;
//让我们使用randomData XOR密码短语生成加密密钥(重复这个)
字符串theKey=“”;
j=0;
对于(i=0;i=data.length)
字符串encryptedData=“”;
对于(i=0;i
在磁盘上,我们将只存储randomData和encryptedData。 每次都会向用户询问密码短语

这样的算法有多安全? 除了使用蛮力,还有其他方法可以破解吗?我不认为统计分析能解决这个问题,是吗? 它是否“像”一次性垫子一样安全


谢谢大家!

这是非常弱的。统计分析一眨眼就可以搞定它。一些勤奋的笔墨猜测可能也会很快破解它


唯一的例外情况是:(1)
randomData
取自真正的加密强度源,(2)
randomData
至少与您的明文数据一样长,(3)
randomData
从未用于不同的消息,以及(4)您完全删除了
密码短语
,并将
随机数据
作为密钥。在这种情况下,您将拥有一个一次性的pad。

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

不,它不安全。以这种方式对随机数据和密码使用xor是完全错误的。
一次性pad密码需要随机数据与要加密的数据长度相同

不,这不安全


如果随机数据与加密数据一起存储,那么它就相当于使用密码短语进行XOR:这是因为攻击者可以简单地将加密数据与随机数据进行XOR,并获得明文XOR密码短语

规则1:不要发明你自己的加密算法(或者加密散列)。经过大量的工作,经验丰富的密码学家大约每十年会发现一两种实用且非常好的加密算法。单是统计数字就表明,你想出的每件事都注定是糟糕透顶的。你是对的。我并不是假装发明了最安全的算法:)只是问我的想法对非敏感数据是否有好处。这会很糟糕。如果你想找到并修复最明显的(对专家来说)缺陷,你需要花相当多的时间来研究和创建更多的算法。这浪费了很多时间,而且还不能保证。你应该简单地使用现有的东西。要么数据是如此不敏感,以至于您可以省略加密,要么您应该正确地进行加密。如果你想学习一些密码学,请不要尝试任何远程敏感到足以被考虑用于加密的东西。关于这一点,我听过很多不同的观点。许多人告诉我们,无论何时使用任何AES函数,都需要授权,即使您正在链接开源或系统库。我们发现(这里是StackOverflow)有人说,当应用程序通过https与web服务器通信时,也需要权限!查看中的注释4。只要任何程序的主要目的是加密数据并将其存储在数据库中,而不是维护数据库,我想你应该没问题。(1)好吧,假设随机数据“足够随机”。。。让我们暂时忽略这个问题。。。(2) 你真的看过我的“密码”吗?randomData.length=key.length,即>data.length。(3) 好的,我每次都可以重新生成随机数据(4)我在帖子中写道:“在磁盘上,我们将只存储随机数据和加密数据。每次都会向用户询问密码短语。”@Qualcuno:(1)只有加密强度随机才足以进行加密。(2) 公平地说,您需要确保每次key.Length>=data.Length。(4) 您需要将
randomData
视为密钥。即,完全保密,不要将其与加密数据一起存储。而且你需要彻底抛弃密码短语:如果你想要任何安全的外表,那么以这种方式将密码短语合并到你的密钥中是不可能的。(4)即使密钥实际上并不等于随机数据,而是从它派生出来的?当然,那么一切都取决于密码的安全性…@Qualcuno:这确实取决于密钥是如何从
randomData
中派生出来的,但在您的情况下,派生算法非常弱:我怀疑一个拥有
randomData
的半正派攻击者可以相当容易地解密数据(假设密码本身不是加密强度的随机流,至少没有明文那么长!)我明白了。谢谢你。不要以任何方式使用它,那么:让我们说我今天学到了很多新东西!嗯……是的,你是对的……无论如何,密码不再是随机的,因为你正在用一个重复的密码对它进行异或运算
// 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];
}