Wie um zu überprüfen, ob die privaten Schlüssel entspricht, der mit dem Zertifikat..?
Habe ich den privaten Schlüssel gespeichert .key Datei..
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQD5YBS6V3APdgqaWAkijIUHRK4KQ6eChSaRWaw9L/4u8o3T1s8J
rUFHQhcIo5LPaQ4BrIuzHS8yzZf0m3viCTdZAiDn1ZjC2koquJ53rfDzqYxZFrId
7a4QYUCvM0gqx5nQ+lw1KoY/CDAoZN+sO7IJ4WkMg5XbgTWlSLBeBg0gMwIDAQAB
AoGASKDKCKdUlLwtRFxldLF2QPKouYaQr7u1ytlSB5QFtIih89N5Avl5rJY7/SEe
rdeL48LsAON8DpDAM9Zg0ykZ+/gsYI/C8b5Ch3QVgU9m50j9q8pVT04EOCYmsFi0
DBnwNBRLDESvm1p6NqKEc7zO9zjABgBvwL+loEVa1JFcp5ECQQD9/sekGTzzvKa5
SSVQOZmbwttPBjD44KRKi6LC7rQahM1PDqmCwPFgMVpRZL6dViBzYyWeWxN08Fuv
p+sIwwLrAkEA+1f3VnSgIduzF9McMfZoNIkkZongcDAzjQ8sIHXwwTklkZcCqn69
qTVPmhyEDA/dJeAK3GhalcSqOFRFEC812QJAXStgQCmh2iaRYdYbAdqfJivMFqjG
vgRpP48JHUhCeJfOV/mg5H2yDP8Nil3SLhSxwqHT4sq10Gd6umx2IrimEQJAFNA1
ACjKNeOOkhN+SzjfajJNHFyghEnJiw3NlqaNmEKWNNcvdlTmecObYuSnnqQVqRRD
cfsGPU661c1MpslyCQJBAPqN0VXRMwfU29a3Ve0TF4Aiu1iq88aIPHsT3GKVURpO
XNatMFINBW8ywN5euu8oYaeeKdrVSMW415a5+XEzEBY=
-----END RSA PRIVATE KEY-----
Und ich extrahierten öffentlichen Schlüssel von ssl-Zertifikat-Datei..
Unten ist der code, den ich versucht, zu überprüfen, wenn der private Schlüssel entspricht, mit ssl-Zertifikat oder nicht..
Verwendet habe ich das Modul[d.h. private Schlüssel bekommen modulus==public-key bekommen modulus] um zu überprüfen, ob Sie passend sind..
- Und das scheint zu halten, nur für RSAKEYS..
Aber ich wollen, prüfen Sie, ob andere Tasten als gut..
Gibt es irgendeine andere alternative, das gleiche zu tun..??
private static boolean verifySignature(File serverCertificateFile, File serverCertificateKey) {
try {
byte[] certificateBytes = FileUtils.readFileToByteArray(serverCertificateFile);
//byte[] keyBytes = FileUtils.readFileToByteArray(serverCertificateKey);
RandomAccessFile raf = new RandomAccessFile(serverCertificateKey, "r");
byte[] buf = new byte[(int) raf.length()];
raf.readFully(buf);
raf.close();
PKCS8EncodedKeySpec kspec = new PKCS8EncodedKeySpec(buf);
KeyFactory kf;
try {
kf = KeyFactory.getInstance("RSA");
RSAPrivateKey privKey = (RSAPrivateKey) kf.generatePrivate(kspec);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(certificateBytes);
//Generate Certificate in X509 Format
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(in);
RSAPublicKey publicKey = (RSAPublicKey) cert.getPublicKey();
in.close();
return privKey.getModulus() == publicKey.getModulus();
} catch (NoSuchAlgorithmException ex) {
logger.log(Level.SEVERE, "Such algorithm is not found", ex);
} catch (CertificateException ex) {
logger.log(Level.SEVERE, "certificate exception", ex);
} catch (InvalidKeySpecException ex) {
Logger.getLogger(CertificateConversion.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (IOException ex) {
logger.log(Level.SEVERE, "Signature verification failed.. This could be because the file is in use", ex);
}
return false;
}
Ist und der code nicht funktioniert entweder.. wirft invalidkeyspec Ausnahme
- "Und das scheint zu halten, nur für RSAKEYS.. Aber ich wollen, prüfen Sie, ob andere Tasten als gut.." #, Was andere Arten von Schlüsseln?
- DSA, EC -, DH-Schlüssel.
- Eine sehr gute Lösung ist hier erwähnt : stackoverflow.com/a/23277782/4120181
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, was ist das problem mit pairwise parameter überprüfen?
n
,e
aus der key-Datei.p
,q
,g
,y
aus der key-Datei.Und so, ich. e. jeder Algorithmus benötigt seine eigene Behandlung. Keinen Allgemeinen Algorithmus existieren können, vorausgesetzt, dass die Schlüssel-Datei-format ist tatsächlich Gewohnheit. Jedoch können Sie immer noch etwas verallgemeinern, indem Sie Wert-Indizes nur:
Dies ist nur ein Beispiel, natürlich, — nicht bekommen, syntax und zahlen ernst.
Etwas Unterschreiben, mit dem privaten Schlüssel und überprüfen Sie mit dem öffentlichen Schlüssel aus dem Zertifikat. Dies schlägt fehl, es sei denn, Sie sind ein paar.
Wenn Sie überprüfen möchten, wenn Sie einen RSA-publicKey, und einen RSA-privateKey gehören zusammen, Sie können den folgenden code verwenden:
Ich bin auf der Suche nach einer ähnlichen Lösung für die EG...
Indem wir jetzt schon einen Weg gefunden, für ECC:
Es ist allerdings ein wenig komplizierter:
Und hier sind die Mathe-Helfer-Funktion:
f2mAdd
undf2mSubtract
sind unbenutzt undf2mMultiply
hat die identische Filialen fürif ( a.bitCount() > b.bitCount() )
das scheint ein Fehler sein. Könnten Sie, bitte, auch die Quelle von den algorythm?Dein code in Ordnung ist, fügen Sie einfach die folgenden:
Ich bin ein wenig eingerostet, aber eine kleine Hilfe ist besser als keine richtige?
Im Allgemeinen, wenn Sie einen öffentlichen/privaten Schlüssel haben, sollten Sie in der Lage sein zu verwenden, eine Chiffre zu verschlüsseln, eine kleine Menge von Daten mit nur einer Taste, und sehen, ob es erfolgreich entschlüsselt mit den anderen. Das ist brute-force-und könnte Auswirkungen auf die Leistung, kann aber geeignet sein für das, was Sie zu tun versuchen (ich würde code, aber ich bin in einer Umgebung wo ich nicht überprüfen kann, und ich will nicht, um nichts zu posten, was noch nicht getestet. Verschlüsseln und entschlüsseln von großen string in java mithilfe von RSA hat code-snippets für die Verwendung einer Chiffre, wenn Sie interessiert sind).
Auch, es sei denn, die Header manipuliert wurden in Ihrem Beispiel private Schlüssel-Datei, ist es nicht in PKCS8-format. PKCS8-Dateien werden nicht geben Sie einen Algorithmus (z.B. RSA) in der Kopfzeile, wie Sie können, verwenden verschiedene algorithmen, und damit geben Sie den Algorithmus für die Kodierung selbst.
Zusätzlich, wenn ich mich Recht erinnere, native java hat schreckliche Unterstützung für PEM. Ich glaube, Sie müssen entfernen, die die PEM-Header aus der Schlüssel-Datei und base64 Dekodieren, bevor Sie irgendetwas tun können, mit. Alternativ, wenn möglich, können Sie sicherstellen, dass Ihre keyfiles sind DER codiert ist, in welchem Fall die Taste spec Lesen sollte es ganz gut.
Diese Lösung funktioniert in meinem Fall für die vorläufige Prüfung, wenn die elliptische Kurve Tasten entsprechen:
Siehe auch @SteffenHeil Antwort für mehr Mathe-checks, die das gleiche Ergebnis für mich.
Es ist auch interessant, dass der Händler die Zahlungsabwicklung Zertifikat von Apple Pay hat genau die gleiche
((ECKey) publicKey).getParams()
als Eltern - "Apple Worldwide Developer Relations, CA - G2" Zertifikat.Also beide entsprechen, der private Schlüssel und das Blatt gelöst werden können, nur mit
getSubjectDN()
=getIssuerDN()
Prüfungen beteiligt.