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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
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..
Liest man es aus der keystore-Datei (die wahrscheinlich endet in
.jks
) in eine java.Sicherheit.KeyStore Objekt.Sobald Sie die
KeyStore
können Sie dieCertificate
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 dieKeyStore
. Etwas entlang der Linien von(offensichtlich ein wenig rauher, ich hatte keine Probe praktisch)
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.
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