Всегда ли закрытый ключ RSA содержит открытый ключ или это просто .NET? - PullRequest
2 голосов
/ 19 ноября 2008

Я использую RSACryptoServiceProvider в .NET 2, и кажется, что частная часть пары открытого и закрытого ключей также всегда содержит открытую часть.

Мне нужно зашифровать некоторую информацию, используя мой открытый ключ, и разрешить другой стороне ТОЛЬКО УДАЛИТЬ то, что я зашифровал. Я не хочу, чтобы они знали, как я зашифровал свое сообщение. Возможно ли это с помощью RSACryptoServiceProvider в .NET?

Ответы [ 3 ]

9 голосов
/ 19 ноября 2008

Как использовать:

Открытый ключ другой стороны :

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

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

Ваш личный ключ :

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

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

Ваш собственный открытый ключ :

Вы не используете свой собственный открытый ключ. Другая сторона использует его для проверки ваших подписей и шифрования сообщений только для ваших глаз.

Закрытый ключ другой стороны :

У вас этого нет.

8 голосов
/ 19 ноября 2008

Закрытый ключ всегда включает открытый ключ.

То, что вы действительно хотите, это Подписание. Используя те же классы .NET, вы можете подписывать данные своим закрытым ключом и проверять подпись на стороне другой стороны с открытым ключом (который, очевидно, не содержит закрытого ключа).

    public static string Sign(string data, string privateAndPublicKey)
    {
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        RSACryptoServiceProvider provider = CreateProviderFromKey(privateAndPublicKey);
        byte[] signatureBytes = provider.SignData(dataBytes, "SHA1");
        return Convert.ToBase64String(signatureBytes);
    }

    public static bool Verify(string data, string signature, string publicKey)
    {
        byte[] dataBytes = Encoding.UTF8.GetBytes(data);
        byte[] signatureBytes = Convert.FromBase64String(signature);
        RSACryptoServiceProvider provider = CreateProviderFromKey(publicKey);
        return provider.VerifyData(dataBytes, "SHA1", signatureBytes);
    }

    private static RSACryptoServiceProvider CreateProviderFromKey(string key)
    {
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        provider.FromXmlString(key);
        return provider;
    }
2 голосов
/ 19 ноября 2008

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

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

...