3 Stimmen

Problem mit der Entschlüsselung des öffentlichen privaten Java-Schlüssels

Ich versuche, eine Nachricht zu verschlüsseln und zu entschlüsseln, wie im folgenden Code beschrieben. Grundsätzlich möchte ich eine Nachricht mit einem öffentlichen Schlüssel verschlüsseln und die verschlüsselte Nachricht von einem Byte-Array in einen String konvertieren. Und diesen String in den ursprünglichen Text entschlüsseln. Hier sind die beiden Methoden. Hier funktioniert die Verschlüsselung gut, aber die Entschlüsselung schlägt fehl (Fehler ist "Daten müssen mit Null beginnen"). Ich denke, dies ist die Ursache, weil ich verschlüsselte Byte-Array in String konvertieren.

Wie kann ich das lösen? (Ich möchte ein verschlüsseltes Byte-Array als String haben und es für die Entschlüsselung verwenden) Gibt es einen anderen Ansatz (mit öffentlichen und privaten Schlüsseln)

public static String getEncryptedMessage(String publicKeyFilePath,

    String plainMessage) {
    byte[] encryptedBytes;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] publicKeyContentsAsByteArray = getBytesFromFile(publicKeyFilePath);
        PublicKey publicKey = getPublicKey(publicKeyContentsAsByteArray);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        encryptedBytes = cipher.doFinal(plainMessage.getBytes());
        return new String(encryptedBytes);
    } catch (Throwable t) {

    }

}
public static String getDecryptedMessage(
        String privateKeyFilePath, String encryptedMessage)
         {
    byte[] decryptedMessage;
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        byte[] privateKeyContentsAsByteArray = getBytesFromFile(privateKeyFilePath);
        PrivateKey privateKey = getPrivateKey(privateKeyContentsAsByteArray);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        decryptedMessage = cipher.doFinal(encryptedMessage.getBytes());
        return new String(decryptedMessage);
    } catch (Throwable t) {

}

2voto

James Black Punkte 41034

Wenn Sie sich diese Seite ansehen ( http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial ) müssen Sie eine Base-64-Kodierung vornehmen, um die Bytes in eine Zeichenkette umzuwandeln, die Sie dann entschlüsseln können.

Bei der Base-64-Kodierung werden die ersten 7 Bits eines Bytes verwendet, um etwas zu erstellen, das z. B. gedruckt oder per E-Mail verschickt werden kann.

UPDATE:

Ich habe einen Fehler gemacht, es sind 64 Zeichen, die kodiert werden müssen, um es einfacher zu machen, es als etwas Druckbares zu verwenden.

2voto

MByD Punkte 133514

Warum behandeln Sie die Nachricht nicht als Byte-Array von der Verschlüsselung bis zur Entschlüsselung? Warum wird sie in der Mitte in einen String umgewandelt? (Ich weiß, es sieht wie eine Frage aus, aber eigentlich ist es eine Antwort...)

2voto

sarnold Punkte 99402

Die direkte Verwendung von RSA für unformatierte Daten kann dazu führen, dass Ihre Anwendung anfällig für eine adaptiver Chiffriertext-Angriff . Einzelheiten finden Sie in Kapitel 8, Seiten 288-289, des Handbuch der angewandten Kryptographie , ein frei verfügbares Buch von CRC Press. (Es lohnt sich Kauf der gebundenen Ausgabe Wenn Sie sich wirklich für Kryptographie interessieren, werden Sie von der Qualität zu diesem Preis begeistert sein).

Wegen dieses Angriffs verwenden die meisten Protokolle, die RSA integrieren, RSA zur Verschlüsselung von zufällig erzeugten Sitzungsschlüsseln oder zum Signieren von Hash-Funktionen mit Ausgaben, die nicht vom Zufall zu unterscheiden sein sollten, ODER sie verwenden sehr sorgfältig formatierte Nachrichten, die nicht korrekt interpretiert werden können. (Siehe Anmerkung 8.63 in HAC für Details).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X