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