Samstag, Januar 18, 2020

Wie erhalte ich meine öffentlichen und den privaten Schlüssel auch aus dem keystore wir erstellt

Meine Aufgabe ist folgende:

  • Wieder an meine öffentlichen und den privaten Schlüssel auch aus dem keystore habe ich erstellt.
  • Verwenden Sie diesen Schlüssel zum verschlüsseln eines Absatzes mit meinen RSA 2048-bit public key.
  • Digital zu signieren und das Ergebnis mit der DSA-SHA-1 Signatur-Algorithmus.
  • Speichern Sie die digitale Signatur, die Ausgabe auf eine Datei namens output.dat.

Dem Programm unten wirft Fehler : „java.Sicherheit.InvalidKeyException: Nicht installiert-Anbieter unterstützt diesen Schlüssel: Sonne.Sicherheit.Anbieter.DSAPublicKeyImpl“.

import java.security.*;
import java.security.KeyStore.*;
import java.io.*;
import java.security.PublicKey;
import java.security.PrivateKey;
import javax.crypto.Cipher;
import java.nio.charset.*;
import sun.security.provider.*;
import  javax.crypto.*;

public class Code {

/**
 * @param args the command line arguments
 */
    public static void main(String[] args) {

        try {

            /* getting data for keystore */

            File file = new File(System.getProperty("user.home") + File.separatorChar + ".keystore");
            FileInputStream is = new FileInputStream(file);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());

            /*Information for certificate to be generated */ 
            String password = "abcde";
            String alias = "mykeys";
            String alias1 = "skeys";

            String filepath ="C:\\email.txt";

            /* getting the key*/
            keystore.load(is, password.toCharArray());
            PrivateKey key = (PrivateKey)keystore.getKey(alias, "bemylife".toCharArray());
            //PrivateKey key = cert1.getPrivateKey();
            //PublicKey key1= (PrivateKey)key;

            /* Get certificate of public key */
            java.security.cert.Certificate cert = keystore.getCertificate(alias); 

            /* Here it prints the public key*/
            System.out.println("Public Key:");
            System.out.println(cert.getPublicKey());

            /* Here it prints the private key*/
            System.out.println("\nPrivate Key:");
            System.out.println(key);

            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE,cert.getPublicKey());

            String cleartextFile = "C:\\email.txt";
            String ciphertextFile = "D:\\ciphertextRSA.png";

            FileInputStream fis = new FileInputStream(cleartextFile);
            FileOutputStream fos = new FileOutputStream(ciphertextFile);
            CipherOutputStream cos = new CipherOutputStream(fos, cipher);

            byte[] block = new byte[32];
            int i;
            while ((i = fis.read(block)) != -1) {
                cos.write(block, 0, i);
            }
            cos.close();


            /* computing the signature*/
            Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
            dsa.initSign(key);
            FileInputStream f = new FileInputStream(ciphertextFile);
            BufferedInputStream in = new BufferedInputStream(f);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = in.read(buffer)) >= 0) {
               dsa.update(buffer, 0, len);
           };
           in.close();

           /* Here it prints the signature*/
           System.out.println("Digital Signature :");
           System.out.println( dsa.sign());

           /* Now Exporting Certificate */
           System.out.println("Exporting Certificate. ");
           byte[] buffer_out = cert.getEncoded();
           FileOutputStream os = new FileOutputStream(new File("d:\\signedcetificate.cer"));
           os.write(buffer_out);
           os.close();

           /* writing signature to output.dat file */
           byte[] buffer_out1 = dsa.sign();
           FileOutputStream os1 = new FileOutputStream(new File("d:\\output.dat"));
           os1.write(buffer_out1);
           os1.close();

       } catch (Exception e) {System.out.println(e);}

   }
}
  • Ich glaube, das ist mehr Programmier-bezogene (Implementierungsdetails), sondern als Sicherheit.
  • Können Sie überprüfen, ob der alias des public/private-Schlüsselpaar in Ihrem keystore „skeys“? Wenn es nicht es würde erklären, warum Ihr öffentlicher Schlüssel nicht gefunden werden konnte. Sie können prüfen, mit keytool: keytool -list -v -keystore ~/.keystore -alias „skeys“
  • Die änderung, die ich gemacht habe ist java.Sicherheit.cert.Zertifikat cert = keystore.getCertificate(alias); statt (alias1). Denn nach Ihrer Argumentation habe ich versucht, zu überprüfen, für die alias1 name „skeys“ ist nicht da und jetzt ist es angezeigt, den öffentlichen und privaten Schlüssel aber eine andere Fehlermeldung, die ich oben erwähnte Programm.
InformationsquelleAutor Zack Ef | 2013-11-06

