RSA
Коллеги! Не надо гадать на кофейной гуще. В Википедии всё доходчиво написано.
Зашифровываем одним ключом, расшифровываем другим. Иначе бы цифровая подпись по схеме Эль-Гамаля была бы невозможна.
Зашифровываем только одним, расшифровываем только другим. Какой из них открытый, а какой секретный, зависит только от поставленной задачи. Основная тонкость RSA -- генерация сильных ключей (далеко не каждый формально подходящий ключ является стойким).
Можно поискать GnuPG или LibTomCrypt. Там, в числе прочих, есть RSA (правда, на C++).
PS. А если мы сообщение не расшифровываем, а дешифруем -- значит, мы служим в ФСБ, ибо дешифрование, по А. П. Алфёрову, -- процесс получения исходного текста из шифртекста при неизвестном нам ключе расшифрования.
нет. Открытым (они) - шифруют, закрытым - (ты) расшифровываешь. Это классическое шифрование. Открытым (ты) - шифруешь, закрытым - (они) расшифровывают - это ЭЦП. Только здесь сам смысл меняется, и то что я в последнем случае назвал открытым, на самом деле становится закрытым (ибо ты не хочешь чтоб кто-либо имел возможность сделать тоже самое - зашифровать), и наоборот.
:) я и не гадал. В википедию лень было лезть и было маааленькое сомнение что я RSA с чем-то другим путаю
Примерно тем же способом работает обмен ключами для создания защищённого канала. Мы с Васей Пупкиным обмениваемся открытыми ключами для зашифрования, потом с помощью полученных открытых ключей зашифровываем свои секретные (которые применяются для расшифрования) и обмениваемся зашифрованными секретными ключами. Дальше Вася Пупкин своим секретным ключом расшифровывает мой, а я своим -- Васин. Вуаля! Как расшифровать защищённый трафик, знают только двое: я и Вася Пупкин.
Это, конечно, упрощённо. В реальной жизни нужна ещё и сертификация ключей.
1) Оба ключа могут зашифровать данные
2) Только приватный может их дешифровать.
Из этого следует что приватный имеет возможность выполнять обе операции
Вот пример кода:
textBox1.Text - публичный ключ
textBox2.Text - приватный ключ
rsa.FromXmlString(textBox1.Text);
byte[] data = new byte[] { 1, 3, 5 };
byte[] cr = rsa.Encrypt(data, false);
rsa.FromXmlString(textBox2.Text);
byte[] ret = rsa.Decrypt(cr, false);
Это работает, но
rsa.FromXmlString(textBox2.Text);
byte[] data = new byte[] { 1, 3, 5 };
byte[] cr = rsa.Encrypt(data, false);
rsa.FromXmlString(textBox1.Text);
byte[] ret = rsa.Decrypt(cr, false);
уже не работает,. Вылетает еррор: плохой ключ.
Если кому надо, код генерации ключей:
textBox1.Text = rsa.ToXmlString(false);
textBox2.Text = rsa.ToXmlString(true);
Есть такой алгоритм: DSA, который позволяет закрытым ключём создать цифровую подпись к данным, а проверить можна любым. RSA не для этого. Я думаю, что эту тему можна закрыть. Спасибо за содействие.
Если кому надо, код генерации ключей:
пригодилось. По нему используя MSDN мы можем увидеть оплошность:
textBox1.Text - публичный ключ
textBox2.Text - приватный ключ
[QUOTE=MSDN]
true to include a public and private RSA key; false to include only the public key
[/QUOTE]
так что во втором случае далеко не только прив. ключ. Незнаю как вы это по XML не заметили.
- закрытый (приватный) ключ используется для подписания (ЭЦП) и расшифровки (шифрование)
- открытый (публичный) ключ используется для проверки (ЭЦП) и шифрования
т.о. утверждения о смене ролей ключей в соотв. алгоритме считать неверными.