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.

"Einen verschlüsselten text, der vom Benutzer entschlüsselt wird unter Verwendung der gespeicherten öffentlichen Schlüssel aus der Datenbank. Die resultierende entschlüsselte text ist abgestimmt für die Authentifizierung nutzen." Öffentlichen Schlüssel nicht entschlüsseln kann, können Sie nur verschlüsseln. Entweder der Benutzer unterzeichnet - Daten mit dem privaten Schlüssel, in diesem Fall können Sie verwenden den öffentlichen Schlüssel verifizieren die Signatur. Oder der Benutzer die verschlüsselten Daten mit einem öffentlichen Schlüssel, und Sie müssen den privaten Schlüssel zum entschlüsseln. Ich denke, es ist der erste Fall?
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

Schreibe einen Kommentar