4 Kommentare

  1. 2

    Das problem ist, dass ein DSA-Schlüssel ist ungeeignet für die RSA-Verschlüsselung. Benötigen Sie einen RSA-Schlüssel für die Verschlüsselung, vielleicht können Sie schalten Ihre Signatur-Algorithmus RSA/SHA1, um zu vermeiden die Notwendigkeit für zwei keys..

  2. 5

    Liest man es aus der keystore-Datei (die wahrscheinlich endet in .jks) in eine java.Sicherheit.KeyStore Objekt.

    /**
     * Reads a Java keystore from a file.
     * 
     * @param keystoreFile
     *          keystore file to read
     * @param password
     *          password for the keystore file
     * @param keyStoreType
     *          type of keystore, e.g., JKS or PKCS12
     * @return the keystore object
     * @throws KeyStoreException
     *           if the type of KeyStore could not be created
     * @throws IOException
     *           if the keystore could not be loaded
     * @throws NoSuchAlgorithmException
     *           if the algorithm used to check the integrity of the keystore
     *           cannot be found
     * @throws CertificateException
     *           if any of the certificates in the keystore could not be loaded
     */
    public static KeyStore loadKeyStore(final File keystoreFile,
        final String password, final String keyStoreType)
        throws KeyStoreException, IOException, NoSuchAlgorithmException,
        CertificateException {
      if (null == keystoreFile) {
        throw new IllegalArgumentException("Keystore url may not be null");
      }
      LOG.debug("Initializing key store: {}", keystoreFile.getAbsolutePath());
      final URI keystoreUri = keystoreFile.toURI();
      final URL keystoreUrl = keystoreUri.toURL();
      final KeyStore keystore = KeyStore.getInstance(keyStoreType);
      InputStream is = null;
      try {
        is = keystoreUrl.openStream();
        keystore.load(is, null == password ? null : password.toCharArray());
        LOG.debug("Loaded key store");
      } finally {
        if (null != is) {
          is.close();
        }
      }
      return keystore;
    }

    Sobald Sie die KeyStore können Sie die Certificate und die öffentlichen und privaten Schlüssel.

    Aber mit, dass zu Zeichen, text und speichern Sie es in eine Datei mehr beteiligt, und einfach etwas falsch zu machen. Werfen Sie einen Blick auf Zeichen string mit gegebenen Öffentlichen Schlüssel und ersetzen Sie die getKeyPair Methode verwendet die KeyStore. Etwas entlang der Linien von

    public static KeyPair getKeyPair(final KeyStore keystore, 
        final String alias, final String password) {
      final Key key = (PrivateKey) keystore.getKey(alias, password.toCharArray());
    
      final Certificate cert = keystore.getCertificate(alias);
      final PublicKey publicKey = cert.getPublicKey();
    
      return KeyPair(publicKey, (PrivateKey) key);
    }

    (offensichtlich ein wenig rauher, ich hatte keine Probe praktisch)

    • bitte haben Sie einen Blick. Ich habe die Frage bearbeitet
  3. 0

    Habe ich nicht die Java-code gespeichert, an der Spitze von meinem Gehirn, aber einige Allgemeine sanity-checks sind:

    • ist das öffentliche Zertifikat, das Sie speichern möchten, wo Sie es wollen? Insbesondere, meine Erinnerung ist, dass das Zertifikat mit dem öffentlichen Schlüssel und den privaten Schlüssel gespeichert sind, zusammen unter einem alias, also die beiden alias-Einstellung Sie scheint es wirklich seltsam. Versuchen Sie die Speicherung unter dem gleichen alias und darauf verweisen, sowohl im privaten und öffentlichen Schlüssel nennt.

    • können Sie sich nichts anderes aus der Zertifikat – Z. B. Betreff-DN oder issuer DN sind beide muss-Felder in einem Zertifikat. Das gibt Ihnen ein guter Beweis dafür, dass das Zertifikat gelesen wird, als erwartet.

    • in fast jedem crypto-Transaktion, sehr vorsichtig sein mit, wie Sie Lesen aus Dateien und übertragen Sie Ihre encoding-Methoden. Wenn Sie die erstellte Datei IO und zog von es in eine seltsame Art und Weise, Sie können zur Zerstörung der Codierung des Schlüssels material. Das ist eine Letzte Sache zu prüfen – in der Regel Java und JKS habe nicht so schlecht für diese, aber es geschieht. Auf die gleiche Art, darüber im klaren sein, das format der Datei – JKS-Dateien unterscheiden sich von PKCS 12-Dateien, zum Beispiel.

    • Ich machte änderung der Erklärung code java.Sicherheit.cert.Zertifikat cert = keystore.getCertificate(alias); code Und es angezeigt, den öffentlichen und den privaten Schlüssel. Aber die Signatur Teil wurde nicht ausgeführt und der Fehler ist es zu zeigen ist : java.Sicherheit.InvalidKeyException: Nicht installiert-Anbieter unterstützt diesen Schlüssel: Sonne.Sicherheit.Anbieter.DSAPublicKeyImpl @CoverosGene @aularon
    • Klingt wie Sie haben, nach vorne bewegt, um ein anderes problem. Aus dem Fehler, den Sie berichten, es klingt wie Sie haben ein DSA-Schlüssel und keine DSA-key Anbieter. Klingt wie Sie entweder neu konfigurieren müssen Ihr Schlüsselpaar zu verwenden Schlüssel-Algorithmus, dass Ihre aktuelle installation unterstützt, oder herauszufinden, wie man ein Paket installieren, anmelden können mit DSA.
    • Ich habe die key-pair-Eigenschaften und es ist die Unterstützung von DSA. Also, ich denke, es ist die zweite Störung, die von Paket, das Zeichen mit DSA.
    • Ja, oder benötigen Sie zum generieren eines neuen Schlüsselpaares für etwas anderes, um es resigniert von der ZERTIFIZIERUNGSSTELLE (oder selbst Unterschreiben) und dann installieren und darauf verweisen.
  4. 0
    trusted.load(in, ((PBCApplication) context.getApplicationContext()).getBuildSettings().getCertificatePass());
    Enumeration enumeration = trusted.aliases();
    
    while (enumeration.hasMoreElements()) {
        String alias = (String) enumeration.nextElement();
        System.out.println("alias name: " + alias);
        Certificate certificate = trusted.getCertificate(alias);
        certificate.getPublicKey();
    }

Kostenlose Online-Tests