真的没有一个好的加密周。让我解释一下我需要什么。
安全性不一定非常强大,我的代码也是混淆的。
我只想要一个可移植的解决方案。我已经尝试了RSA,在发现生产中缺少某个密钥文件之后,它让我无处可去,这些我一无所知,无法在开发机器上找到它。
请帮忙。
答案 0 :(得分:3)
以下是我使用的一些代码(从网上的源代码改编而来),它完全依赖于在setup.s下的web.config / app.config中存储的密码。它使用三重des。
/// <summary>
/// Encrypts the string.
/// </summary>
/// <param name="text">The text.</param>
/// <returns>Encrypted string</returns>
public string EncryptString(string text)
{
// Locals
var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
byte[] results;
var utf8 = new UTF8Encoding();
// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below
var hashProvider = new MD5CryptoServiceProvider();
var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));
// Step 2. Create a new TripleDESCryptoServiceProvider object
// Step 3. Setup the encoder
var tdesAlgorithm = new TripleDESCryptoServiceProvider
{
Key = tdesKey,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
// Step 4. Convert the input string to a byte[]
var dataToEncrypt = utf8.GetBytes(text);
// Step 5. Attempt to encrypt the string
try
{
var encryptor = tdesAlgorithm.CreateEncryptor();
results = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
tdesAlgorithm.Clear();
hashProvider.Clear();
}
// Step 6. Return the encrypted string as a base64 encoded string
return Convert.ToBase64String(results);
}
/// <summary>
/// Decrypts the string.
/// </summary>
/// <param name="text">The text.</param>
/// <returns>Decrypted string</returns>
public string DecryptString(string text)
{
// Locals
var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
byte[] results;
var utf8 = new UTF8Encoding();
// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below
var hashProvider = new MD5CryptoServiceProvider();
var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));
// Step 2. Create a new TripleDESCryptoServiceProvider object
// Step 3. Setup the decoder
var tdesAlgorithm = new TripleDESCryptoServiceProvider
{
Key = tdesKey,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
// Step 4. Convert the input string to a byte[]
var dataToDecrypt = Convert.FromBase64String(text);
// Step 5. Attempt to decrypt the string
try
{
var decryptor = tdesAlgorithm.CreateDecryptor();
results = decryptor.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
tdesAlgorithm.Clear();
hashProvider.Clear();
}
// Step 6. Return the decrypted string in UTF8 format
return utf8.GetString(results);
}
原始来源位于:http://www.dijksterhuis.org/encrypting-decrypting-string/
答案 1 :(得分:2)
您无法在应用程序中存储机密。期。如果奖品有价值,某人会找到您的密钥。在这个时代,一旦足够。 Google会为有兴趣找到该密钥的任何人提供答案。一旦密钥泄露,它就会影响到每个人的数据,无处不在。
您的秘密(密钥)必须来自外部(例如,用户提供的密码,配置的证书和密钥,密钥交换协议)。
如果您坚持将密钥存储在应用程序中,从而提供最低级别的数据混淆(不受特权保护),则使用CryptoStream和对称密钥算法,如{{3}处的基于Rijndael的示例用硬编码键。但是你必须要知道这不是混淆。
答案 2 :(得分:1)
你有没有看过Bouncy Castle API?
答案 3 :(得分:1)
从埃里克的反应来看,听起来你可能会比你更复杂;或者在没有必要时尝试非对称加密?
对于您所描述的加密类型,您实际上只需要将一些参数传递给加密和解密方法即可完成任务。
从CodeProject查看this example。它以简单的方式使用Rijndael算法,甚至包括用于读/写文件的代码。
答案 4 :(得分:1)
如果您在创建密钥时遇到问题请尝试CrypTool,这是了解密码学时非常有用的工具。