Шифрование и дешифрование с закрытым ключом в Java

После того, как я прочитал статьи о методах криптографии (симметричных и асимметричных). Во многих статьях говорится, что закрытый ключ используется для шифрования и расшифровки данных. Открытый ключ используется для шифрования данных. Но когда я пытаюсь начать реализацию на Java, я не могу можно использовать закрытый ключ для шифрования и расшифровки данных (я использую алгоритм RSA)? Если можно, дайте ссылку. Если не поддерживает, ответьте, почему не поддерживает?

//Шифровать

Cipher encrypt=Cipher.getInstance("RSA");
encrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes());

//Расшифровать

Cipher decrypt=Cipher.getInstance("RSA");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage);

person Nadendla    schedule 23.05.2014    source источник


Ответы (3)


Чтобы выполнить шифрование RSA, вам необходимо зашифровать с помощью открытого ключа и расшифровать с помощью закрытого ключа. Кроме того, вы должны использовать четко определенный метод заполнения, такой как заполнение, совместимое с PKCS#1 v1.5, или (если доступно) заполнение OAEP.

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

Дополнительная информация здесь и здесь.

Итак, шифрование:

// specify mode and padding instead of relying on defaults (use OAEP if available!)
Cipher encrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
// init with the *public key*!
encrypt.init(Cipher.ENCRYPT_MODE, publicKey);
// encrypt with known character encoding, you should probably use hybrid cryptography instead 
byte[] encryptedMessage = encrypt.doFinal(msg.getBytes(StandardCharsets.UTF_8));

и расшифровка:

Cipher decrypt=Cipher.getInstance("RSA/ECB/PKCS1Padding");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
String decryptedMessage = new String(decrypt.doFinal(encryptedMessage), StandardCharsets.UTF_8);
person Maarten Bodewes    schedule 26.05.2014
comment
Разве криптографическая подпись не является шифрованием с закрытым ключом? - person Peter Becker; 26.05.2014
comment
@PeterBecker Лучше не думать об этом так. См. RFC 3447, часть 5.2: ... Основная математическая операция в каждом примитиве является возведением в степень, как в примитивах шифрования и дешифрования в разделе 5.1. RSASP1 и RSAVP1 такие же, как RSADP и RSAEP, за исключением имен их входных и выходных аргументов; они отличаются тем, что предназначены для разных целей. . Это верно только для учебника или необработанного RSA, который не подходит для обычных криптографических целей. Прокладка является неотъемлемой частью схемы и отличается. - person Maarten Bodewes; 26.05.2014
comment
Дело принято. На самом деле однажды я нашел сломанную криптографическую схему, в которой использовался чистый RSA (проблема номер один), а два ключа использовались неправильно. Bouncy Castle позволяет вам сделать это, а затем незаметно изменить заполнение, что в данном случае означало отсутствие рандомизации при шифровании. - person Peter Becker; 26.05.2014

Как работает шифрование с открытым закрытым ключом:

  1. ЕСЛИ вы что-то зашифруете своим закрытым ключом, любой, у кого есть ваш открытый ключ, сможет это расшифровать.
  2. ЕСЛИ вы что-то шифруете своим открытым ключом, только ваш закрытый ключ может это расшифровать.

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

Как сгенерировать пары ключей?

$ openssl genrsa -out private_key.pem 1024
$ openssl rsa -pubout -in private_key.pem -out public_key.pem

Или перейдите сюда, чтобы сделать это в java -> JAVA RSA Когда вы это сделаете вернуться и задать дополнительные вопросы

person dharr    schedule 23.05.2014

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

S: закрытый ключ P: открытый ключ

S + Данные = Сертификат => Клиент (открывает/проверяет его с помощью открытого ключа) P + Данные = Подпись => Сервер/Эмитент (открывает/проверяет его с помощью закрытого ключа)

person ship shuk - www.shipshuk.com    schedule 30.07.2018