Cryptage / décryptage RSA avec Java 8

environnement

Contexte

Je veux crypter / décrypter RSA avec java8! On suppose que la demande chiffrée avec Wicket sera déchiffrée plus tard.

Préparation de la clé 2048 bits

console


openssl genrsa -out rsa_2048_priv.pem 2048

--Génération de clé publique

console


openssl rsa -pubout -in rsa_2048_priv.pem -out rsa_2048_pub.pem

Enregistrez le fichier généré dans le dossier de ressources

Classe de cryptage / décryptage

RSAUtil.java


public final class RSAUtil {

	public static final Logger logger = LoggerFactory.getLogger(RSAUtil.class);
	public static ConcurrentHashMap<String, PublicKey> pubCache = new ConcurrentHashMap<String, PublicKey>();
	public static ConcurrentHashMap<Object, PrivateKey> priCache = new ConcurrentHashMap<Object, PrivateKey>();

	/**
	 *Chiffrement RSA avec clé publique
	 * @param plain
	 * @param key
	 * @return
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws UnsupportedEncodingException
	 * @throws InvalidKeyException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 */
	public static String encryptWithPublicKey(String plain, PublicKey key) throws IllegalBlockSizeException,
			BadPaddingException, UnsupportedEncodingException, InvalidKeyException,
			NoSuchAlgorithmException, NoSuchPaddingException {

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, key);

		byte[] plainBytes = plain.getBytes("UTF-8");
		String result = Base64.encodeBase64String(cipher.doFinal(plainBytes));
		return result;
	}

	/**
	 *Décryptage RSA avec clé privée
	 * @param encrypted
	 * @param key
	 * @return
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 * @throws UnsupportedEncodingException
	 * @throws InvalidKeyException
	 * @throws NoSuchAlgorithmException
	 * @throws NoSuchPaddingException
	 */
	public static String decryptWithPrivateKey(String encrypted, PrivateKey key) throws IllegalBlockSizeException,
			BadPaddingException, UnsupportedEncodingException, InvalidKeyException,
			NoSuchAlgorithmException, NoSuchPaddingException {

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, key);

		byte[] encryptedBytes = Base64.decodeBase64(encrypted);
		String result = new String(cipher.doFinal(encryptedBytes), "UTF-8");
		return result;
	}

	/**
	 *Lire la clé publique à partir du fichier pem
	 * @param filename
	 * @return
	 */
	public static PublicKey readPublicKeyFromPem(String filename) {
		PublicKey key = null;
		InputStream is = null;

		// check cache
		if (pubCache.containsKey(filename)) {
			key = (PublicKey) pubCache.get(filename);
			if (key != null) {
				return key;
			}
		}

		try {
			is = RSAUtil.class.getClassLoader().getResourceAsStream(filename);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			StringBuilder sb = new StringBuilder();
			boolean inKey = false;

			for (String line = br.readLine(); line != null; line = br.readLine()) {
				if (!inKey) {
					if (line.startsWith("-----BEGIN ") && line.endsWith(" PUBLIC KEY-----")) {
						inKey = true;
					}
					continue;
				}
				else {
					if (line.startsWith("-----BEGIN ") && line.endsWith(" PUBLIC KEY-----")) {
						inKey = false;
						break;
					}
					else {
						sb.append(line);
					}
				}
			}
			byte[] decoded = DatatypeConverter.parseBase64Binary(sb.toString());
			X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decoded);
			KeyFactory kf = KeyFactory.getInstance("RSA");
			key = kf.generatePublic(keySpec);

			pubCache.put(filename, key);
		}
		catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			logger.error("ERROR:\n"+sw.toString());
		}
		finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {}
			}
		}
		return key;
	}

	/**
	 *Lire la clé privée à partir du fichier pem
	 * @param filename
	 * @return
	 */
	public static PrivateKey readPrvateKeyFromPem(String filename) {
		PrivateKey key = null;
		InputStream is = null;
		boolean isRSAKey = false;

		if (priCache.containsKey(filename)) {
			key = (PrivateKey) priCache.get(filename);
			if (key != null) {
				return key;
			}
		}

		try {
			is = RSAUtil.class.getClassLoader().getResourceAsStream(filename);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			StringBuilder sb = new StringBuilder();
			boolean inKey = false;

			for (String line = br.readLine(); line != null; line = br.readLine()) {
				if (!inKey) {
					if (line.startsWith("-----BEGIN ") && line.endsWith(" PRIVATE KEY-----")) {
						inKey = true;
						isRSAKey = line.contains("RSA");
					}
					continue;
				}
				else {
					if (line.startsWith("-----BEGIN ") && line.endsWith(" PRIVATE KEY-----")) {
						inKey = false;
						isRSAKey = line.contains("RSA");
						break;
					}
					else {
						sb.append(line);
					}
				}
			}
			byte[] decoded = DatatypeConverter.parseBase64Binary(sb.toString());
			KeySpec keySpec = null;
			if (isRSAKey) {
				DerInputStream derReader = new DerInputStream(decoded);
				DerValue[] seq = derReader.getSequence(0);
				if (seq.length < 9) {
					throw new GeneralSecurityException("Could not parse a PKCS1 private key.");
				}
				// skip version seq[0]
				BigInteger modulus = seq[1].getBigInteger();
				BigInteger publicExp = seq[2].getBigInteger();
				BigInteger privateExp = seq[3].getBigInteger();
				BigInteger prime1 = seq[4].getBigInteger();
				BigInteger prime2 = seq[5].getBigInteger();
				BigInteger exponent1 = seq[6].getBigInteger();
				BigInteger exponent2 = seq[7].getBigInteger();
				BigInteger crtCoef = seq[8].getBigInteger();

				keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2,
						exponent1, exponent2, crtCoef);
			} else {
				keySpec = new PKCS8EncodedKeySpec(decoded);
			}
			KeyFactory kf = KeyFactory.getInstance("RSA");
			key = kf.generatePrivate(keySpec);

			priCache.put(filename, key);
		}
		catch (Exception e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			logger.error("ERROR:\n"+sw.toString());
		}
		finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {}
			}
		}
		return key;
	}
}

