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