如何加密文本字符串,以便每次加密字符串不同,即使值相同

时间:2012-01-30 12:29:00

标签: c# .net encryption

我希望安全地加密一串文本,并且每次都使加密字符串不同,但始终能够解密。

例如,如果我在两个单独的时间加密文本“FooBar”,我希望每次加密的字符串看起来不同,我将如何解决这个问题?

此外,我可以使用哪种最安全的加密方式?

我想尽可能使用带有.Net的C#,但我是一个完全加密的noob!

由于

6 个答案:

答案 0 :(得分:10)

  

我希望安全地加密一串文本,并且每次都使加密字符串不同,但始终能够解密。

这是一个非常常见的要求。

到目前为止,每个答案都说使用salt这是不正确的,因为您知道是否阅读了维基百科页面上关于该主题的第一句话:

  

“在密码学中,盐由随机位组成,为单向函数创建一个输入。”

你想要单向功能吗?不。您刚才说您需要能够解密字符串,因此它不能是单向函数。

你想要的是initialization vector

  

“在密码学中,初始化向量是加密原语的固定大小输入,通常需要是随机的或伪随机的。随机化对于加密方案实现语义安全至关重要,这是一种重复使用方案的属性。相同的密钥不允许攻击者推断加密消息的各段之间的关系。“

你明智地指出:

  

我是一个完全加密的菜鸟!

然后不要试图自己这样做;你会弄错的。很容易误用加密来构建一个系统,noob,不会破坏。请记住,你的目标是建立一个系统,让那些对密码知之甚少的人无法破解。

另外,要求随机陌生人在互联网上寻求帮助是了解密码学真相的不好方法。大多数能够回答这个问题的人,包括我自己,只是比你更少的愚蠢。到目前为止,请查看此页面上的所有糟糕的建议。例如,两个答案建议将当前时间用作随机盐。这是完全疯狂;盐的整个无法提前预测从了解他们所谈论内容的真实专家那里获得建议。

我的建议:聘请专家来解决您的特定问题。要了解加密,请从“应用密码学”等一些介绍性文本开始,以便了解加密实际解决的问题以及如何有效地使用它。 Crypto不是你在数据上撒上的神奇小精灵粉尘,以确保其安全;它只是保护数据免受攻击的整个战略的一小部分。

答案 1 :(得分:4)

如果您希望加密不同,则每次都必须使用不同的盐。这意味着 - 对于每次加密,你都必须与它一起保存盐。

采用以下方法:

第一次,您可以按原样加密“FooBar”。我们假设它的加密等于X.

第二次,您可以使用SAME salt将“FooBar”加密为“FooBar”(注意SPACE),这将导致加密等于Y,因为这些更改在字符串中。

这意味着,您可以使用相同的salt进行解密过程,然后删除尾随空格。

对于相同(虚拟)字符串,这将导致不同的加密。

答案 2 :(得分:3)

你会想用盐来完成你所要求的。这是一个article,可以帮助您入门。

答案 3 :(得分:3)

盐是优选的,但添加一小段不同的文本就足够了:

static int count = 0;

string textToSend = ...;
string textToEncryp =  count.ToString("D4") + "." textToSend;  // prefix with "0021."
count++;

// encryp + decrypt

string decryptedText = ...;
string receivedText = decryptedText.Copy(5);  // remove "0021."

答案 4 :(得分:1)

要使用C#进行加密,请参阅:http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

如果您想存储密码,请参阅此内容。 https://stackoverflow.com/a/1054033/939213

答案 5 :(得分:-3)

您可以将DateTime.Now.Ticks用作salt。