cTransform.TransformFinalBlock всегда возвращает пустую строку? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть простая подпрограмма шифрования / дешифрования, которая работает как приложение в приложениях форм Windows, но всегда возвращает пустую строку в приложении asp.net.

Код для шифрования и дешифрования выглядит следующим образом:

   /// <summary>
/// Encrypt a string using dual encryption method. Return a encrypted cipher Text
/// </summary>
/// <param name="toEncrypt">string to be encrypted</param>
/// <param name="useHashing">use hashing? send to for extra secirity</param>
/// <returns></returns>
public static string Encrypt(string toEncrypt, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

    System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
    // Get the key from config file
    string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
    //System.Windows.Forms.MessageBox.Show(key);
    if(useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
    {
        Key = keyArray,
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };

    ICryptoTransform cTransform = tdes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    tdes.Clear();
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

/// <summary>
/// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
/// </summary>
/// <param name="cipherString">encrypted string</param>
/// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
/// <returns></returns>
public static string Decrypt(string cipherString, bool useHashing)
{
    byte[] keyArray;
    byte[] toEncryptArray = Convert.FromBase64String(cipherString);

    System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
    //Get your key from config file to open the lock!
    string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

    if(useHashing)
    {
        MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
        keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
        hashmd5.Clear();
    }
    else
        keyArray = UTF8Encoding.UTF8.GetBytes(key);

    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
    {
        Key = keyArray,
        Mode = CipherMode.ECB,
        Padding = PaddingMode.PKCS7
    };

    ICryptoTransform cTransform = tdes.CreateDecryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

    tdes.Clear();
    return UTF8Encoding.UTF8.GetString(resultArray);
}

Я перешагнул код расшифровки, и все вроде нормально, пока я не дошел до строки:

byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

ToEncryptArray содержит значения 8 байтов, но когда он преобразуется в resultArrayон всегда заканчивается массивом нулевых байтов?

В моем классе есть следующие слова:

using System.Security.Cryptography;
using System.Text;
using System.Configuration;

В моем файле Web.config эта строка находится в appSettingsраздел:

<add key="SecurityKey" value="SomeRandomTextToMakeAKey" />

Кто-нибудь может увидеть, что мне не хватает?

Грэм Сивилл

1 Ответ

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

Вы просто зашифровали ноль байтов.Это расширяется за счет режима заполнения (PKCS # 7) до восьми байтов, поскольку PKCS # 7 всегда пэдов.В противном случае он не сможет различить дешифрованный открытый текст, который заканчивается 01 открытым 7-байтовым открытым текстом и байтом заполнения.

Поэтому, если во время дешифрования для заполнения не задано заполнение (PaddingMode.None), тогдавы, вероятно, получите обратно 8 (заполнение) байтов со значением 08.Обратите внимание, что вам нужно будет просмотреть это как шестнадцатеричное, поскольку эти байты представляют Backspace в ASCII.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...