2016-04-18 13 views
1

Ich schreibe gerade einen verschlüsselten Messaging-Dienst in Java, und ich verwende die Bouncycastle PGP-Bibliothek. Ich habe ein Testprogramm geschrieben, das ein Schlüsselpaar generiert und eine Nachricht verschlüsselt/entschlüsselt. Das hat eine Weile funktioniert, aber es hat kürzlich in der Entschlüsselungsstufe aufgehört und mir eine InvalidKeyException gegeben.Bouncycastle PGP-Verschlüsselungsfehler Illegal Key Size

Ich habe einige Nachforschungen angestellt und die JCE-.jar-Dateien heruntergeladen und in mein Projekt importiert (über Eclipse-Projekt -> Eigenschaften -> externe JARs hinzufügen). Ich sah, dass sie für Windows-Benutzer in einen bestimmten Ordner in der Java-Bibliothek gelegt werden sollten, aber ich konnte keinen ähnlichen auf meinem Mac finden. Ich habe versucht, den Ordner usr/library durchzusehen, konnte aber nichts Nützliches finden.

Hat jemand dieses Problem auf Mac gelöst?

EDIT: Hier ist ein Code von meiner Haupt-Testfunktion

// decrypt 
byte[] decrypted = PGPEncryptDecrypt.decrypt(encFromFile, secKey, pass.toCharArray()); 

Hier ist meine decrypt-Methode (das nicht von mir geschrieben wurde, aber ich habe eine PGPEncryptDecrypt Klasse im Zusammenhang statische Methoden zu halten, und es funktionierte für mich)

public static byte[] decrypt(byte[] encrypted, InputStream keyIn, char[] password) 
     throws IOException, PGPException, NoSuchProviderException { 
    InputStream in = new ByteArrayInputStream(encrypted); 

    in = PGPUtil.getDecoderStream(in); 

    PGPObjectFactory pgpF = new PGPObjectFactory(in); 
    PGPEncryptedDataList enc = null; 
    Object o = pgpF.nextObject(); 

    // 
    // the first object might be a PGP marker packet. 
    // 
    if (o instanceof PGPEncryptedDataList) { 
     enc = (PGPEncryptedDataList) o; 
    } else { 
     enc = (PGPEncryptedDataList) pgpF.nextObject(); 
    } 



    // 
    // find the secret key 
    // 
    Iterator it = enc.getEncryptedDataObjects(); 
    PGPPrivateKey sKey = null; 
    PGPPublicKeyEncryptedData pbe = null; 
    PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(
      PGPUtil.getDecoderStream(keyIn)); 

    while (sKey == null && it.hasNext()) { 
     pbe = (PGPPublicKeyEncryptedData) it.next(); 

     sKey = findSecretKey(pgpSec, pbe.getKeyID(), password); 
    } 

    if (sKey == null) { 
     throw new IllegalArgumentException(
       "secret key for message not found."); 
    } 

    InputStream clear = pbe.getDataStream(sKey, "BC"); 



    PGPObjectFactory pgpFact = new PGPObjectFactory(clear); 

    PGPCompressedData cData = (PGPCompressedData) pgpFact.nextObject(); 

    pgpFact = new PGPObjectFactory(cData.getDataStream()); 

    PGPLiteralData ld = (PGPLiteralData) pgpFact.nextObject(); 

    InputStream unc = ld.getInputStream(); 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    int ch; 

    while ((ch = unc.read()) >= 0) { 
     out.write(ch); 

    } 

    byte[] returnBytes = out.toByteArray(); 
    out.close(); 
    return returnBytes; 
} 

die Fehlerpunkte auf dem findSecretKey (in PGPEncryptDecrypt Klasse) -Methode, die

public static PGPPrivateKey findSecretKey(
     PGPSecretKeyRingCollection pgpSec, long keyID, char[] pass) 
     throws PGPException, NoSuchProviderException { 
    PGPSecretKey pgpSecKey = pgpSec.getSecretKey(keyID); 

    if (pgpSecKey == null) { 
     return null; 
    } 

    return pgpSecKey.extractPrivateKey(pass, "BC"); 
} 
wie folgt ist

Diese Funktionen funktionierten alle perfekt, als ich sie zum ersten Mal implementierte, aber sie funktionierten nicht mehr.

+0

Bitte fügen Sie einen Code für den Abschnitt kopieren Befehle, wo die Ausnahme ist geworfen –

Antwort

0

Für jeden anderen, den ich suchte, fand ich die Antwort darauf, nachdem ich ein bisschen herumgegrubbelt hatte.

, was ich tat, war offen Terminal, geben Sie root-Bibliothek (wie sudo), fand die entsprechende Java-Bibliothek und tat eine manuelle Kopie von meinem Download-Ordner in den entsprechenden Java-Sicherheitsordner

Pfad war Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/jre/lib/security

dann dort habe ich zwei cp Dateinamen die entsprechende Datei