Beispiel für die Erstellung / Verschlüsselung / Entschlüsselung von RSA-Schlüsselpaaren (JAVA)

Wie der Titel schon sagt. Ich denke, es gibt verschiedene Dinge, wie es in den Laden zu legen und es als Datei zu übergeben Das Schlüsselpaar ist einmal Base64-codiert.

Abhängigkeit(maven)


<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.45</version>
</dependency>

RSAKeyPairSample.java


/**
 *Beispiele für die Erstellung, Verschlüsselung und Entschlüsselung von RSAKeyPair
 * @author ryutaro_hakozaki
 */
public class RSAKeyPairSample {

    public static void main(String argv[]){
        
        RSAKeyPairSample sample = new RSAKeyPairSample();
        
        /**
         *Erstellen eines Schlüsselpaars
         */
        String[] keyPair = sample.createKeyPairAsBase64();
        System.out.println("Öffentlicher Schlüssel== " + keyPair[0]);
        System.out.println("Privat Schlüssel== " + keyPair[1]);
        
        /**
         *Mit privatem Schlüssel verschlüsselt
         *Da es sich um RSA handelt, können Sie es mit beiden verschlüsseln
         *Bei der sicheren Kommunikation wird es mit einem öffentlichen Schlüssel verschlüsselt
         *Die elektronische Signatur verschlüsselt den Hash des Dokuments mit dem privaten Schlüssel
         */
        final String message = "Qiita ist ein technischer Informationsaustauschdienst für Programmierer.";
        byte[] encryptBytes = sample.encryptByBase64Key(message.getBytes(), keyPair[1]);
        System.out.println("----------------------------------------");
        System.out.println("[Einfach]");
        System.out.println(message);
        System.out.println("[Verschlüsselungsergebnis]");
        System.out.println(new String(encryptBytes));
        
        /**
         *Mit öffentlichem Schlüssel entschlüsseln
         *Eine Entschlüsselung ist möglich, wenn der Schlüssel ein Paar ist
         */
        byte[] decryptBytes = sample.decryptBtBase64Key(encryptBytes, keyPair[0]);
        System.out.println("[Entschlüsselungsergebnis]");
        System.out.println(new String(decryptBytes));
        
    }
    
    /**
     *Erstellen Sie ein RSA-Schlüsselpaar
     * @Rückgabe von Base64-codierten öffentlichen und Verschlüsselungsschlüsseln
     */
    public String[] createKeyPairAsBase64(){
        String[] keyPair = new String[2];

        /**
         *Schlüsselpaar erstellen
         */
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        Cipher cipher;
        KeyPairGenerator generator;
        try {
            cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
            generator = KeyPairGenerator.getInstance("RSA", "BC");
        } catch (NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException ex) {
            return keyPair;
        }
        SecureRandom random = new SecureRandom();
        generator.initialize(2048, random);
        KeyPair pair = generator.generateKeyPair();
        
        /**
         *Base64-codiertes Schlüsselpaar und zurückgegeben
         */
        keyPair[0] = encodeObjectAsBase64(pair.getPublic());
        keyPair[1] = encodeObjectAsBase64(pair.getPrivate());
        
        return keyPair;        
    }

    /**
     *Führen Sie eine Verschlüsselung durch
     * @param data
     * @param base64Key
     * @verschlüsselte Daten zurückgeben
     */
    public byte[] encryptByBase64Key(byte[] data, String base64Key){
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        try {
            Key myKey = (Key) decodeObjectFromBase64(base64Key);
            Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, myKey, new SecureRandom());
            return cipher.doFinal(data);
        } catch (IOException | NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidKeyException  ex) {
            return null;
        }
    }
    
    /**
     *Entschlüsseln
     * @param data
     * @param base64Key
     * @Entschlüsselte Daten zurückgeben
     */
    private byte[] decryptBtBase64Key(byte[] data, String base64Key){
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        try {
            Key myKey = (Key) decodeObjectFromBase64(base64Key);
            Cipher cipher = Cipher.getInstance("RSA/None/NoPadding", "BC");
            cipher.init(Cipher.DECRYPT_MODE, myKey, new SecureRandom());
            return cipher.doFinal(data);
        } catch (IOException | NoSuchAlgorithmException | NoSuchProviderException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidKeyException  ex) {
            return null;
        }
    }
    
    /**
     *Base64-codiertes Objekt
     * @param o
     * @Codierungsergebnis zurückgeben
     */    
    private static String encodeObjectAsBase64(Object o){
        //Je nach Situation werde ich diesmal die Bytes komprimieren und eine kleine Größe zurückgeben
        try(ByteArrayOutputStream byteos = new ByteArrayOutputStream();
            GZIPOutputStream gos = new GZIPOutputStream(byteos);) {
            try(ObjectOutputStream objos = new ObjectOutputStream(gos)){
                objos.writeObject(o);
            }
            byte[] retObject = byteos.toByteArray();
            return Base64.getEncoder().encodeToString(retObject);
        } catch (IOException ex) {
            Logger.getLogger(RSAKeyPairSample.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     *Konvertieren Sie die Base64-Codierung in Object
     * @param s
     * @return
     * @throws IOException 
     */
    private static Object decodeObjectFromBase64(String s) throws IOException{
       byte[] bytes = Base64.getDecoder().decode(s);
       try(GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(bytes))) {
           return new ObjectInputStream(gis).readObject();
       } catch (ClassNotFoundException ex) {
           return null;
       }
    }

}

Ausführungsergebnis


Öffentlicher Schlüssel==H4sIAAAAAAAAAFvzloG1uIhBN78oXS8pvzQvuTI5sbgkJ1UvKzlVr6AovywzJbVI (weggelassen)
Privat Schlüssel==H4sIAAAAAAAAAJVVe1QTdxae8AiRhzwiUApUEamAJRBQtx608lBsIArIY4GAOEmGZGJeTiaQAA (weggelassen)
----------------------------------------
[Einfach]
Qiita ist ein technischer Informationsaustauschdienst für Programmierer.
[Verschlüsselungsergebnis]
(Kürzung)
[Entschlüsselungsergebnis]
Qiita ist ein technischer Informationsaustauschdienst für Programmierer.

Recommended Posts

Beispiel für die Erstellung / Verschlüsselung / Entschlüsselung von RSA-Schlüsselpaaren (JAVA)
RSA-Verschlüsselung / Entschlüsselung mit Java 8
[memo] RSA-Schlüsselpaar für SSH in Java generieren
Java-Ver- und Entschlüsselung PDF
SpringSecurity TextEncryptor: Allgemeine Schlüsselverschlüsselung / -entschlüsselung
Java-Verschlüsselung, Entschlüsselung von Word-Dokumenten
KMS) Umschlagverschlüsselung mit OpenSL- und Java-Entschlüsselung
[Java] Generics-Beispiel
Java-Beispielcode 02
Java-Beispielcode 03
Selenprobe (Java)
Java GUI Beispiel
Java-Beispielcode 04
Erstellung von Java-Dateien
Java-Beispielcode 01
Erstellung eines Java-Verzeichnisses