ECDSA-Signatur-Generierung mit secp256r1 Kurve und SHA256-Algorithmus - BouncyCastle
Ich versuche zu generieren, die Signatur mit ECDSA mit secp256r1 Kurve (P256) und SHA256-Algorithmus für message-hash. Auch ich bin mit Hüpfburg Bibliotheken.
Code
public class MyTest {
/**
* @param args
*/
public static void main(String[] args) {
new MyTest().getSign();
}
void getSign() {
//Get the instance of the Key Generator with "EC" algorithm
try {
KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
g.initialize(kpgparams);
KeyPair pair = g.generateKeyPair();
//Instance of signature class with SHA256withECDSA algorithm
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
ecdsaSign.initSign(pair.getPrivate());
System.out.println("Private Keys is::" + pair.getPrivate());
System.out.println("Public Keys is::" + pair.getPublic());
String msg = "text ecdsa with sha256";//getSHA256(msg)
ecdsaSign.update((msg + pair.getPrivate().toString())
.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();
System.out.println("Signature is::"
+ new BigInteger(1, signature).toString(16));
//Validation
ecdsaSign.initVerify(pair.getPublic());
ecdsaSign.update(signature);
if (ecdsaSign.verify(signature))
System.out.println("valid");
else
System.out.println("invalid!!!!");
} catch (Exception e) {
//TODO: handle exception
e.printStackTrace();
}
}
}
Hier Schlüsselpaare generiert Schlüsselpaar , aber für meine Anforderung habe ich eine statische privateKey und den öffentlichen Schlüssel. Auch die Validierung der Signatur ist immer false zurückgeben.
Brauche Hilfe, wie kann ich mit statischen privaten Schlüssel und den an der Validierung Teil.
InformationsquelleAutor | 2014-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jackpot - nichts in deinem Titel ist ein problem!!!
Ersten, werden Sie wahrscheinlich nicht wirklich mit BouncyCastle. Sun/Oracle Java 7 und 8 schließt nun eine EG-provider (frühere Versionen nicht) und der ein-arg-form von
getInstance
verwendet den ersten verfügbaren Anbieter, die in der Regel SunEC, es sei denn, Sie oder jemand verändert hat, wird der Anbieter Liste.ÜBERPRÜFEN EINER SIGNATUR: pass die gleichen Daten zur überprüfung
Signature.update()
als Sie an die UnterzeichnungSignature.update()
. Genau die gleichen, byte für byte. Pass die Unterschrift Wert nur zuSignature.verify()
. SetzenPrivateKey.toString()
in den Daten ist dumm; dieser Wert ist spezifisch für die Ausführung von Java-Prozess, so müssen Sie senden es an den empfangenden Prozess (wenn anders, wie es normalerweise sein sollte), wo es ist nutzlos und eine Verschwendung von Speicherplatz.FÜR die VERWENDUNG EINER STATISCHEN SCHLÜSSEL:, genau das zu tun. Erstellen Sie ein Schlüsselpaar und speichern Sie es irgendwo, dann Lesen Sie es und verwenden Sie es. Die einfachste sicheren (Passwort geschützt) speichern, wird ein Java KeyStore (JKS) - Datei, aber das erfordert eine Zertifikat-Kette (vielleicht eine dummy -) was ist ein ärgernis-code selbst; glücklicherweise ist die
keytool
Dienstprogramm mit-genkeypair
generiert ein Schlüsselpaar mit einem dummy-eigensignierter-Zertifikat, und für-keyalg ec -keysize 256
es nutzt die (sehr beliebten) secp256r1 Kurve. Geben Sie auch-alias name
Ihrer Wahl-keystore filename
, alle Namen, die Sie gerne für die dummy-cert und Passwörter. Verwenden ein Schlüsselpaar aus einem JKS-Datei:verwenden
java.security.KeyStore.getInstance("JKS")
zu erstellen, ein store-Objekt und übergeben.load(InputStream,char[])
eineFileInputStream
auf die Datei und das Passwort.verwenden
.getKey(String alias,char[] password)
- und der cast um den PrivateKey. Verwenden Sie für die Unterzeichnung.verwenden
.getCertificateChain(String alias)[0].getPublicKey()
um den PublicKey aus der ersten (nur) cert. Verwenden Sie für die überprüfung.InformationsquelleAutor dave_thompson_085