解密/加密字符串(不是文件)最简单的方法是使用一个函数,两种方法都可能

本文关键字:方法 函数 一个 两种 文件 加密 最简单 解密 字符串 | 更新日期: 2023-09-27 18:18:09

我想加密我的程序中的短文本框或字符串(不是文件),以使其内容对人类不可读或用简单的加密加密它是安全的(如任何敏感密码等)。在Visual Basic中,有简单的五行代码可以做到这一点,当我把它复制到我的c#中时,它就不起作用了。我找不到合适的。只有一些非常困难的例子需要大量的代码,这些代码通常会抛出很多错误,需要你自己设置任何复杂的键或键对或哈希,utf编码或两者都要使它工作,但它永远不会工作。我不知道这些,我只需要一个简单的函数,可以双向加密。我在c#中找不到任何类似的东西,它可以毫无错误地工作,并且可以向前和向后完成工作。在VB中加密了c#中不存在的异或函数。

或者我如何得到下面的代码样本工作,这是最有希望的一个:它给了我很多错误,如果我复制它在我的c#在button1_click事件:

错误1:类型或命名空间定义或文件结束

错误2:类型或命名空间"TripleDESCryptoServiceProvider"找不到

错误3:"CipherMode"在当前上下文中不存在

错误4:"Getkey"在当前上下文中不存在

错误5:"PaddingMode"在当前上下文中不存在错误6:错误8类型或命名空间名称"ICryptoTransform"无法找到(您是否缺少using指令或集合引用?)

public static string Encrypt(string data)
{
    TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
    DES.Mode = CipherMode.ECB;
    DES.Key = GetKey("a1!B78s!5(");
    DES.Padding = PaddingMode.PKCS7;
    ICryptoTransform DESEncrypt = DES.CreateEncryptor();
    Byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(data);
    return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}
public static string Decrypt(string data)
{
    TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
    DES.Mode = CipherMode.ECB;
    DES.Key = GetKey("a1!B78s!5(");
    DES.Padding = PaddingMode.PKCS7;
    ICryptoTransform DESEncrypt = DES.CreateDecryptor();
    Byte[] Buffer = Convert.FromBase64String(data.Replace(" ","+"));
    return Encoding.UTF8.GetString(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}

解密/加密字符串(不是文件)最简单的方法是使用一个函数,两种方法都可能

在这里,您的方法现在将像这样工作:

public static string Encrypt(string data)
{
    using (var des = new TripleDESCryptoServiceProvider { Mode = CipherMode.ECB, Key = GetKey("a1!B78s!5(j$S1c%"), Padding = PaddingMode.PKCS7 })
    using (var desEncrypt = des.CreateEncryptor())
    {
        var buffer = Encoding.UTF8.GetBytes(data);
        return Convert.ToBase64String(desEncrypt.TransformFinalBlock(buffer, 0, buffer.Length));
    }
}
public static string Decrypt(string data)
{
    using (var des = new TripleDESCryptoServiceProvider { Mode = CipherMode.ECB, Key = GetKey("a1!B78s!5(j$S1c%"), Padding = PaddingMode.PKCS7 })
    using (var desEncrypt = des.CreateDecryptor())
    {
        var buffer = Convert.FromBase64String(data.Replace(" ", "+"));
        return Encoding.UTF8.GetString(desEncrypt.TransformFinalBlock(buffer, 0, buffer.Length));
    }
}

问题是A)无效密钥长度(我猜由于缺乏GetKey()定义-但16个字符每字符8位是最小128位三重DES)和B)获取源字符串的字节作为ASCII加密,但在解密后,使用UTF8编码。

除了我在链接问题中的答案,你还可以这样做,

public static string Obfuscate(string before)
{
    var beforeArray = Encoding.Unicode.GetBytes(before);
    var count = beforeArray.Length;
    var resultArray = new byte[count];
    var o = count % 32;
    for (var i = 0; i < count; i++)
    {
       var xor = o + 32;
       resultArray[i] = (byte)(beforeArray[i] ^ xor);
       o = ++o % 32;
    }
    return Encoding.Unicode.GetString(resultArray)
}

是字符串中字节的一个简单异或。这不是加密,但它使字符串很难被人类读取。

