Lassen Sie uns die Signaturüberprüfung des Codes für elliptische Kurven in Java implementieren

Die Elliptic Curve Cryptography (ECC), die in der Krypto-Theorie zum selben öffentlichen Schlüsselcode wie RSA gehört, soll ein Kind sein, das von RSA etwa 15 Jahre lang durchgeführt werden kann. Ich fragte mich, ob es so wie es ist als Geheimwaffe enden würde, aber es gab kein Anzeichen dafür, dass es endlich verwendet werden würde, also untersuchte ich, wie man es in Java implementiert. In Java scheint JDK 7 und höher einen nativen Anbieter für Kryptographie mit elliptischen Kurven hinzugefügt zu haben.

Beispielcode

Beispielcode für die Zeichenüberprüfung für den Elliptic Curve Digital Signature Algorithm (ECDSA). Die Schlüsselpaargenerierung, Signaturerstellung und Signaturüberprüfung werden der Reihe nach durchgeführt. Bei der tatsächlichen Verwendung sind die Person, die die Signatur erstellt, und die Person, die die Signatur überprüft, unterschiedliche Personen. In der Stichprobe erfolgt dies jedoch auf dieselbe Weise.

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 {

	/**
	 *Beispiel für die Überprüfung der DSA-Signatur der elliptischen Kurve
	 */
	public static void main(String[] args) throws Exception {
        /*
         *Erzeugung von Kryptoschlüsselpaaren mit elliptischer Kurve
         */
		//Schlüsselpaargenerator
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC"); // Elliptic Curve
        //Zufallsgenerator
        SecureRandom randomGen = SecureRandom.getInstance("SHA1PRNG");
        //Initialisieren Sie den Schlüsselpaargenerator, indem Sie die Schlüsselgröße und den Zufallszahlengenerator angeben
        int keySize = 256;
        keyGen.initialize(keySize, randomGen);

        //Schlüsselpaargenerierung
        KeyPair keyPair = keyGen.generateKeyPair();
        //Privat Schlüssel
        PrivateKey privateKey = keyPair.getPrivate();
        //Öffentlicher Schlüssel
        PublicKey publicKey = keyPair.getPublic();

        /*
         *Signaturerstellung
         */
        String originalText = "This is string to sign";

        //Geben Sie den Signaturgenerierungsalgorithmus an
        Signature dsa = Signature.getInstance("SHA1withECDSA");
        //Initialisieren
        dsa.initSign(privateKey);
        //Signaturerstellung
        dsa.update(originalText.getBytes("UTF-8"));
        //Extrahieren Sie die generierte Signatur
        byte[] signature = dsa.sign();
        System.out.println("Signature: " + DatatypeConverter.printHexBinary(signature));

        /*
         *Zeichenüberprüfung
         */
        //Initialisieren
        dsa.initVerify(publicKey);
        //Legen Sie das Ziel für die Signaturüberprüfung fest
        dsa.update(originalText.getBytes("UTF-8"));
        //Zeichenüberprüfung
        boolean verifyResult = dsa.verify(signature);
        System.out.println("Verify: " + verifyResult);
    }
}

KeyPair Generator-Algorithmus

Für das Argument des Schlüsselpaargenerators kann Folgendes angegeben werden.

Algorithmusname Erläuterung
DiffieHellman Diffie-Generiert ein Schlüsselpaar für den Hellman Key Agreement-Algorithmus.
Hinweis: key.getAlgorithm()Gibt "DH" anstelle von "Diffie Hellman" zurück.
DSA Generieren Sie ein Schlüsselpaar für den Algorithmus für digitale Signaturen.
RSA RSA-Algorithmus(Signature/Cipher)Generieren Sie ein Schlüsselpaar für.
EC Erzeugt ein Schlüsselpaar für den Elliptic Curve-Algorithmus.

http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator

SecureRandom-Algorithmus zur Erzeugung von Zufallszahlen

Für die Argumente des Zufallszahlengenerators kann Folgendes angegeben werden.

Algorithmusname Erläuterung
NativePRNG Holen Sie sich Zufallszahlen vom zugrunde liegenden nativen Betriebssystem. Über die Blockierung der Zufallszahlengenerierung wird nichts gesagt.
NativePRNGBlocking Holen Sie sich Zufallszahlen vom zugrunde liegenden nativen Betriebssystem und blockieren Sie sie nach Bedarf. Zum Beispiel auf UNIX-Systemen/dev/zufällig etc.
NativePRNGNonBlocking Es erhält Zufallszahlen vom zugrunde liegenden nativen Betriebssystem, blockiert sie jedoch nicht, um eine Verlangsamung der Anwendung zu vermeiden. Zum Beispiel auf UNIX-Systemen/dev/urandom etc.
PKCS11 Rufen Sie Zufallszahlen aus der zugrunde liegenden installierten und konfigurierten PKCS11-Bibliothek ab.
SHA1PRNG Pseudozufallszahlengenerierung durch Sun-Anbieter(PRNG)Algorithmus. Dieser Algorithmus ist SHA als Basis von PRNG-Verwende 1. SHA aus einem wirklich zufälligen Startwert, der unter Verwendung eines 64-Bit-Zählers verkettet wird, der den Wert für jede Operation um 1 erhöht-1 Berechnen Sie den Hash. 160-Bit-SHA-Es werden nur 64 Bit eines Ausgangs verwendet.
Windows-PRNG Holen Sie sich Zufallszahlen vom zugrunde liegenden Windows-Betriebssystem.

