none
Не могу расшифровать Недопустимая длина строки или массива знаков Base-64. RRS feed

  • Общие обсуждения


  • При передачи строковой переменной в метод расшифровки строки выпадает ошибка

    HomeController.cs
    public ActionResult ConfirMail(string code)
            {
    string @Decrypt = Crypt.Decrypt(code, "Jhgdsj&78^ccc");
    Ошибка в этом методе вида: Недопустимая длина строки или массива знаков Base-64.
    Ругается Convert.FromBase64String(data)
    Crypt.cs
     static public string Decrypt(string data, string password)
            {
    CryptoStream cs = InternalDecrypt(Convert.FromBase64String(data), password);
                StreamReader sr = new StreamReader(cs);
                return sr.ReadToEnd();
            }
    однако если Crypt.Decrypt("зашифрованная_строка", передать строку все расшифровывает

    20 февраля 2015 г. 15:21

Все ответы

  • Тогда получается у вас входная строка неверно приходит. Возможно придётся её декодить. Ну или она обрезается. Ситуация такая при передаче строки наружу она портится у клиента, если используется обычный формат. Предлагаю использовать такой формат для передачи данных:

    internal static class HexEncoding
    {
        public static string GetString(byte[] data)
        {
            var results = new StringBuilder();
            foreach (byte b in data)
            {
                results.Append(b.ToString("X2"));
            }
    
            return results.ToString();
        }
    
        public static byte[] GetBytes(string data)
        {
            // GetString encodes the hex-numbers with two digits
            var results = new byte[data.Length / 2];
            
            for (int i = 0; i < data.Length; i += 2)
            {
                results[i / 2] = Convert.ToByte(data.Substring(i, 2), 16);
            }
    
            return results;
        }
    }
    


    Сделаем содержимое сообщества лучше, вместе!

    20 февраля 2015 г. 15:26
    Модератор
  • Дальше так например:

    public string EncryptUserPasswordResetData(string clientEmailAddress, string keyFileName)
    {
        Contract.Requires<ArgumentNullException>(clientEmailAddress != null);
        Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(keyFileName));
    
        if (!File.Exists(keyFileName))
        {
            AsymmetricEncryptionUtility.GenerateKey(keyFileName);
        }
    
        string dataForEncrypt = clientEmailAddress.Trim() + "^" + DateTime.Now.AddDays(3).ToShortDateString();
    
        byte[] encryptedData = AsymmetricEncryptionUtility.EncryptData(dataForEncrypt, keyFileName);
    
        // return Convert.ToBase64String(encryptedData);
        return HexEncoding.GetString(encryptedData);
    }
    
    public PasswordResetData DecryptUserPasswordResetData(string encryptedUserPasswordResetData, string keyFileName)
    {
        Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(encryptedUserPasswordResetData));
        Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(keyFileName));
    
        // byte[] data = Convert.FromBase64String(encryptedUserPasswordResetData);
        byte[] data = HexEncoding.GetBytes(encryptedUserPasswordResetData);
        string decryptedData = AsymmetricEncryptionUtility.DecryptData(data, keyFileName);
    
        return this.ParsePasswordResetDataString(decryptedData);
    }

    Такая проблема была давно, решение моё собственное. Вам главное понять тут принцип.


    Сделаем содержимое сообщества лучше, вместе!

    • Изменено YatajgaEditor 20 февраля 2015 г. 15:30
    20 февраля 2015 г. 15:29
    Модератор
  • выполняю методы
    в code содержится это:  lml6MKYGFqFw5+nuufUyd/peOamtFrgvMO2SGAlmpNQ5f0OFJGTLi7eCgte/z0kQ 

    public ActionResult ConfirMail(string code)
            {
                var @bytes = Crypt.GetBytes(code);
                string @Strs = Crypt.GetString(@bytes);

    Падает ошибка на

    public static byte[] GetBytes(string data)
            {
                // GetString encodes the hex-numbers with two digits
                var results = new byte[data.Length / 2];
    
                for (int i = 0; i < data.Length; i += 2)
                {
                    results[i / 2] = Convert.ToByte(data.Substring(i, 2), 16); // Не удалось найти распознаваемые цифры.
                }
    
                return results;
            }

    Не удалось найти распознаваемые цифры.

        
    24 февраля 2015 г. 7:34