а также

ьно плохо знаком с C # и в настоящее время возникают проблемы с расшифровкой длинных паролей с ошибкой

Указанный ключ не является допустимым размером для этого алгоритма

Я знаю, что это как-то связано с тем, что длина зашифрованных паролей не поддерживается, но я не знаю, как поступить с предлагаемыми способами разрешить использование этих более длинных паролей.

Вот мой зашифровать и расшифровать

"cipherKey": "0123456789abcdef", "cipherVector": "somereallycooliv"

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

namespace DataApi
{
public class Encryption
{
    private readonly IConfigurationService _configService;


    private const string _vector = "cipherVector";
    private const string _key = "cipherKey";

    public Encryption(IConfigurationService configService)
    {
        _configService = configService;
    }
    public string EncryptString(string text)
    {
        if(string.IsNullOrEmpty(text))
        {
            return "";
        }
        try
        {

      var key = Encoding.UTF8.GetBytes(_configService.Get(_key));
        byte[] IV = Encoding.ASCII.GetBytes(_configService.Get(_vector));

        using (var aesAlg = Aes.Create())
        {
            using (var encryptor = aesAlg.CreateEncryptor(key, IV))
            {
                using (var msEncrypt = new MemoryStream())
                {
                    using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    using (var swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(text);
                    }

                    var decryptedContent = msEncrypt.ToArray();

                    var result = new byte[IV.Length + decryptedContent.Length];

                    Buffer.BlockCopy(IV, 0, result, 0, IV.Length);
                    Buffer.BlockCopy(decryptedContent, 0, result, IV.Length, decryptedContent.Length);

                    return Convert.ToBase64String(result);
                }
            }
        }
        }
        catch(Exception e) {
             Loggifer.Error("Unable to encrypt string: "+text , e );

            throw e;
        }
    }

    public string DecryptString(string cipherText)
    {
        if(string.IsNullOrEmpty(cipherText))
        {
            return "";
        }
        try
        {
            var fullCipher = Convert.FromBase64String(cipherText);

            byte[] IV = Encoding.ASCII.GetBytes(_configService.Get(_vector));
            var cipher = new byte[16];

            Buffer.BlockCopy(fullCipher, 0, IV, 0, IV.Length);
            Buffer.BlockCopy(fullCipher, IV.Length, cipher, 0, IV.Length);
            var key = Encoding.UTF8.GetBytes(_configService.Get(_key));

            using (var aesAlg = Aes.Create())
            {
                using (var decryptor = aesAlg.CreateDecryptor(key, IV))
                {
                    string result;
                    using (var msDecrypt = new MemoryStream(cipher))
                    {
                        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (var srDecrypt = new StreamReader(csDecrypt))
                            {
                                result = srDecrypt.ReadToEnd();
                            }
                        }
                    }

                    return result;
                }
            }
        }
        catch (Exception e)
        {
            Loggifer.Error("Unable to decrypt string: "+cipherText , e );
            throw e;
        }
    }

}
}
 bartonjs03 окт. 2017 г., 00:40
cipher должно бытьnew byte[fullCipher.Length - IV.Length], Вы, вероятно, пропускаете конечные блоки в ваших данных.
 Narf03 окт. 2017 г., 14:12
Если это пользовательские пароли, которые вы шифруете, просто выбросьте этот код, потому что вы не должны этого делать. Пароли пользователей должны бытьхешированное, это другое дело.

Ответы на вопрос(1)

Решение Вопроса

Два изменения требуются в функцииpublic string DecryptString(string cipherText)

 var cipher = new byte[fullCipher.Length - IV.Length];

а также

 Buffer.BlockCopy(fullCipher, IV.Length, cipher, 0, fullCipher.Length - IV.Length);

Ваш ответ на вопрос