Как можно зашифровать контент с помощью RSA для Chilkat в C # и расшифровать его в Java? - PullRequest
0 голосов
/ 01 ноября 2019

ОБНОВЛЕНИЕ

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

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


ПРЕДПОСЫЛКИ

Я написалПриложение C #, которое использует библиотеку RSA Chilkat для получения содержимого и шифрования его с помощью личного закрытого ключа.

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

Теперь я нашел сторонний веб-сайт (и многие из них , а не , кстати), который позволяет дешифровать контент с помощью открытого ключа RSA (https://www.devglan.com/online-tools/rsa-encryption-decryption).

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

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

const string originalContent = "This !s original c0nt3nt";

var rsa = new Chilkat.Rsa();
rsa.GenerateKey(2048);

var encryptedBytes = rsa.EncryptBytes(Encoding.UTF8.GetBytes(originalContent), true);
var encryptedEncodedString = Convert.ToBase64String(encryptedBytes);
Console.WriteLine($"Encrypted:{Environment.NewLine}{encryptedEncodedString}");
Console.WriteLine();

var privateKeyBytes = rsa.ExportPrivateKeyObj().GetPkcs8();
var privateKeyEncodedString = Convert.ToBase64String(privateKeyBytes);
Console.WriteLine($"Private Key:{Environment.NewLine}{privateKeyEncodedString}");
Console.WriteLine();

var publicKeyBytes = rsa.ExportPublicKeyObj().GetDer(false);
var publicKeyEncodedString = Convert.ToBase64String(publicKeyBytes);
Console.WriteLine($"Public Key:{Environment.NewLine}{publicKeyEncodedString}");
Console.WriteLine();

var decyptedContentBytes = rsa.DecryptBytes(encryptedBytes, false);
var decryptedContentString = Encoding.UTF8.GetString(decyptedContentBytes);
Console.WriteLine($"Decrypted:{Environment.NewLine}{decryptedContentString}");
Console.WriteLine();

Console.WriteLine("Press ENTER to quit");
Console.ReadLine();

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

Пример: Console output

Вот примерзначения из окна консоли:

Зашифрованное содержимое

H5JTsGhune1n3WWSPjwVJuUwp70Hsh1Ojaa0NFCVyq0qMjVPMxnknexOG/+HZDrIYsZM7EnPulpmihJk4QyLM8T2KNQIhbWuMHvzgHYlcPJdXpGZhAxwfklL4HP0iRUUXJBsJcS/2XoUDZ6elUoMIFY9cDB4O+WFxKS/5vzLEukTLbQ3aEBNg3xaf9fg12F8LcMxZ3GDsk0W9b6oJci09NTxXd6KKes0RM1hnOhw6bu0U33ZLF3sa0nH9Kdf8w23PoKc/tl12Jsa8N1A4OjaT5910UF8FRH6OkAbNKnxqXcL7+V4HVuHchi3ghuFivAW57boLeHr7OG7wOEC/gfPOw==

PRIVATE KEY

MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC8xYcNXckXf1X4Kd6qE5c7pddfWdKo71mcwZWskuaq+wq3FTcCTAedo/Vcx8Vxn+RMn5XE7QCDzcAAN0K/BzQsoU81myRzZ+bKP+TJ5HH0jClCUMj+ideEm0fay873jnbG0hKEOJPVxPWwKq3jvDLLmWrdgvd/UiDStDm286SFKfMlLWkSw8YIc5nXsthAgP0hv8Nj7UDKvTEG5o3boTuhG1JQARCEXP0fTdIiv0cEFlSN3KkgF4KDf32Vt2x57N/+PJXpQvcECkLwPpBAq/aM0qbtgeiILxavfBJRwQ5zXDUmZHepvSjK6KIYQsTavQQLDXnFKuXa2fxOJHIlys6pAgMBAAECggEBAI0ZMBtDkL2phj7aPP7vaclB6rvwzc9MKLVM1W2K2DPRNW8nwlhLMB4aoZnaELEfjGvhlPb/F7VtIyiGJbPX1J3PbP9qmVJRxWZDX+WwhaT+5xAUhkgMDDWoQ4s9b9QGfq2Z9BE0oPvWHraxEAz7bRRV9lTgQdK/Np2H7OPdNYn6SW8qVgAukgTBqVno4VDbC34bJwal0e63oBFFfensWlhPtDUQB/uQX7UiRfEkxL+CNuqVLDoAeXWmSVWOPlDTKVu1y1bzfA+WMOKHm1ndq21I07TUPf9FcgYdKf4yKpWvMfVeDev6Oo/2mlac+vrJO571S+h4a5m79jUhCeJwX4kCgYEA7q5hrNtMbErA6dgEOG+KpFTaeqbknwtcykVApEvHt4LKULedAvwkORu65acKFYkxbMt19Fx7ligGxg0yOQRWX1BXK1XOCo9eYOjvOVlbRqBywLIbegehoZQ0LoSsdRcOvFq7EbMV3BaxCmxgpnrCZ75VaCYUMzylIduPWKeT9xcCgYEAyngNIIgsXfpCI+HHILNpprFfS2JBBGPx8N/d9cXahKCJhxrMe8K64CSMyxTwum5DXjJnbE4QBsoowRZTCEF6JUBagRM/pQrVX/CK//oyUUaa5+1S/0OxlUevXR7TD6gcpGNEdPjruc+gZzhfKFuWh+V9mJQUviqm3RjAcEdHAD8CgYBL0kOfGM8vO5QK9R9qGiztxTLecbQAvihM7TD6wEQCjN7eQ2Xyc8zCA4gcujKe4sU7rWqcJODxs2drdPe2WyVhA/GdB5X7js3JdVXBXxx61C9//VRzMIds/9qPyH/MdnWs6hmxJrXUA7Vb/U+6sxacxD73ZdlW6XX/ynLAFAQSIwKBgQCk4i12j87p3ZMdW5HprJJeoNYFMwfVxnrSec1tiGoTVhWJxCZAp22+eaV7ARumB4OvY4bcKZpdnSahUEfgUkphqc3Kjd1nz7HCxsa7/YoarFAcjiXoIb2t30oNoLurZXGl4f1u8QQvNsnfJYZA/I1TMG4e4oEd+OgY6D5XcYR9ywKBgGdaZmoBieiw0NkbijjgQZ0WILDmrIYdsSp4HMp6XDeVvdMb/qYg2jTnvVyqMSb8NdfCOB0GT19r1isQX9RnUgxPikJbVLj8WjAQjHT28mtmRn+Ju/3KT75RJ/LHY3SySNMOgTW75X2u8v0ELdEiiOmc/vTkCYoS/oqp92ELjT1Y

PUBLICКЛЮЧ

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvMWHDV3JF39V+CneqhOXO6XXX1nSqO9ZnMGVrJLmqvsKtxU3AkwHnaP1XMfFcZ/kTJ+VxO0Ag83AADdCvwc0LKFPNZskc2fmyj/kyeRx9IwpQlDI/onXhJtH2svO9452xtIShDiT1cT1sCqt47wyy5lq3YL3f1Ig0rQ5tvOkhSnzJS1pEsPGCHOZ17LYQID9Ib/DY+1Ayr0xBuaN26E7oRtSUAEQhFz9H03SIr9HBBZUjdypIBeCg399lbdseezf/jyV6UL3BApC8D6QQKv2jNKm7YHoiC8Wr3wSUcEOc1w1JmR3qb0oyuiiGELE2r0ECw15xSrl2tn8TiRyJcrOqQIDAQAB

ПУТЬ РАЗРЕШЕНИЯ НА ПУБЛИЧНЫЙ КЛЮЧ ВЕБ-САЙТА

Теперь, когда я захожу на сайт (упомянутый выше), я вставляю зашифрованный контент в зашифрованный текст контентаblock, и я вставляю свой открытый ключ, сгенерированный в текстовом блоке под ним, и устанавливаю тип ключа RSA на Public Key. Но это не удается.

My attempt to let the website decrypt my encrypted content


ВТОРАЯ ПОПЫТКА

Но ...

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

Have the website test to make sure my keys are working by encrypting and decrypting content


ЧТО Я ЗАМЕЧАЛ

Итак, я началчитая то, что должен был предложить веб-сайт, и автор страницы опубликовал объяснение того, как этого добиться (https://www.devglan.com/java8/rsa-encryption-decryption-java), который использует библиотеки Java RSA под капотом. По-видимому, есть два шифра Java RSA, которые можно использовать«RSA» и «RSA / ECB / PKCS1Padding».

Я не очень знаком с библиотеками Java и знаю достаточно криптографии, чтобы знать, как добиться цели, но есть много технических аспектовМне все еще неясно, как помочь мне понять, куда идти дальше.


ВОПРОС

Мой вопрос, есть ли в Chilkat что-то, что мне нужно настроить так, чтобыон может зашифровать контент, который позволил бы дешифровать приложение Java (например, ссылку на сайт, размещенную выше)? (конечно, Chilkat тоже должен уметь его расшифровывать)

1 Ответ

0 голосов
/ 02 ноября 2019

Я собираюсь (надеюсь) ответить на этот вопрос только после прочтения 1-й части. Я дошел до того, что вы написали «... Я беру строку и шифрую ее закрытым ключом ...», и это поднимает красный флаг.

Шифрование с открытым ключом должно осуществляться там, где вы шифруете с использованием открытого ключа получателя. Закрытый ключ используется для расшифровки. Точка шифрования заключается в том, что только предполагаемый получатель может расшифровать и просмотреть сообщение. С помощью пар открытого и закрытого ключей вы можете предоставить свой открытый ключ кому угодно, но у вас есть личный ключ. Поэтому любой может использовать ваш открытый ключ для шифрования сообщения, предназначенного для вас, но вы единственный, кто может расшифровать. Это имеет смысл.

Подписание противоположно: вы используете свой закрытый ключ для подписи, и любой может проверить, используя ваш открытый ключ. Подпись может дополнительно содержать подписанные данные, так что акт проверки подписи также извлекает исходные данные. Таким образом, вы проверяете, что (1) данные могли быть подписаны только владельцем закрытого ключа, (2) данные не были изменены, и (3) вы восстанавливаете исходные данные.

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

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

Или ... вместо этого вы можете создать «непрозрачную подпись» с помощью Chilkat, которая является подписью, содержащей данные,а затем найдите онлайн-инструмент devglan для проверки / извлечения данных из подписи PKCS7 (если инструмент devglan существует). Таким образом, вы можете сохранить свой закрытый ключ и передать открытый ключ получателю.

Наконец ... мне кажется, что вы действительно рассматриваете открытый / закрытый ключ как общий секрет, т.е. как секретделится только между отправителем и получателем. В таком случае зачем вообще использовать RSA? (Помните, что RSA предназначен только для шифрования / дешифрования небольших объемов данных. Максимальное количество байтов, которое вы можете зашифровать, равно размеру ключа минус некоторые издержки. Поэтому, если у вас есть 2048-битный ключ, то вы можете максимально шифровать 2048 /8 байтов минус издержки, используемые при заполнении, порядка 20 байтов или около того.) Если семантически у вас есть только общий секрет, то вы можете упростить и использовать симметричное шифрование (AES), где секретный ключ - это просто случайная группабайтов, и у вас нет предела размера данных.

...