Essayez d'utiliser

TestRSAEncryptDecrypt.java


public class TestRSAEncryptDecrypt {

	public static void main(String[] args) {

		final String prvPemfile = "rsa_2048_priv.pem";
		final String pubPemFile = "rsa_2048_pub.pem";

		final String plain = "THIS is a test.";

		PublicKey pubKey = RSAUtil.readPublicKeyFromPem(pubPemFile);
		PrivateKey prvKey = RSAUtil.readPrvateKeyFromPem(prvPemfile);

		String encrypted = "";
		try {
			encrypted = RSAUtil.encryptWithPublicKey(plain, pubKey);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Encrypted:" + encrypted);

		String decrypted = "";
		try {
			decrypted = RSAUtil.decryptWithPrivateKey(encrypted, prvKey);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("Decrypted:" + decrypted);
	}

}

résultat

console


Encrypted:P3X8B1A+N+MEt7+oSLZ+FsbpS1ddkXIz1zpiDAuTf6/EDEPK9ozPZ+VGeaKvDucj3tkVX5YLvXU4psApuyt/NGHlzbAQryaArUGxK7Ol8Nfpp+l5yUwwi2EG6J85QZWtigH8ITmjvIf+lO8676kyg7snF2MXsIx2fNoen4A8bO8gDJ5/Dh4RkPFT8AUZFz4chVQ4whl1vdegHNO2qWj8x3+2UegqGO7QIE6P57BHGbsyF/3Dpept7Gr1NFUpN43DYA/h+IgRu0OeLCx6sss0MWokK1C+1OOam59pEpNhefIV8wzCaag7N+SfSBXGKViGN25vBfOUhC7dZfYheX7BUQ==
Decrypted:THIS is a test.

Recommended Posts

Cryptage / décryptage RSA avec Java 8
Exemple de création / chiffrement / déchiffrement de paire de clés RSA (JAVA)
KMS) Chiffrement d'enveloppe avec décryptage openssl et java
Cryptage et décryptage Java PDF
Cryptage Java, décryptage de documents Word
Obtenez un cryptage compatible OpenSSL avec Java / PHP
Installez java avec Homebrew
Changer de siège avec Java
Installez Java avec Ansible
Téléchargement confortable avec JAVA
Changer java avec direnv
Téléchargement Java avec Ansible
Raclons avec Java! !!
Construire Java avec Wercker
Conversion Endian avec JAVA
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
(Java) BDD facile avec Spectrum?
Utiliser des couches Lambda avec Java
Créer un multi-projet Java avec Gradle
Premiers pas avec Java Collection
Configuration Java avec Spring MVC
Authentification de base avec Java 11 HttpClient
Exécuter un lot avec docker-compose avec Java batch
[Template] Connexion MySQL avec Java
Installez Java 7 avec Homebrew (cask)
[Java] Communication JSON avec jackson
Essayez la connexion DB avec Java
Activer Java EE avec NetBeans 9
[Java] JavaConfig avec classe interne statique
Essayez gRPC avec Java, Maven
Exploitons Excel avec Java! !!
Gestion des versions Java avec SDKMAN
Pagination de PDF avec Java + PDFBox.jar
Trier les chaînes comme une fonction caractéristique avec Java
Orienté objet avec Strike Gundam (java)
[Java] Acquisition de contenu avec HttpCliient
Gestion des versions Java avec jenv
Dépannage avec Java Flight Recorder
Rationalisez les tests Java avec Spock
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Erreur lors de la lecture avec java
Utilisation de Mapper avec Java (Spring)
Mémo d'étude Java 2 avec Progate
Premiers pas avec les bases de Java
Affichage saisonnier avec commutateur Java
Utiliser SpatiaLite avec Java / JDBC
Étudier Java avec Progate Note 1
Comparez Java 8 en option avec Swift
Analyse HTML (scraping) avec JAVA
Exécuter Java VM avec Web Assembly
Transition d'écran avec swing, java
Test unitaire Java avec Mockito
Créer une classe immuable avec JAVA
Expression lambda Java apprise avec Comparator
SpringSecurity TextEncryptor: chiffrement / déchiffrement de clé commune
Construire un projet Java avec Gradle
Installer Java avec Docker basé sur Ubuntu 16.04
Java pour apprendre avec les ramen [Partie 1]