La cryptographie à courbe elliptique (ECC), qui appartient au même code de clé publique que RSA dans la théorie de la cryptographie, est considérée comme un enfant qui peut être réalisée par RSA pendant environ 15 ans. Je me suis demandé si cela finirait par devenir une arme secrète telle quelle, mais rien n'indiquait qu'elle commencerait enfin à être utilisée, alors j'ai cherché comment l'implémenter en Java. Java semble avoir ajouté un fournisseur natif de cryptographie à courbe elliptique dans JDK 7 et supérieur.
Exemple de code de vérification de signe pour l'algorithme de signature numérique à courbe elliptique (ECDSA). La génération de paire de clés, la création de signature et la vérification de signature sont effectuées dans l'ordre. En utilisation réelle, la personne qui crée la signature et la personne qui vérifie la signature sont des personnes différentes, mais dans l'échantillon, cela se fait de la même manière.
package com.example;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import javax.xml.bind.DatatypeConverter;
public class ECDSAExample {
/**
*Échantillon de vérification de signature DSA à courbe elliptique
*/
public static void main(String[] args) throws Exception {
/*
*Génération de paires de clés cryptographiques à courbe elliptique
*/
//Générateur de paires de clés
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); // Elliptic Curve
//Générateur aléatoire
SecureRandom randomGen = SecureRandom.getInstance("SHA1PRNG");
//Initialisez le générateur de paires de clés en spécifiant la taille de la clé et le générateur de nombres aléatoires
int keySize = 256;
keyGen.initialize(keySize, randomGen);
//Génération de paires de clés
KeyPair keyPair = keyGen.generateKeyPair();
//Clé privée
PrivateKey privateKey = keyPair.getPrivate();
//Clé publique
PublicKey publicKey = keyPair.getPublic();
/*
*Génération de signature
*/
String originalText = "This is string to sign";
//Spécifiez l'algorithme de génération de signature
Signature dsa = Signature.getInstance("SHA1withECDSA");
//Initialisation
dsa.initSign(privateKey);
//Génération de signature
dsa.update(originalText.getBytes("UTF-8"));
//Extraire la signature générée
byte[] signature = dsa.sign();
System.out.println("Signature: " + DatatypeConverter.printHexBinary(signature));
/*
*Vérification des signes
*/
//Initialisation
dsa.initVerify(publicKey);
//Définir la cible pour la vérification de la signature
dsa.update(originalText.getBytes("UTF-8"));
//Vérification des signes
boolean verifyResult = dsa.verify(signature);
System.out.println("Verify: " + verifyResult);
}
}
Les éléments suivants peuvent être spécifiés pour l'argument du générateur de paires de clés.
Nom de l'algorithme | La description |
---|---|
DiffieHellman | Diffie-Génère une paire de clés pour l'algorithme Hellman Key Agreement. Remarque: key.getAlgorithm()Renvoie "DH" au lieu de "Diffie Hellman". |
DSA | Générez une paire de clés pour l'algorithme de signature numérique. |
RSA | Algorithme RSA(Signature/Cipher)Générez une paire de clés pour. |
EC | Génère une paire de clés pour l'algorithme Elliptic Curve. |
http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator
Ce qui suit peut être spécifié pour les arguments du générateur de nombres aléatoires.
Nom de l'algorithme | La description |
---|---|
NativePRNG | Obtenez des nombres aléatoires à partir du système d'exploitation natif sous-jacent. Rien n'est dit sur la bloquabilité de la génération de nombres aléatoires. |
NativePRNGBlocking | Obtenez des nombres aléatoires du système d'exploitation natif sous-jacent et bloquez-les si nécessaire. Par exemple, sur les systèmes UNIX/dev/aléatoire etc. |
NativePRNGNonBlocking | Il obtient des nombres aléatoires du système d'exploitation natif sous-jacent, mais ne les bloque pas pour éviter de ralentir l'application. Par exemple, sur les systèmes UNIX/dev/urandom etc. |
PKCS11 | Obtenez des nombres aléatoires à partir de la bibliothèque PKCS11 installée et configurée sous-jacente. |
SHA1PRNG | Génération de nombres pseudo aléatoires fournie par le fournisseur Sun(PRNG)algorithme. Cet algorithme est SHA comme base de PRNG-Utilisez 1. SHA à partir d'une valeur de départ vraiment aléatoire enchaînée à l'aide d'un compteur 64 bits qui incrémente la valeur de 1 pour chaque opération-1 Calculez le hachage. SHA 160 bits-Seuls 64 bits d'une sortie sont utilisés. |
Windows-PRNG | Obtenez des nombres aléatoires à partir du système d'exploitation Windows sous-jacent. |
http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom
D'autres algorithmes de signature peuvent être spécifiés comme suit.
Nom de l'algorithme | La description |
---|---|
NONEwithRSA | Algorithme de résumé avant d'effectuer l'opération RSA(MD5/SHA1 etc.)Algorithme de signature RSA qui n'utilise pas. PKCS pour l'algorithme de signature RSA#Voir 1. |
MD2withRSA MD5withRSA |
PKCS#MD2 avec cryptage RSA défini en 1/Algorithme de signature MD5. MD2/Créez et validez des signatures numériques RSA à l'aide de l'algorithme de résumé MD5 et de RSA. |
SHA1withRSA SHA224withRSA SHA256withRSA SHA384withRSA SHA512withRSA |
SHA défini dans l'atelier d'interopérabilité OSI-*Et un algorithme de signature utilisant l'algorithme de cryptage RSA. PKCS#Utilisez les règles de remplissage décrites dans 1. |
NONEwithDSA | FIPS PUB 186-Algorithme de signature numérique défini en 2. La longueur de ces données doit être exactement de 20 octets. Cet algorithme est également appelé rawDSA. |
SHA1withDSA SHA224withDSA SHA256withDSA |
FIPS PUB 186-SHA défini en 3-1、SHA-224 ou SHA-Un algorithme de signature DSA qui crée et valide les signatures numériques à l'aide de l'algorithme 256 digest. |
NONEwithECDSA SHA1withECDSA SHA224withECDSA SHA256withECDSA SHA384withECDSA SHA512withECDSA (ECDSA) |
ANSI X9.Algorithme de signature ECDSA défini en 62. Remarque:N'utilisez pas "ECDSA" car il s'agit d'un nom ambigu pour l'algorithme "SHA1 avec ECDSA". À la place, utilisez le nom officiel "SHA1withECDSA". |
<digest>with<encryption> | Utilisez ce format pour un résumé de message spécifique(MD2, MD5, etc.)Et algorithme(RSA, DSA, etc.)Spécifie le nom de l'algorithme de signature à utiliser. Noms standards définis explicitement introduits dans cette section(MD2 avec RSA etc.)Est également spécifié dans le même format. PKCS#1 v2.Pour les nouveaux schémas de signature définis à 0<digest>with<encryption>Parce que le format de<digest>with<encryption>and<mgf>Vous pouvez spécifier le nom en utilisant le format de.<mgf>Doit être remplacé par une fonction de génération de masque telle que MGF1. Exemple: MD5withRSAandMGF1。 |
http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#Signature
java - Tutorial of ECDSA algorithm to sign a string - Stack Overflow https://stackoverflow.com/questions/11339788/tutorial-of-ecdsa-algorithm-to-sign-a-string Documentation sur le nom de l'algorithme standard de l'architecture de chiffrement Java (pour JDK 8) - algorithme # KeyPairGenerator http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator Documentation sur le nom de l'algorithme standard de l'architecture de chiffrement Java (pour JDK 8) - Algorithme de génération de nombres aléatoires # SecureRandom http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom Documentation du nom d'algorithme standard de l'architecture de chiffrement Java (pour JDK 8) - # Algorithme de signature http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#Signature Annexe A (Nom standard de l'algorithme PRNG) de "Java Encryption Architecture API Specification & Reference" https://docs.oracle.com/javase/jp/1.4/guide/security/CryptoSpec.html#AppA Elliptical curve cryptography in java http://rahulatjava.blogspot.jp/2014/02/elliptical-curve-cryptography-in-java.html bc-java/ECIESTest.java at master · bcgit/bc-java https://github.com/bcgit/bc-java/blob/master/prov/src/test/java/org/bouncycastle/jce/provider/test/ECIESTest.java Encryption and Decryption of Data using Elliptic Curve Cryptography( ECC ) with Bouncy Castle C# Library https://www.codeproject.com/Tips/1071190/Encryption-and-Decryption-of-Data-using-Elliptic-C
Recommended Posts