如果你真的想要强加密,你必须从避免TDES开始。

如果您真正想做的是屏蔽文本输入框的内容…在Windows窗体中,使用TextBox控件并将PasswordChar属性设置为一个字符。在WPF中,使用PasswordBox并可选择将PasswordChar属性设置为一个字符。

如果你真的需要加密,不要寻找捷径(自己实现,硬编码密码或密钥),因为你最终会得到一些看起来安全的东西,但实际上可以在几分钟内被知道他们在做什么的人入侵。

作为对Jesse C. Slicer给出的答案的补充,下面是"GetKey"代码:我发现它在这里

  private static byte[] GetKey(string password)
  {
     string pwd = null;
     if (Encoding.UTF8.GetByteCount(password) < 24)
     {
         pwd = password.PadRight(24, ' ');
     }
     else
     {
         pwd = password.Substring(0, 24);
     }
     return Encoding.UTF8.GetBytes(pwd);
  }

更好的是…使用AES代替3DES。对于为什么你可以在这里看到另一个SO答案的解释。

下面是我使用的一些加密/解密方法。输入和输出都是base64string。

static string EncryptStringToBase64String(string plainText, byte[] Key, byte[] IV)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("Key");
    byte[] encrypted;
    // Create an RijndaelManaged object 
    // with the specified key and IV. 
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.IV = IV;
        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
        // Create the streams used for encryption. 
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    //Write all data to the stream.
                    swEncrypt.Write(plainText);
                }
                encrypted = msEncrypt.ToArray();
            }
        }
    }
    // return encrypted bytes converted to Base64String
    return Convert.ToBase64String(encrypted);
}
static string DecryptStringFromBase64String(string cipherText, byte[] Key, byte[] IV)
{
    // Check arguments. 
    if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("cipherText");
    if (Key == null || Key.Length <= 0)
        throw new ArgumentNullException("Key");
    if (IV == null || IV.Length <= 0)
        throw new ArgumentNullException("Key");
    // Declare the string used to hold 
    // the decrypted text. 
    string plaintext = null;
    // Create an RijndaelManaged object 
    // with the specified key and IV. 
    using (RijndaelManaged rijAlg = new RijndaelManaged())
    {
        rijAlg.Key = Key;
        rijAlg.IV = IV;
        // Create a decrytor to perform the stream transform.
        ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
        // Create the streams used for decryption. 
        using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
        {
            using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                {
                    // Read the decrypted bytes from the decrypting stream 
                    // and place them in a string.
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
    }
    return plaintext;
}

这里是一些测试代码,因为我看到你在你的加密/解密中创建了你的密钥/IV。

    var inputString = "SomeText";
    var r = RijndaelManaged.Create();
    r.GenerateKey();
    r.GenerateIV();
    var key = r.Key;
    var iv = r.IV;
    var a = EncryptStringToBase64String(inputString, key, iv);
    var b = DecryptStringFromBase64String(a, key, iv);
    Assert.AreEqual(b, inputString);
    Assert.AreNotEqual(a, inputString);

使用System.Security.Cryptography;

;
public class StringCipher
{
    private const int keysize = 256;
    public static string Encrypt(string plainText)
    {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        using (PasswordDeriveBytes password = new PasswordDeriveBytes("123", null))
        {
            byte[] keyBytes = password.GetBytes(keysize / 8);
            using (RijndaelManaged symmetricKey = new RijndaelManaged())
            {
                symmetricKey.Mode = CipherMode.CBC;
                using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes))
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                        {
                            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                            cryptoStream.FlushFinalBlock();
                            byte[] cipherTextBytes = memoryStream.ToArray();
                            return Convert.ToBase64String(cipherTextBytes);
                        }
                    }
                }
            }
        }
    }
    public static string Decrypt(string cipherText)
    {
        byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
        using (PasswordDeriveBytes password = new PasswordDeriveBytes("123", null))
        {
            byte[] keyBytes = password.GetBytes(keysize / 8);
            using (RijndaelManaged symmetricKey = new RijndaelManaged())
            {
                symmetricKey.Mode = CipherMode.CBC;
                using (ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes))
                {
                    using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes))
                    {
                        using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                        {
                            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
                            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
                        }
                    }
                }
            }
        }
    }
}

}