Implémentons la vérification de signature du code de courbe elliptique en Java

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

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);
    }
}

Algorithme KeyPair Generator

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

Algorithme de génération de nombres aléatoires SecureRandom

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

Algorithme de signature

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

Source de référence

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

Implémentons la vérification de signature du code de courbe elliptique en Java
Essayez d'implémenter Android Hilt en Java
Il est tard! Essayez d'implémenter la notification Android en Java (débutant)
Essayez d'implémenter Yuma dans Kinx
Il est tard! Essayez d'implémenter Android Work Manager en Java (débutant)
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
Essayez le type fonctionnel en Java! ①
Implémentation de l'authentification en deux étapes en Java
Implémenter la signature XML en Java
Essayez d'implémenter le traitement asynchrone dans Azure
Les débutants jouent à des jeux Janken en Java
[Pour les débutants] Exécutez Selenium sur Java
Chiffrer à l'aide du chiffrement RSA en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
Essayez une expression If en Java
Essayez d'exécuter AWS X-Ray en Java
Essayez d'implémenter Yuma en Java
Paramètres de débogage SSL dans Java
[Communication Socket (Java)] Impressions de la mise en œuvre de la communication Socket dans la pratique pour la première fois
Essayez de résoudre Project Euler en Java
Premiers pas pour l'apprentissage profond en Java
Essayez d'implémenter l'ajout n-aire en Java
Points clés pour l'introduction de gRPC en Java
Essayez d'utiliser l'API Stream en Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Essayez d'utiliser l'API au format JSON en Java
Essayez d'appeler le service CORBA sur Java 11+
Créons une application de calcul avec Java