http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom

Signaturalgorithmus

Für den Signaturalgorithmus kann Folgendes angegeben werden.

Algorithmusname Erläuterung
NONEwithRSA Digest-Algorithmus vor dem Ausführen der RSA-Operation(MD5/SHA1 usw.)RSA-Signaturalgorithmus, der nicht verwendet wird. PKCS für RSA-Signaturalgorithmus#Siehe 1.
MD2withRSA
MD5withRSA
PKCS#MD2 mit RSA-Verschlüsselung definiert in 1/MD5-Signaturalgorithmus. MD2/Erstellen und validieren Sie eine digitale RSA-Signatur mit dem MD5-Digest-Algorithmus und RSA.
SHA1withRSA
SHA224withRSA
SHA256withRSA
SHA384withRSA
SHA512withRSA
SHA definiert in OSI Interoperability Workshop-*Und ein Signaturalgorithmus, der den RSA-Verschlüsselungsalgorithmus verwendet. PKCS#Verwenden Sie die in 1 beschriebenen Auffüllregeln.
NONEwithDSA FIPS PUB 186-Algorithmus für digitale Signatur definiert in 2. Die Länge dieser Daten muss genau 20 Bytes betragen. Dieser Algorithmus wird auch als rawDSA bezeichnet.
SHA1withDSA
SHA224withDSA
SHA256withDSA
FIPS PUB 186-SHA definiert in 3-1、SHA-224 oder SHA-Ein DSA-Signaturalgorithmus, der digitale Signaturen mithilfe des 256-Digest-Algorithmus erstellt und validiert.
NONEwithECDSA
SHA1withECDSA
SHA224withECDSA
SHA256withECDSA
SHA384withECDSA
SHA512withECDSA
(ECDSA)
ANSI X9.ECDSA-Signaturalgorithmus definiert in 62.
Hinweis:Verwenden Sie nicht "ECDSA", da dies ein mehrdeutiger Name für den Algorithmus "SHA1 mit ECDSA" ist. Verwenden Sie stattdessen den offiziellen Namen "SHA1withECDSA".
<digest>with<encryption> Verwenden Sie dieses Format für einen bestimmten Message Digest(MD2, MD5 usw.)Und Algorithmus(RSA, DSA usw.)Gibt den Namen des zu verwendenden Signaturalgorithmus an. In diesem Abschnitt eingeführte explizit definierte Standardnamen(MD2withRSA etc.)Wird auch im gleichen Format angegeben.
PKCS#1 v2.Für neue Signaturschemata, die bei 0 definiert sind<digest>with<encryption>Weil das Format von<digest>with<encryption>and<mgf>Sie können den Namen im Format von angeben.<mgf>Sollte durch eine Maskenerzeugungsfunktion wie MGF1 ersetzt werden. Beispiel: MD5withRSAandMGF1。

http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#Signature

Referenzquelle

java - Tutorial of ECDSA algorithm to sign a string - Stack Overflow https://stackoverflow.com/questions/11339788/tutorial-of-ecdsa-algorithm-to-sign-a-string Dokumentation des Standardalgorithmus für die Java-Verschlüsselungsarchitektur (für JDK 8) - # KeyPairGenerator-Algorithmus http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#KeyPairGenerator Dokumentation des Standardalgorithmus für die Java-Verschlüsselungsarchitektur (für JDK 8) - # Algorithmus zur Generierung von SecureRandom-Zufallszahlen http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#SecureRandom Dokumentation des Standardalgorithmus für die Java-Verschlüsselungsarchitektur (für JDK 8) - # Signaturalgorithmus http://docs.oracle.com/javase/jp/8/docs/technotes/guides/security/StandardNames.html#Signature Anhang A von "Java Cryptography Architecture API Specification & Reference" (Standardname des PRNG-Algorithmus) 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

Lassen Sie uns die Signaturüberprüfung des Codes für elliptische Kurven in Java implementieren
Versuchen Sie, Android Hilt in Java zu implementieren
Es ist spät! Versuchen Sie, Android Notification in Java (Anfänger) zu implementieren.
Versuchen Sie, Yuma in Kinx zu implementieren
Es ist spät! Versuchen Sie, Android Work Manager in Java zu implementieren (Anfänger)
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die XML-Signatur in Java
Versuchen Sie, die asynchrone Verarbeitung in Azure zu implementieren
Anfänger spielen Janken-Spiele in Java
[Für Anfänger] Führen Sie Selenium auf Java aus
Verschlüsselung mit RSA-Verschlüsselung in Java
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Versuchen Sie einen If-Ausdruck in Java
Versuchen Sie, AWS X-Ray in Java auszuführen
Versuchen Sie, Yuma in Java zu implementieren
Einstellungen für das SSL-Debugging in Java
[Socket-Kommunikation (Java)] Eindrücke von der erstmaligen Implementierung der Socket-Kommunikation in der Praxis
Versuchen Sie, Project Euler in Java zu lösen
Erste Schritte für tiefes Lernen in Java
Versuchen Sie, n-ary Addition in Java zu implementieren
Wichtige Punkte für die Einführung von gRPC in Java
Versuchen Sie es mit der Stream-API in Java
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Lassen Sie uns eine Taschenrechner-App mit Java erstellen