Ceci est un exemple d'implémentation Java de cryptage avec cryptage RSA. Deux modèles sont implémentés: cryptage avec clé privée → décryptage avec clé publique, cryptage avec clé publique → décryptage avec clé privée.
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import javax.crypto.Cipher;
public class Main {
public static void main(String[] args) throws Exception {
//Générez une clé publique / privée.
KeyPairGenerator kg = KeyPairGenerator.getInstance("RSA");
kg.initialize(1024);
KeyPair keyPair = kg.generateKeyPair();
KeyFactory factoty = KeyFactory.getInstance("RSA");
RSAPublicKeySpec publicKeySpec = factoty.getKeySpec(keyPair.getPublic(), RSAPublicKeySpec.class);
RSAPrivateKeySpec privateKeySpec = factoty.getKeySpec(keyPair.getPrivate(), RSAPrivateKeySpec.class);
PublicKey publicKey = factoty.generatePublic(publicKeySpec);
PrivateKey privateKey = factoty.generatePrivate(privateKeySpec);
//Texte brut
byte[] plain = new byte[] { 0x01, 0x02 };
//Cryptez avec une clé privée et décryptez avec une clé publique.
Cipher encrypterWithPrivateKey = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encrypterWithPrivateKey.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedWithPrivateKey = encrypterWithPrivateKey.doFinal(plain);
System.out.println("encryptedWithPrivateKey (" + encryptedWithPrivateKey.length + " bytes):");
System.out.println(decodeHex(encryptedWithPrivateKey));
Cipher decrypterWithPublicKey = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decrypterWithPublicKey.init(Cipher.DECRYPT_MODE, publicKey);
byte[] decryptedWithPrivateKey = decrypterWithPublicKey.doFinal(encryptedWithPrivateKey);
System.out.println("decryptedWithPrivateKey (" + decryptedWithPrivateKey.length + " bytes):");
System.out.println(decodeHex(decryptedWithPrivateKey));
//Cryptez avec une clé publique et décryptez avec une clé privée.
Cipher encrypterWithPublicKey = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encrypterWithPublicKey.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedWithPublicKey = encrypterWithPublicKey.doFinal(plain);
System.out.println("encryptedWithPublicKey (" + encryptedWithPublicKey.length + " bytes):");
System.out.println(decodeHex(encryptedWithPublicKey));
Cipher decrypterWithPriavteKey = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decrypterWithPriavteKey.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedWithPriavteKey = decrypterWithPriavteKey.doFinal(encryptedWithPublicKey);
System.out.println("decryptedWithPriavteKey (" + decryptedWithPriavteKey.length + " bytes):");
System.out.println(decodeHex(decryptedWithPriavteKey));
}
/**Convertit le tableau d'octets en notation hexadécimale.*/
public static String decodeHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
Exécutez avec paiza.io.
Recommended Posts