首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用C#和SymmetricAlgorithm实现真正简单的加密

使用C#和SymmetricAlgorithm实现真正简单的加密
EN

Stack Overflow用户
提问于 2012-01-27 17:56:59
回答 3查看 94K关注 0票数 35

我正在寻找一种非常简单的加密/解密方法。我将始终使用相同的静态密钥。我意识到了这种方法的风险。目前,我正在使用以下代码,但在加密和解密相同的字符串后,它不会生成相同的结果(字符串中间有一些垃圾)。

public static string Crypt(this string text)
{
    string result = null;

    if (!String.IsNullOrEmpty(text))
    {
        byte[] plaintextBytes = Encoding.Unicode.GetBytes(text);

        SymmetricAlgorithm symmetricAlgorithm = DES.Create();
        symmetricAlgorithm.Key = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8};
        using (MemoryStream memoryStream = new MemoryStream())
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cryptoStream.Write(plaintextBytes, 0, plaintextBytes.Length);
            }

            result = Encoding.Unicode.GetString(memoryStream.ToArray());
        }
    }

    return result;
}

public static string Decrypt(this string text)
{
    string result = null;

    if (!String.IsNullOrEmpty(text))
    {
        byte[] encryptedBytes = Encoding.Unicode.GetBytes(text);

        SymmetricAlgorithm symmetricAlgorithm = DES.Create();
        symmetricAlgorithm.Key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
        using (MemoryStream memoryStream = new MemoryStream(encryptedBytes))
        {
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, symmetricAlgorithm.CreateDecryptor(), CryptoStreamMode.Read))
            {
                byte[] decryptedBytes = new byte[encryptedBytes.Length];
                cryptoStream.Read(decryptedBytes, 0, decryptedBytes.Length);
                result = Encoding.Unicode.GetString(decryptedBytes);
            }
        }
    }

    return result;
}

我可以改变任何需要的东西,没有限制(但我希望只有一个方法来加密,另一个方法来解密,而不需要在它们之间共享变量)。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-27 21:54:00

如果你不想自己处理密钥,那就让操作系统来处理你的。例如,使用Windows Data Protection (DPAPI)。

您可以使用以下命令编写自己的System.Security.Cryptography.ProtectedData.ProtectUnprotect方法的string-based版本:

public static string Crypt (this string text)
{
    return Convert.ToBase64String (
        ProtectedData.Protect (
            Encoding.Unicode.GetBytes (text) ) );
}

public static string Decrypt (this string text)
{
    return Encoding.Unicode.GetString (
        ProtectedData.Unprotect (
             Convert.FromBase64String (text) ) );
}
票数 64
EN

Stack Overflow用户

发布于 2012-01-27 18:27:21

像这样怎么样?

代码

using System;
using System.Security.Cryptography;
using System.Text;

public static class StringUtil
{
    private static byte[] key = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8};
    private static byte[] iv = new byte[8] {1, 2, 3, 4, 5, 6, 7, 8};

    public static string Crypt(this string text)
    {
        SymmetricAlgorithm algorithm = DES.Create();
        ICryptoTransform transform = algorithm.CreateEncryptor(key, iv);
        byte[] inputbuffer = Encoding.Unicode.GetBytes(text);
        byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return Convert.ToBase64String(outputBuffer);
    }

    public static string Decrypt(this string text)
    {
        SymmetricAlgorithm algorithm = DES.Create();
        ICryptoTransform transform = algorithm.CreateDecryptor(key, iv);
        byte[] inputbuffer = Convert.FromBase64String(text);
        byte[] outputBuffer = transform.TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return Encoding.Unicode.GetString(outputBuffer);
    }
}

单元测试

[Test]
public void Test()
{
    string expected = "this is my test string";
    string a = expected.Crypt();
    Debug.WriteLine(a);
    string actual = a.Decrypt();
    Assert.AreEqual(expected, actual);
}

编辑:

澄清一下:我知道这不是一个好的做法。

“我知道这种方法的风险。”

Iv'e假设OP也知道,在考虑在生产环境中使用任何类似的东西之前,会进行相关的代码更改。

这个问题强调简单而不是良好的实践。

票数 53
EN

Stack Overflow用户

发布于 2012-01-27 18:03:38

您需要将密码模式设置为CipherMode.ECB或使用IV。

SymmetricAlgorithm symmetricAlgorithm = DES.Create();
symmetricAlgorithm.Key = new byte[8] { 1, 2, 3, 4, 5, 6, 7, 8 };
symmetricAlgorithm.Mode = CipherMode.ECB;
...

另一点是不要使用Unicode编码。请改用Base64。Unicode可能会“破坏”非UTF-16的字节。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9031537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档