Шифрование и дешифрование строки в C # .net 3.5 - PullRequest
1 голос
/ 05 марта 2019

Я знаю, что есть несколько вопросов, связанных с этим, однако большинство ответов предоставляют решения для .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.

1 Ответ

0 голосов
/ 05 марта 2019

Ответ, который я получил, потребовал пересмотра моего кода, но он работает:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...