Как прочитать открытый ключ из файла

У меня есть проблема, когда я не знаю, как читать файл с открытым ключом, я некоторое время искал решения, но они, как правило, не отвечают на мой вопрос в моем случае. У меня есть программа, которая генерирует открытый и закрытый ключи, у меня есть другой метод, который записывает их в собственные файлы соответственно. Это может звучать глупо, но я действительно не знаю, как я могу прочитать ключ из файла. Это необходимо, так как я хочу выполнить асимметричное шифрование и поэтому буду передавать файлы ключей. Я свяжу свой код ниже, любая помощь приветствуется :)
Если вам нужно больше деталей к моему объяснению, не стесняйтесь спрашивать.
Спасибо!

Методы генерации и хранения ключей:

public class Encryption {
    
    
    public static PrivateKey privateKey;
    public static PublicKey publicKey;
    
    public void KeyGeneration() throws NoSuchAlgorithmException{
        KeyPairGenerator Generator = KeyPairGenerator.getInstance("RSA"); // Creat the Generator object with RSA
        Generator.initialize(1024); // Set the generator to make the 2048 bit key
        KeyPair Pair = Generator.genKeyPair(); // Generate the key pair
        publicKey = Pair.getPublic(); // Set the Public Key
        privateKey = Pair.getPrivate(); // Set the private Key
        
        System.out.println(Base64.getEncoder().encodeToString(publicKey.getEncoded()));
        System.out.println(Base64.getEncoder().encodeToString(privateKey.getEncoded()));

              
    }

    

    
    
 
    public void writeToFile(String filePath, byte[] key) throws IOException{
        File fileToWriteto = new File(filePath);
        fileToWriteto.getParentFile().mkdirs();
        FileOutputStream FoutputStream = new FileOutputStream(fileToWriteto);
        FoutputStream.write(key);
        FoutputStream.flush();
        FoutputStream.close();
        
    
    }
  }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
359
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Простой вывод:

Save and load RSA Keys encoded
private key equals: true
public key equals:  true

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

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;

public class SaveLoadRsaKeysSo {
    public static void main(String[] args) throws GeneralSecurityException, IOException {
        System.out.println("Save and load RSA Keys encoded");

        KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");
        SecureRandom random = new SecureRandom();
        rsaGenerator.initialize(2048, random);
        KeyPair rsaKeyPair = rsaGenerator.generateKeyPair();
        PublicKey rsaPublicKey = rsaKeyPair.getPublic();
        PrivateKey rsaPrivateKey = rsaKeyPair.getPrivate();

        // save private & public key
        Files.write(Paths.get("rsaPrivateKey.encoded"), rsaPrivateKey.getEncoded());
        Files.write(Paths.get("rsaPublicKey.encoded"), rsaPublicKey.getEncoded());

        // load private & public key
        byte[] privateKeyBytesLoad = Files.readAllBytes(Paths.get("rsaPrivateKey.encoded"));
        PrivateKey privateKeyLoad = getPrivateKeyFromEncoded(privateKeyBytesLoad);
        byte[] publicKeyBytesLoad = Files.readAllBytes(Paths.get("rsaPublicKey.encoded"));
        PublicKey publicKeyLoad = getPublicKeyFromEncoded(publicKeyBytesLoad);

        System.out.println("private key equals: " + Arrays.equals(rsaPrivateKey.getEncoded(), privateKeyLoad.getEncoded()));
        System.out.println("public key equals:  " + Arrays.equals(rsaPublicKey.getEncoded(), publicKeyLoad.getEncoded()));
    }

    public static PrivateKey getPrivateKeyFromEncoded(byte[] key) throws GeneralSecurityException {
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return (PrivateKey) kf.generatePrivate(new PKCS8EncodedKeySpec(key));
    }

    public static PublicKey getPublicKeyFromEncoded(byte[] key) throws GeneralSecurityException {
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return (PublicKey) kf.generatePublic(new X509EncodedKeySpec(key));
    }
}

Ура, приятель, я попробую реализовать то, что вы мне показали, в свой код, и я дам вам знать, как это работает для меня :) Спасибо!

FocusedTerror96 21.12.2020 18:11

Моя программа наконец-то работает!! спасибо!!

FocusedTerror96 21.12.2020 18:52

Другие вопросы по теме