Recherche…


Calculer les hachages cryptographiques

Calculer les hachages de blocs de données relativement petits en utilisant différents algorithmes:

final MessageDigest md5 = MessageDigest.getInstance("MD5");
final MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
final MessageDigest sha256 = MessageDigest.getInstance("SHA-256");

final byte[] data = "FOO BAR".getBytes();

System.out.println("MD5    hash: " + DatatypeConverter.printHexBinary(md5.digest(data)));
System.out.println("SHA1   hash: " + DatatypeConverter.printHexBinary(sha1.digest(data)));
System.out.println("SHA256 hash: " + DatatypeConverter.printHexBinary(sha256.digest(data)));

Produit cette sortie:

MD5    hash: E99E768582F6DD5A3BA2D9C849DF736E
SHA1   hash: 0135FAA6323685BA8A8FF8D3F955F0C36949D8FB
SHA256 hash: 8D35C97BCD902B96D1B551741BBE8A7F50BB5A690B4D0225482EAA63DBFB9DED

Des algorithmes supplémentaires peuvent être disponibles en fonction de votre implémentation de la plate-forme Java.

Générer des données aléatoires cryptographiques

Pour générer des échantillons de données cryptographiquement aléatoires:

final byte[] sample = new byte[16];

new SecureRandom().nextBytes(sample);

System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

Produit une sortie similaire à:

Sample: E4F14CEA2384F70B706B53A6DF8C5EFE

Notez que l'appel à nextBytes() peut bloquer pendant que l'entropie est recueillie en fonction de l'algorithme utilisé.

Pour spécifier l'algorithme et le fournisseur:

final byte[] sample = new byte[16];
final SecureRandom randomness = SecureRandom.getInstance("SHA1PRNG", "SUN");

randomness.nextBytes(sample);

System.out.println("Provider: " + randomness.getProvider());
System.out.println("Algorithm: " + randomness.getAlgorithm());
System.out.println("Sample: " + DatatypeConverter.printHexBinary(sample));

Produit une sortie similaire à:

Provider: SUN version 1.8
Algorithm: SHA1PRNG
Sample: C80C44BAEB352FD29FBBE20489E4C0B9

Générer des paires de clés publiques / privées

Pour générer des paires de clés en utilisant différents algorithmes et tailles de clé:

final KeyPairGenerator dhGenerator = KeyPairGenerator.getInstance("DiffieHellman");
final KeyPairGenerator dsaGenerator = KeyPairGenerator.getInstance("DSA");
final KeyPairGenerator rsaGenerator = KeyPairGenerator.getInstance("RSA");

dhGenerator.initialize(1024);
dsaGenerator.initialize(1024);
rsaGenerator.initialize(2048);

final KeyPair dhPair = dhGenerator.generateKeyPair();
final KeyPair dsaPair = dsaGenerator.generateKeyPair();
final KeyPair rsaPair = rsaGenerator.generateKeyPair();

Des algorithmes et tailles de clé supplémentaires peuvent être disponibles sur votre implémentation de la plate-forme Java.

Pour spécifier une source de caractère aléatoire à utiliser lors de la génération des clés:

final KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");

generator.initialize(2048, SecureRandom.getInstance("SHA1PRNG", "SUN"));

final KeyPair pair = generator.generateKeyPair();

Calculer et vérifier les signatures numériques

Pour calculer une signature:

final PrivateKey privateKey = keyPair.getPrivate();
final byte[] data = "FOO BAR".getBytes();
final Signature signer = Signature.getInstance("SHA1withRSA");

signer.initSign(privateKey);
signer.update(data);

final byte[] signature = signer.sign();

Notez que l'algorithme de signature doit être compatible avec l'algorithme utilisé pour générer la paire de clés.

Pour vérifier une signature:

final PublicKey publicKey = keyPair.getPublic();
final Signature verifier = Signature.getInstance("SHA1withRSA");

verifier.initVerify(publicKey);
verifier.update(data);

System.out.println("Signature: " + verifier.verify(signature));

Produit cette sortie:

Signature: true

Crypter et déchiffrer des données avec des clés publiques / privées

Pour chiffrer des données avec une clé publique:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
rsa.update(message.getBytes());
final byte[] result = rsa.doFinal();

System.out.println("Message: " + message);
System.out.println("Encrypted: " + DatatypeConverter.printHexBinary(result));

Produit une sortie similaire à:

Message: Hello
Encrypted: 5641FBB9558ECFA9ED...

Notez que lors de la création de l'objet Cipher , vous devez spécifier une transformation compatible avec le type de clé utilisé. (Voir Noms des algorithmes standard JCA pour obtenir une liste des transformations prises en charge.). Pour les données de chiffrement RSA, la longueur du message.getBytes() doit être inférieure à la taille de la clé. Voir ce SO Réponse pour les détails.

Pour déchiffrer les données:

final Cipher rsa = Cipher.getInstance("RSA");

rsa.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
rsa.update(cipherText);
final String result = new String(rsa.doFinal());

System.out.println("Decrypted: " + result);

Produit la sortie suivante:

Decrypted: Hello


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow