2008-11-19 2 views
2

Я использую RSACryptoServiceProvider в .NET 2, и кажется, что частная часть пары «Открытый/Закрытый ключ» всегда содержит общедоступную часть.Имеет ли RSA закрытый ключ всегда открытый ключ, или это просто .NET?

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

ответ

7

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

Возможно, вы действительно хотите подписаться. Используя те же классы .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

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

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

8

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

Другая сторона открытого ключа:

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

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

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

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

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

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

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

Другой вечеринка закрытый ключ:

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

Смежные вопросы