C # RSA Проблема расшифровки - PullRequest
       10

C # RSA Проблема расшифровки

0 голосов
/ 01 октября 2009

У меня есть эта функция, которую я использую для расшифровки значений, которая отлично работает на моем компьютере разработчика. Но при запуске в производство на другом сервере - выдает это точное сообщение об ошибке:

Система не может найти указанный файл.

Вот функция:

 public static string Decrypt(string stringToDecrypt, string key)
    {
        string result = null;

        if (string.IsNullOrEmpty(stringToDecrypt))
        {
            throw new ArgumentException("An empty string value cannot be encrypted.");
        }

        if (string.IsNullOrEmpty(key))
        {
            throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key.");
        }

        try
        {
            System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters();
            cspp.KeyContainerName = key;

            System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp);
            rsa.PersistKeyInCsp = true;

            string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None);
            byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber))));


            byte[] bytes = rsa.Decrypt(decryptByteArray, true);

            result = System.Text.UTF8Encoding.UTF8.GetString(bytes);

        }
        finally
        {
            // no need for further processing
        }

        return result;
    }

Обновление

Ребята, я изначально пошел по этому пути, потому что после нескольких часов поиска я получил ответ на stackoverflow, что этот метод шифрования / дешифрования работает исключительно со строками и не требует импорта / экспорта ключей.

Итак .... Теперь мне не хватает ключевого файла? Как это возможно, я даже не создал файл ключа.

Ответы [ 5 ]

2 голосов
/ 01 октября 2009

Если вам нужно скопировать ключ с одного компьютера на другой, вам придется экспортировать его из контейнера ключей. Мы обнаружили, что методы rsaCryptoServiceProvider.ImportCspBlob и ExportCspBlob прекрасно работают для этого; Вы получаете однобайтовый массив, который вы можете затем Convert.ToBase64String и Convert.FromBase64String.

Конечно, это должен быть экспортируемый ключ (или, что еще лучше, экспортировать только открытый ключ, что и предназначено для PKC, поэтому один конец имеет закрытый ключ, а другой - только открытый ключ). Неэкспортируемый ключ может экспортировать только свой открытый ключ. Как только вы запустите систему, вы можете создать новый неэкспортируемый ключ, в котором вам нужен личный ключ, и экспортировать открытый ключ, чтобы передать его любому, кому еще нужно шифровать этот единственный получатель.

Кроме того, вы должны убедиться, что Dispose провайдер крипто, когда вы закончите (очевидно, Clear() не достаточно хорош). Для этого полезно использовать оператор using, если вы используете его в одной локальной области или вы можете сделать это в своем блоке finally. Обратите внимание, что он реализует IDisposable в явном виде, поэтому вы должны привести его к IDisposable несколько неловко, чтобы сделать это в отдельной инструкции. using оператор обрабатывает само приведение, так что это проще.

2 голосов
/ 01 октября 2009

Обратите внимание, что вы используете параметр key не как шифр, а как имя для контейнера. Это зависит от функции шифрования, ранее сохранившей ключ. Не подходит для передачи зашифрованных данных между компьютерами. Если только вы не передадите ключи.

1 голос
/ 01 октября 2009

Используйте FileMon с Sysinternals.com, чтобы увидеть, какой файл он ищет?

Я предполагаю, что cspp.KeyContainerName = key; соответствующая строка.

0 голосов
/ 01 октября 2009

Проблема может заключаться в том, что объект RSA пытается создать CryptoContainer в профиле пользователя.
Вы можете попробовать добавить это:

rsa.UseMachineKeyStore = true;
0 голосов
/ 01 октября 2009

Хорошо, вы установили ключ в контейнере с именем key в провайдере шифрования на сервере? См. Как: использовать инструменты управления сертификатами X.509 .

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

После вашего Обновления

Криптография RSA основана на ассиметричном ключе. Вы шифруете с открытым ключом, адресат расшифровывает с помощью закрытого ключа. Ключи предоставляются заранее, пункт назначения генерирует или получает пару ключей и сохраняет личную часть для себя и рекламирует открытую часть для других. Обычно ключи упаковываются как сертификаты X509, поскольку при этом используется вся инфраструктура доверия вокруг сертификатов (подписи, доверенные органы, назначение сертификата и т. Д. И т. Д.). В этом случае пункт назначения сообщения должен запросить сертификат для целей шифрования у доверенного органа (например, Verisign) и т. Д. И т. Д. Или использовать самозаверяющий сертификат (makecert.exe) и установить доверие с помощью некоторых внешних методов (т. Е. . телефонный звонок для проверки хэша сертификата или IssuerName / SerialNumber).

Криптография RSa очень далека от "просто строк". Ближе к «просто строкам» находится криптография с симметричным ключом (AES, DES, XDES, RC4), где у вашего приложения есть секретный ключ, используемый как для шифрования, так и для дешифрования.

Теперь, если вы действительно не знаете , что вы делаете, держитесь подальше от криптографии, используйте готовый протокол, такой как SSL / TLS (онлайн) или S -MIME (в автономном режиме). Более того, используйте некоторые средства инфраструктуры, такие как CryptoStream или ProtectedData . Не создавайте еще одно псевдокодирование на основе советов групп новостей от людей, которых вы никогда не встречали ...

...