解密加密文本

Decrypt an encrypted text

我的 Windows 表单应用程序中有一个文本框和一个 'decrypt' 按钮,我在其中放置了一个加密字符串并尝试对其进行解密,但问题是这个。首先,我从这个网站上的一个人那里得到了这个名为 DataEncryptor 的 class 代码:

public class DataEncryptor
{
    TripleDESCryptoServiceProvider symm;

    #region Factory
    public DataEncryptor()
    {
        this.symm = new TripleDESCryptoServiceProvider();
        this.symm.Padding = PaddingMode.PKCS7;
    }
    public DataEncryptor(TripleDESCryptoServiceProvider keys)
    {
        this.symm = keys;
    }

    public DataEncryptor(byte[] key, byte[] iv)
    {
        this.symm = new TripleDESCryptoServiceProvider();
        this.symm.Padding = PaddingMode.PKCS7;
        this.symm.Key = key;
        this.symm.IV = iv;
    }

    #endregion

    #region Properties
    public TripleDESCryptoServiceProvider Algorithm
    {
        get { return symm; }
        set { symm = value; }
    }
    public byte[] Key
    {
        get { return symm.Key; }
        set { symm.Key = value; }
    }
    public byte[] IV
    {
        get { return symm.IV; }
        set { symm.IV = value; }
    }

    #endregion

    #region Crypto

    public byte[] Encrypt(byte[] data) { return Encrypt(data, data.Length); }
    public byte[] Encrypt(byte[] data, int length)
    {
        try
        {
            // Create a MemoryStream.
            var ms = new MemoryStream();

            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            var cs = new CryptoStream(ms,
                symm.CreateEncryptor(symm.Key, symm.IV),
                CryptoStreamMode.Write);

            // Write the byte array to the crypto stream and flush it.
            cs.Write(data, 0, length);
            cs.FlushFinalBlock();

            // Get an array of bytes from the 
            // MemoryStream that holds the 
            // encrypted data.
            byte[] ret = ms.ToArray();

            // Close the streams.
            cs.Close();
            ms.Close();

            // Return the encrypted buffer.
            return ret;
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine("A cryptographic error occured: {0}", ex.Message);
        }
        return null;
    }

    public string EncryptString(string text)
    {
        return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(text)));
    }

    public byte[] Decrypt(byte[] data) { return Decrypt(data, data.Length); }
    public byte[] Decrypt(byte[] data, int length)
    {
        try
        {
            // Create a new MemoryStream using the passed 
            // array of encrypted data.
            MemoryStream ms = new MemoryStream(data);

            // Create a CryptoStream using the MemoryStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cs = new CryptoStream(ms,
                symm.CreateDecryptor(symm.Key, symm.IV),
                CryptoStreamMode.Read);

            // Create buffer to hold the decrypted data.
            byte[] result = new byte[length];

            // Read the decrypted data out of the crypto stream
            // and place it into the temporary buffer.
            cs.Read(result, 0, result.Length);
            return result;
        }
        catch (CryptographicException ex)
        {
            Console.WriteLine("A cryptographic error occured: {0}", ex.Message);
        }
        return null;
    }

    public string DecryptString(string data)
    {
        return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(data))).TrimEnd('[=10=]');
    }

    #endregion

}

他给出了它的用法:

string message="A very secret message here.";
DataEncryptor keys=new DataEncryptor();
string encr=keys.EncryptString(message);

// later
string actual=keys.DecryptString(encr);

我复制了他的代码并进行了加解密工作:

//my code
private void proceedED(string data)
{
    DataEncryptor key = new DataEncryptor();
    string encr = key.EncryptString(data);
    string actual = key.DecryptString(encr);
    encryptedLabel.Text = encr;
    decryptedLabel.Text = actual;     
}

然后我创建了一个这样的方法:

private void proceedDecrypt(string data) 
{
    DataEncryptor key = new DataEncryptor();
    string decr = key.DecryptString(data);
    decryptedData.Text = decr;
}

问题是我提交的时候崩溃了,不知道为什么。 我认为它应该是一个真正的加密字符串,因为它只是一个普通的字符串。 我该如何解决这个问题?

您正在两个函数中创建新对象;

DataEncryptor key = new DataEncryptor();

这就是你错误的原因。

只需申报即可;

   DataEncryptor key = new DataEncryptor();

在你的 proceedED() 和 proceedDecrypt() 之外,我的意思是让它成为 public。

或者您可以将密钥作为参数传递给 proceedDecrypt() 并在该函数中使用它。

喜欢;

DataEncryptor key = new DataEncryptor();

private void proceedED(string data)
{
  string encr = key.EncryptString(data);
  string actual = key.DecryptString(encr);
  encryptedLabel.Text = encr;
  decryptedLabel.Text = actual; 
  proceedDecrypt(encr);    
}

private void proceedDecrypt(string data) 
{

    string decr = key.DecryptString(data);
    decryptedData.Text = decr;
}

希望对您有所帮助..!!!

可以用System.Security.Cryptography加解密

1) Set encryption decription key
2) Encrypt data with encryption key
3) Decrypt data with same encryption key

请参考下面link的加密和解密示例。 Encryption/Decryption Function in .NET using the TripleDESCryptoServiceProvider Class

DataEncryptor 的每个实例都会生成新密钥。您需要使用加密字符串的相同密钥才能解密。如果这是在同一过程中完成的,则保留对 DataEncryptor key 的引用。否则,您需要使用 DataEncryptor(byte[] key, byte[] iv) 构造函数进行初始化。

尝试这样的代码:

class Program
{
    static void Main(string[] args)
    {
        string key, iv;

        var plain="A very secret message.";
        var cipher=EncryptString(plain, out key, out iv);

        // Later ...

        var message=DecryptString(cipher, key, iv);
    }

    public static string EncryptString(string plain, out string key, out string iv)
    {
        var crypto=new DataEncryptor();
        iv=Convert.ToBase64String(crypto.IV);
        key=Convert.ToBase64String(crypto.Key);
        return crypto.EncryptString(plain);
    }

    public static string DecryptString(string cipher, string key, string iv)
    {
        var crypto=new DataEncryptor(
            Convert.FromBase64String(key), 
            Convert.FromBase64String(iv));

        return crypto.DecryptString(cipher);
    }
}

好吧我终于解决了...

我从 https://social.msdn.microsoft.com/Forums/vstudio/en-US/d6a2836a-d587-4068-8630-94f4fb2a2aeb/encrypt-and-decrypt-a-string-in-c?forum=csharpgeneral

复制了这段代码
    static readonly string PasswordHash = "P@@Sw0rd";
    static readonly string SaltKey = "S@LT&KEY";
    static readonly string VIKey = "@1B2c3D4e5F6g7H8";

    public static string Encrypt(string plainText)
    {
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
        var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));

        byte[] cipherTextBytes;

        using (var memoryStream = new MemoryStream())
        {
            using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
            {
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                cryptoStream.FlushFinalBlock();
                cipherTextBytes = memoryStream.ToArray();
                cryptoStream.Close();
            }
            memoryStream.Close();
        }
        return Convert.ToBase64String(cipherTextBytes);
    }
    public static string Decrypt(string encryptedText)
    {
        byte[] cipherTextBytes = Convert.FromBase64String(encryptedText);
        byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
        var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };

        var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
        var memoryStream = new MemoryStream(cipherTextBytes);
        var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
        byte[] plainTextBytes = new byte[cipherTextBytes.Length];

        int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
        memoryStream.Close();
        cryptoStream.Close();
        return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("[=10=]".ToCharArray());
    }

并删除了 DataEncryptor class