【问题标题】:How would I do some simple file encryption and decryption?我将如何做一些简单的文件加密和解密?
【发布时间】:2010-12-01 18:51:23
【问题描述】:

我有一个 .NET 应用程序。我需要将加密的文本值存储在文件中,然后在代码中的其他位置检索加密值,然后对其进行解密。

我不需要世界上最强大或最安全的加密方法,只要说一下就够了 - 我有加密的值,并且能够解密它

我在网上进行了很多搜索以尝试使用密码学,但我发现的大多数示例都没有明确定义概念,最糟糕的是它们似乎是特定于机器的。

基本上,有人可以发送一个易于使用的加密方法的链接,该方法可以将字符串值加密到文件中,然后检索这些值。

【问题讨论】:

  • “我不需要世界上最强或最安全的加密方法”——那为什么要加密呢?如果您不使用强加密并且信息具有价值,则很有可能有人解密它。
  • 这就像您在询问在您的建筑物中放置什么安全系统,但您并没有告诉我们建筑物中有什么有价值的东西。银行的安全系统与大使馆的安全系统非常不同。在我们知道什么受到保护以及受到什么威胁之前,我们不能推荐加密算法。在决定对问题进行加密之前,请描述您正在保护的资源以及您担心的威胁;加密可能不是正确的解决方案。 ACL 可能是正确的解决方案,或其他一些安全技术。
  • 另外,不要忘记使加密安全的是密钥的安全性。 您将如何进行安全密钥管理? 这是难题。相比之下,使用现成的加密算法很容易。

标签: c# encryption


【解决方案1】:

StackOverflow 的扩展库有两个不错的小扩展,用于使用 RSA 加密和解密字符串。我自己使用过几次 here 主题,但还没有真正测试过,但它一个 StackOverflow 扩展库,所以我认为它已经过测试并且稳定。

加密:

public static string Encrypt(this string stringToEncrypt, string key)
{
    if (string.IsNullOrEmpty(stringToEncrypt))
    {
        throw new ArgumentException("An empty string value cannot be encrypted.");
    }

    if (string.IsNullOrEmpty(key))
    {
        throw new ArgumentException("Cannot encrypt using an empty key. Please supply an encryption key.");
    }

    System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters();
    cspp.KeyContainerName = key;

    System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;

    byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

    return BitConverter.ToString(bytes);
}

解密:

public static string Decrypt(this string stringToDecrypt, string key)
{
    string result = null;

    if (string.IsNullOrEmpty(stringToDecrypt))
    {
        throw new ArgumentException("An empty string value cannot be encrypted.");
    }

    if (string.IsNullOrEmpty(key))
    {
        throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key.");
    }

    try
    {
        System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters();
        cspp.KeyContainerName = key;

        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp);
        rsa.PersistKeyInCsp = true;

        string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None);
        byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber))));

        byte[] bytes = rsa.Decrypt(decryptByteArray, true);

        result = System.Text.UTF8Encoding.UTF8.GetString(bytes);
    }
    finally
    {
        // no need for further processing
    }

    return result;
}

【讨论】:

  • 正是我正在寻找的答案,有效且不太复杂的东西。我将以此作为参考,以了解有关 RSA 的更多信息。再次感谢 Tiax
  • 对于短字符串可以,但对于超过 86 个字符的输入字符串会失败。一般来说,RSA 不太适合处理大量数据。
【解决方案2】:

如果您正在考虑进行对称加密,那么我会考虑使用Enterprise Library Cryptography Application Block。 David Hayden had a useful blog post about it,虽然它适用于 Enterprise Library 2.0(目前是 4.1),但我想你还是有用的。

【讨论】:

  • 谢谢理查德,你以前用过吗?
  • 是的——它很容易使用,配置工具也很简单。我基本上在部署加密应用程序块中描述的场景中使用-msdn.microsoft.com/en-us/library/dd203351.aspx
  • @Richard,忙着按照博客中的示例进行操作,然后进入这一点...s637.photobucket.com/albums/uu91/mleppan/…,这是否意味着如果我在本地开发机器上创建一个加密文件,我无法在托管的网络服务器上解密?
  • 不,这是让您保护共享密钥的机制。配置工具允许您将该密钥导出到另一台机器。部署部分提供了有关如何共享此密钥的详细信息-msdn.microsoft.com/en-us/library/dd203351.aspx
【解决方案3】:

在 .NET 中,您可以使用 SymmetricAlgorithm 的实例。在 Stack Overflow 上有 a question that demonstrates how to encrypt and decrypt strings using a password。您将如何处理密码是另一回事,但我认为您并不太关心这一点,只是想“隐藏”一些文本以防窥探。

【讨论】:

    【解决方案4】:

    这是一篇使用 .NET 附带的加密库进行对称加密/解密的博文。

    对称算法使用相同的密钥进行加密和解密,就像您使用一把钥匙锁定和解锁车门一样。

    公钥算法会使用一个密钥进行加密,另一个进行解密,因此,我可以向您发送一个已加密的文件,并且知道只有您可以解密它,因为您的密钥非常安全和私密。

    http://blog.binaryocean.com/2006/01/08/NETSymmetricEncryption.aspx

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 2017-12-20
      • 2014-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2012-01-25
      相关资源
      最近更新 更多