Шифрование и дешифрование с помощью закрытого ключа в 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);

Ответ 1

Для выполнения шифрования RSA вам необходимо зашифровать открытым ключом и дешифровать с помощью закрытого ключа. Кроме того, вы должны использовать хорошо определенный метод заполнения, такой как совместимое с PKCS # 1 совместимое дополнение или - если доступно - дополнение 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);

Ответ 2

Как работает шифрование общедоступного закрытого ключа:

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

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

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

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

Или перейдите сюда в java → JAVA RSA Когда вы это сделаете, вернитесь и задайте больше вопросов.

Ответ 3

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

Криптография с открытым ключом имеет 2 ключа, частные и общедоступные. Если вы зашифруете с помощью одного u, можете расшифровать с другим.  -Если вы используете закрытый ключ для шифрования сообщения, то любой может расшифровать его с помощью открытого ключа. Это случай, когда u аутентифицирует ваш документ, а другие проверяют, что с помощью открытого ключа  -Если вам нужно отправить зашифрованное сообщение кому-то, тогда вам нужно отправить сообщение с помощью его открытого ключа. В этом случае сообщение может быть расшифровано с использованием только закрытого ключа, который только у кого-то есть.

Итак, в криптографии с открытым ключом RSA, где у вас есть 1 открытый и 1 закрытый ключ, и вам нужно зашифровать с одним и дешифровать с другим, тогда как в симметричной криптографии AES,DES у вас есть только один секретный секретный ключ, который используется для шифрования и расшифровать оба.