java.Sicherheit.InvalidKeyException: invalid key format auf die Generierung von RSA-public-key
Hintergrund:
Erstellt habe ich ein applet extrahiert den öffentlichen Schlüssel aus einem Zertifikat extrahiert aus einer smart-card.
Dieser öffentliche Schlüssel wird dann in der Datenbank gespeichert.
Der private Schlüssel des Zertifikats zum signieren der Daten und der öffentliche Schlüssel wird dann verwendet, um die Signatur zu überprüfen.
Code zum extrahieren des öffentlichen Schlüssels aus dem Zertifikat:
private byte[] getPublicKey(KeyStore paramKeyStore)
throws GeneralSecurityException {
Enumeration localEnumeration = paramKeyStore.aliases();
if (localEnumeration.hasMoreElements()) {
String element = (String) localEnumeration.nextElement();
Certificate[] arrayOfCertificate =
paramKeyStore.getCertificateChain(element);
byte[] publicKeyByteArray =
arrayOfCertificate[0].getPublicKey().getEncoded();
return publicKeyByteArray;
}
throw new KeyStoreException("The keystore is empty!");
}
Diese publicKeyByteArray ist dann storeed in der Datenbank als BLOB nach der Konvertierung in string mit bytes2String Methode:
private static String bytes2String(byte[] bytes) {
StringBuilder string = new StringBuilder();
for (byte b : bytes) {
String hexString = Integer.toHexString(0x00FF & b);
string.append(hexString.length() == 1 ? "0" + hexString : hexString);
}
return string.toString();
}
Den Inhalt der BLOB(Schlüssel), gespeichert in der Datenbank:
30820122300d06092a864886f70d01010105000382010f003082010a02820101009bd307e4fc38adae43b93ba1152a4d6dbf82689336bb4e3af5160d16bf1599fe070f7acbfefd93e866e52043de1620bd57d9a3f244fb4e6ef758d70d19e0be86e1b12595af748fbc00aad9009bd61120d3348079b00af8462de46e254f6d2b092cbc85c7f6194c6c37f8955ef7b9b8937a7e9999541dbbea8c1b2349c712565482dbd573cd9b7ec56a59e7683b4c246620cf0d8148ed38da937f1e4e930eb05d5b4c6054712928fa59870763468c07e71265525e1e40839b51c833579f5742d3c8e0588766e3ed6deef1593b10baad0a2abea34734de1505d37710e1cfaa4225b562b96a6a4e87fecb1d627d4c61916e543eba87054ee9212e8183125cdb49750203010001
Nach dem Lesen der gespeicherten öffentlichen Schlüssel (byte[] von der Datenbank, ich versuche es zu konvertieren zurück zu Public Key mit dem folgenden code:
Cipher rsa;
rsa = Cipher.getInstance("RSA");
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(pkey.getBytes());
PublicKey pk = keyFactory.generatePublic(publicKeySpec);
rsa.init(Cipher.DECRYPT_MODE, pk);
byte[] cipherDecrypt = rsa.doFinal(encryptedText.getBytes());
aber es gibt folgenden Fehler:
Caused by: java.security.InvalidKeyException: invalid key format
at sun.security.x509.X509Key.decode(X509Key.java:387)
at sun.security.x509.X509Key.decode(X509Key.java:403)
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:83)
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:298)
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:201)
Schlagen Sie bitte den Grund und die Lösung für dieses Problem.
Hi, ja das ist der 1. Fall, die Sie erwähnt haben. Der private Schlüssel wird zum signieren von Daten und der öffentliche Schlüssel wird dann verwendet, um die Signatur zu überprüfen. Ich aktualisiert meine Frage entsprechend.
Du machst das falsch. Das Zertifikat begleiten sollte, die Unterschrift, und zwar die Signatur sollte auch das Zertifikat in die Daten, die Sie Schildern. Der öffentliche Schlüssel kann dann erworben werden direkt aus dem Zertifikat: Sie brauchen nicht, um es zu speichern in eine Datenbank überhaupt.
Das Szenario ist, dass ein Benutzer genehmigen-eine Aufgabe, und zwar die Genehmigung, die er/Sie verwendet die smart card zum signieren der Daten. Die Anwendung erstellt ein hash der Daten und signiert es mit dem privaten Schlüssel. Der öffentliche Schlüssel der smart-card ist auch in der Datenbank gespeichert. Später auf, wird der verschlüsselte text (der wird irgendwie sein Futter in die Anwendung durch einen Bildschirm) validiert wird, mit dem hash in der Datenbank gespeichert. Der öffentliche Schlüssel wird hier verwendet, um die Entschlüsselung des verschlüsselten Textes. Es ist keine smart-card zur Verfügung zu diesem Zeitpunkt
InformationsquelleAutor user3619997 | 2014-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie haben einen Fehler in der Art und Weise Sie Lesen den Schlüssel wieder aus der Datenbank. Der folgende code funktioniert einwandfrei bei mir:
Ich würde vermuten, basierend auf der Verwendung von
pkey.getBytes()
, dass Sie haben einfach versucht, die bytes aus der Zeichenkette anstatt als hex-Decodierung.was ist mit private key ? @user3619997
InformationsquelleAutor Duncan Jones