如何在C#中加密和解密字符串

问题描述 投票:0回答:6

我想使用一种算法对 C# 中的字符串进行加密和解密,该算法可以得到相同的加密字符串。例如,如果我加密一个字符串122ujhdheiwe,结果是uoi8asdf8asdf,如果我再次加密相同的字符串122ujhdheiwe,它会引导我到uoi8asdf8asdf字符串。我可以使用哪些可能的加密算法以及如何使用?

c# encryption
6个回答
2
投票

我这里有一个简单的解决方案:

http://remy.supertext.ch/2011/01/simple-c-encryption-and-decryption/

基本上它的工作原理是这样的:

DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] Key = { 12, 13, 14, 15, 16, 17, 18, 19 };
byte[] IV =  { 12, 13, 14, 15, 16, 17, 18, 19 };

ICryptoTransform encryptor = des.CreateEncryptor(Key, IV);

byte[] IDToBytes = ASCIIEncoding.ASCII.GetBytes(source);
byte[] encryptedID = encryptor.TransformFinalBlock(IDToBytes, 0, IDToBytes.Length);
return Convert.ToBase64String(encryptedID);

然后反过来。


1
投票

rot13(凯撒)也许?它将所有字符移动偏移量 13。因此,应用它两次,您将再次获得纯文本。


1
投票

如果您想要一个简单的解决方案,可以使用

ProtectedData
类:

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

private void example()
{
    string data = "122ujhdheiwe";

    // Encrypt
    UnicodeEncoding unicodeEncoding = new UnicodeEncoding();
    byte[] secret = ProtectedData.Protect(unicodeEncoding.GetBytes(data), null, DataProtectionScope.CurrentUser);
    Console.WriteLine(BitConverter.ToString(secret));

    // If you need it as a printable string, you can convert the binary to Base64
    string base64 = Convert.ToBase64String(secret);
    Console.WriteLine(base64);

    // Back to binary...
    byte[] backagain = Convert.FromBase64String(base64);

    // Decrypt
    byte[] clearbytes = ProtectedData.Unprotect(backagain, null, DataProtectionScope.CurrentUser);
    string roundtripped = unicodeEncoding.GetString(clearbytes);
    Console.WriteLine(roundtripped);
}

参见。 受保护的数据类

如果您希望加密数据看起来非常像原始数据,如问题中的示例(122ujhdheiwe ==> uoi8asdf8asdf),那么您正在寻找的是格式保留加密 - cf。这里,我没有例子。

编辑:我刚刚注意到,在您的问题中,您写道您希望能够再次加密相同的字符串并获得相同的加密结果,在这种情况下,ProtectedData 将不起作用,因为加密中使用的密钥会随着时间的推移而改变.


1
投票

enter image description here

我编写了一个演示程序,需要源代码吗? 我正在使用这个命名空间

using System.Security.Cryptography;

还有两个这个

        public string encryptus(string x, string encrypt)//function
    {
        try
        {

            string y = x;
            byte[] etext = UTF8Encoding.UTF8.GetBytes(y);
            string Code = encrypt;
            MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
            byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(Code));
            TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
            tds.Key = keyarray;
            tds.Mode = CipherMode.ECB;
            tds.Padding = PaddingMode.PKCS7;

            ICryptoTransform itransform = tds.CreateEncryptor();
            byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
            string encryptresult = Convert.ToBase64String(result);
            return encryptresult.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }
        public string dencryptus(string x, string keyai)
    {
        try
        {
            string y = x.Replace("\0", null);
            byte[] etext = Convert.FromBase64String(y);
            string key = keyai;
            MD5CryptoServiceProvider mdhash = new MD5CryptoServiceProvider();
            byte[] keyarray = mdhash.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            TripleDESCryptoServiceProvider tds = new TripleDESCryptoServiceProvider();
            tds.Key = keyarray;
            tds.Mode = CipherMode.ECB;
            tds.Padding = PaddingMode.PKCS7;

            ICryptoTransform itransform = tds.CreateDecryptor();
            byte[] result = itransform.TransformFinalBlock(etext, 0, etext.Length);
            string dencryptresult = UTF8Encoding.UTF8.GetString(result);
            return dencryptresult.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

并像这样使用它们:

Encrypted.Text = encryptus(Message.Text, EncryptCode.Text.ToString());
Decrypted.Text = dencryptus(Message.Text, EncryptCode.Text.ToString());

0
投票

这个答案包含我准备使用的加密类三重设计

.NET:在我的项目 .setting 文件中解密密码的选项有哪些

只需创建新的类库,复制/粘贴此代码,然后使用它:)


0
投票

.NET 7 更新

死灵魔法...

我只是想为任何正在寻找简单加密的人提供一个简单的复制粘贴:

public static class AesConverter
{     
    public static string Encrypt(string clearText)
    {
        var inputBytes = Encoding.Unicode.GetBytes(clearText);
        var outputBytes = AesConvert(inputBytes, aes => aes.CreateEncryptor());
        return Convert.ToBase64String(outputBytes);
    }

    public static string Decrypt(string cipherText)
    {
        var inputBytes = Convert.FromBase64String(cipherText.Replace(" ", "+"));
        var outputBytes = AesConvert(inputBytes, aes => aes.CreateDecryptor());
        return Encoding.Unicode.GetString(outputBytes);
    }

    private static byte[] AesConvert(byte[] inputBytes, Func<Aes, ICryptoTransform> convert)
    {
        using var aes = Aes.Create();
        var key = "populateThisFromAppSettings";
        var salt = new byte[] { 0x52, 0x79, 0x61, 0x6e, 0x20, 0x4e, 0x61, 0x63, 0x61, 0x72, 0x61, 0x74, 0x6f };
        var derivedBytes = new Rfc2898DeriveBytes(key, salt, 1000, HashAlgorithmName.SHA1);
        aes.Key = derivedBytes.GetBytes(32);
        aes.IV = derivedBytes.GetBytes(16);
        using var ms = new MemoryStream();
        using var cs = new CryptoStream(ms, convert(aes), CryptoStreamMode.Write);
        cs.Write(inputBytes, 0, inputBytes.Length);
        cs.Close();
        return ms.ToArray();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.