我希望安全地加密一串文本,并且每次都使加密字符串不同,但始终能够解密。
例如,如果我在两个单独的时间加密文本“FooBar”,我希望每次加密的字符串看起来不同,我将如何解决这个问题?
此外,我可以使用哪种最安全的加密方式?
我想尽可能使用带有.Net的C#,但我是一个完全加密的noob!
由于
答案 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。