Различные хэш-коды для CryptoStream, когда проект используется в другом проекте - PullRequest
0 голосов
/ 19 июня 2020

Существует следующая функция decrpytion, показанная в проекте .dll.

private static string Decrypt(string val)
    {
        byte[] cryIV = { 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50 };
        byte[] cryKey;
        byte[] crystr = Convert.FromBase64String(val);
        byte[] decstr = new byte[crystr.Length - 1];
        RijndaelManaged rijndael = new RijndaelManaged();
        RijndaelManaged cryRdm = new RijndaelManaged();
        MemoryStream ms = new MemoryStream(crystr);
        ICryptoTransform cryTrD;

        cryKey = Encoding.UTF8.GetBytes("abc".GetHashCode().ToString());
        cryTrD = cryRdm.CreateDecryptor(cryKey, cryIV);

        CryptoStream cs = new CryptoStream(ms, cryTrD, CryptoStreamMode.Read);

        try
        {
            cs.Read(decstr, 0, decstr.Length);
        }
        catch (CryptographicException exc)
        {
            throw exc;
        }



        ms.Close();
        cs.Close();

        return ((string)Encoding.UTF8.GetString(decstr)).Replace("\0", string.Empty);

    }

Функция отлично работает как часть основного проекта, но когда я использую .dll в другом проекте, функция выдает ошибку Padding is invalid and cannot be removed.

Я сузил его до строки

cryKey = Encoding.UTF8.GetBytes("abc".GetHashCode().ToString());

, которая возвращает разные значения в зависимости от проекта ссылки.

Как я могу это сделать, когда .dll используется во втором проекте?

Я пытался установить crKey на значения, которые назначаются, когда функция работает , например:

cryIV = { 50, 50, 50, 50, 50, 50, 50, 50 };

, но это тоже не сработало.

Я также мог воспроизвести поведение на втором компьютере.

Я использую Visual Studio 2019. Я Думаю, что проблема могла быть вызвана разными настройками проекта, поскольку код отлично работает с одной и той же .dll, если вызывается из одного проекта.

1 Ответ

1 голос
/ 19 июня 2020

Проверьте уведомление об использовании GetHashCode() в строках в разделе «Примечания»:

Важно

Если два строковые объекты равны, метод GetHashCode возвращает идентичные значения. Однако не существует уникального значения кода ha sh для каждого уникального строкового значения. Различные строки могут возвращать один и тот же код ha sh.

Сам код ha sh не гарантирует стабильности. Коды Ha sh для одинаковых строк могут различаться в разных реализациях. NET, в версиях. NET и в платформах. NET (например, 32-разрядных и 64-разрядных) для одной версии. NET. В некоторых случаях они могут даже различаться в зависимости от домена приложения. Это означает, что два последующих запуска одной и той же программы могут возвращать разные коды ha sh.

В результате коды ha sh никогда не должны использоваться вне домена приложения, в котором они были созданы, они никогда не должны использоваться в качестве ключевых полей в коллекции, и они никогда не должны сохраняться.

Наконец, не используйте код ha sh вместо значения, возвращаемого хеш-функцией cryptographi c, если вам нужен криптостойкий ha sh. Для криптографических хэшей c используйте класс, производный от класса System.Security.Cryptography.HashAlgorithm или System.Security.Cryptography.KeyedHashAlgorithm.

Для получения дополнительных сведений о кодах ha sh см. Object.GetHashCode .

Это именно то, что вы используете в "abc".GetHashCode().ToString(). Используйте указанные классы для генерации ключа.

...