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