繁体   English   中英

在C#.net 3.5中加密和解密字符串

[英]Encrypt and Decrypt String in C# .net 3.5

我知道有与此相关的几个问题,但是大多数答案都为.net 4.0及更高版本提供了解决方案。 对于我的用途,我必须以.net 3.5为目标。 我正在寻找简单地加密和解密字符串以存储在文件中的问题,该文本不是敏感的用户/个人信息。

我到目前为止的代码是

public static string EncryptString(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 };
        MemoryStream memoryStream = new MemoryStream ();
        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 DecryptString(this string text)
{
    string result = null;
    if ( !String.IsNullOrEmpty ( text ) )
    {
        byte [] encryptedBytes = Encoding.Unicode.GetBytes ( text );
        SymmetricAlgorithm symmetricAlgorithm = DES.Create ();
        symmetricAlgorithm.Key = new byte [8] { 1, 2, 3, 4, 5, 6, 7, 8 };
        MemoryStream memoryStream = new MemoryStream ( encryptedBytes );
        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;
}

加密有效,但是尝试解密时会收到以下错误消息:

CryptographicException: Bad PKCS7 padding. Invalid length 0.

我想出的答案需要对我的代码进行全面检查,但是可以,并且是:

public static string EncryptString(this string text, string passPhrase)
{
    string result = null;
    if(!String.IsNullOrEmpty(text))
    {
        byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
        byte [] plainTextBytes = Encoding.UTF8.GetBytes ( text );
        PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
        byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
        RijndaelManaged symmetricKey = new RijndaelManaged ();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform encryptor = symmetricKey.CreateEncryptor ( keyBytes, initVectorBytes );
        MemoryStream memoryStream = new MemoryStream ();
        CryptoStream cryptoStream = new CryptoStream ( memoryStream, encryptor,  CryptoStreamMode.Write );
        cryptoStream.Write ( plainTextBytes, 0, plainTextBytes.Length );
        cryptoStream.FlushFinalBlock ();
        byte [] cipherTextBytes = memoryStream.ToArray ();
        memoryStream.Close ();
        cryptoStream.Close ();
        result = Convert.ToBase64String ( cipherTextBytes );
    }
    return result;
}

public static string DecryptString(this string text, string passPhrase)
{
    string result = null;
    if ( !String.IsNullOrEmpty ( text ) )
    {
        byte [] initVectorBytes = Encoding.UTF8.GetBytes ( m_InitVector );
        byte [] cipherTextBytes = Convert.FromBase64String ( text );
        PasswordDeriveBytes password = new PasswordDeriveBytes ( passPhrase, null );
        byte [] keyBytes = password.GetBytes ( m_Keysize / 8 );
        RijndaelManaged symmetricKey = new RijndaelManaged ();
        symmetricKey.Mode = CipherMode.CBC;
        ICryptoTransform decryptor = symmetricKey.CreateDecryptor ( keyBytes, initVectorBytes );
        MemoryStream memoryStream = new MemoryStream ( cipherTextBytes );
        CryptoStream 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 ();
        result = Encoding.UTF8.GetString ( plainTextBytes, 0, decryptedByteCount );
    }
    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM