Шифрование RSA в c # с использованием экспоненты, модуля и базы в качестве параметров - PullRequest
1 голос
/ 15 октября 2010

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

Мне нужно иметь возможность реплицировать эту функцию в приложении ac #, которое общается с проприетарным приложением.Я не уверен, с чего начать - и был бы признателен за любую помощь, которую вы можете оказать.

Это то, что у меня есть в данный момент;

public class Cryptography
{
    public static RSACryptoServiceProvider rsa;

    public static void AssignParameter()
    {
        const int PROVIDER_RSA_FULL = 1;
        const string CONTAINER_NAME = "SpiderContainer";
        CspParameters cspParams;
        cspParams = new CspParameters(PROVIDER_RSA_FULL);
        cspParams.KeyContainerName = CONTAINER_NAME;
        //cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
        cspParams.ProviderName = "Microsoft Strong Cryptographic Provider";
        rsa = new RSACryptoServiceProvider(cspParams);
    }

    public static string Sencrypt(string input)
    {

        RSAParameters parameters = new RSAParameters();
        parameters.Modulus = System.Text.Encoding.Unicode.GetBytes("nononomonomnomfoononmo");
        parameters.Exponent = System.Text.Encoding.Unicode.GetBytes("b");
        rsa.ImportParameters(parameters);

        byte[] plainbytes = System.Text.Encoding.UTF8.GetBytes(input);
        byte[] cipherbytes = rsa.Encrypt(plainbytes, false);

        System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
        //return enc.GetString(cipherbytes);
        return Convert.ToBase64String(cipherbytes);

    }
} 

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

Я не знаю, как поступить.

edit;Он возвращает новую строку при каждом запуске.Используя ту же строку ввода.

Ответы [ 2 ]

1 голос
/ 17 октября 2010

Если я правильно понимаю ваш вопрос, GregS верен.Есть много способов, которыми программа может кодировать ключи и шифровать текст.К сожалению, если у вас нет спецификации протокола или формата файла, который использует расширение, вам придется перепроектировать его.

Вы прокомментировали тот факт, что программа каждый раз возвращает новую строкузапустить.Это свойство RSA и фактически любого примитива шифрования с открытым ключом.Детерминированные алгоритмы (т. Е. Неслучайные алгоритмы, которые всегда возвращают один и тот же вывод при одних и тех же входных данных) не могут использоваться в качестве примитивов шифрования с открытым ключом, поскольку они будут уязвимы для атак с использованием открытого текста.

edit: импликациязаключается в том, что ваш подход шифрования открытого текста и сравнения результата с выходными данными модуля не будет работать.Вместо этого, как только вы считаете, что нашли выход RSA, который выдает модуль расширения, попробуйте расшифровать его.

0 голосов
/ 15 октября 2010

Ваша инициализация параметра немного странная.Вы уверены, что получите правильный результат в виде модуля (ниже представления байта)?

6E006F006E006F006E006F006D006F006E006F006D006E006F006D0066006F006F006E006F006E006F006E006D 1006 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100 * 100

Я думаю, что они не правы из-за специфики кодировки Unicode.Вы можете просто набрать опечатку и захотите использовать System.Text.Encoding. UTF8 .GetBytes.

Результат для модуля будет намного лучше:

6E6F6E6F6E6F6D6F6E6F6D6E6F6D666F6F6E6F6E6D6F

, но в общем случае я предлагаю использовать ключевую часть вместо клавиши U для кодировки Base64 или U вместо ключа Base64 для U-U вместо ключа Base64 вместо U-8 строк.

Также вы не указываете используемый размер ключа.Это 1024 как по умолчанию?

Итак, я предлагаю попробовать использовать UTF8 и проверить размер ключа.Надеюсь, это будет полезно.

Может быть, эта ссылка будет вам интересна Все о RSAParameters

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