2016-05-05 15 views
2

Ich schreibe Modul für Server, der E-Mails senden wird. In der Client-Anwendung kann der Benutzer viele Empfänger hinzufügen und jeder von ihnen hat seinen eigenen öffentlichen Schlüssel. Ich möchte Anhänge mit mehreren Schlüsseln verschlüsseln. Wenn ich beispielsweise drei Empfänger hinzufüge, sollten Anhänge mit drei verschiedenen öffentlichen Schlüsseln verschlüsselt werden. Ich benutze Hüpfburg, um das zu tun, aber es funktioniert nur für den ersten öffentlichen Schlüssel im Verschlüsselungsprozess. Ich meine, dass nur die erste Person mit ihrem eigenen privaten Schlüssel entschlüsseln kann, für den Rest funktioniert es nicht. Mein Code Methoden für jeden Key-Looks für das Hinzufügen wie:Verschlüsselung mit mehreren RSA öffentlichen Schlüsseln

PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(dataEncryptor); 

for (PGPPublicKey publicKey : publicKeys) { 
     encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey)); 
} 

Ganz Methode wie folgt aussieht:

public File encryptFile(String fileName, 
     boolean armor, 
     boolean withIntegrityCheck) throws IOException, 
     NoSuchProviderException, 
     PGPException { 
    Security.addProvider(new BouncyCastleProvider()); 

    ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 

    PGPCompressedDataGenerator comData 
      = new PGPCompressedDataGenerator(PGPCompressedData.UNCOMPRESSED); 

    PGPUtil.writeFileToLiteralData(comData.open(bOut), 
      PGPLiteralData.BINARY, 
      new File(fileName)); 

    comData.close(); 

    BcPGPDataEncryptorBuilder dataEncryptor 
      = new BcPGPDataEncryptorBuilder(PGPEncryptedData.AES_256); 

    dataEncryptor.setWithIntegrityPacket(withIntegrityCheck); 

    dataEncryptor.setSecureRandom(new SecureRandom()); 

    PGPEncryptedDataGenerator encryptedDataGenerator 
      = new PGPEncryptedDataGenerator(dataEncryptor); 

    for (PGPPublicKey publicKey : publicKeys) { 
     encryptedDataGenerator.addMethod(new BcPublicKeyKeyEncryptionMethodGenerator(publicKey)); 
    } 

    byte[] bytes = bOut.toByteArray(); 

    FileOutputStream localByteArrayOutputStream = new FileOutputStream(fileName); 

    Object localObject = localByteArrayOutputStream; 

    if (armor) { 

     localObject = new ArmoredOutputStream((OutputStream) localObject); 

    } 

    OutputStream localOutputStream = encryptedDataGenerator.open((OutputStream) localObject, 
      bytes.length); 

    localOutputStream.write(bytes); 

    localOutputStream.close(); 

    return new File(fileName); 
} 

Kann mir jemand helfen und mir sagen, was ich falsch mache?

Vielen Dank für jede Hilfe.

[EDIT] Dieser Code funktioniert, ich hatte Probleme beim Laden mehrerer Schlüssel.

+0

Siehe http://stackoverflow.com/questions/38846/how-to-encrypt-one-message-for-multiple-empfänger für einen Standardansatz – jonrsharpe

+0

Ich verstehe, dass ich einen symmetrischen Schlüssel generieren muss, verwenden Sie es verschlüsseln Sie Datei und verschlüsseln Sie dann diesen Schlüssel mit jedem öffentlichen Schlüssel, aber ich weiß nicht, wie dies mit bouncycastle tun. Ich muss es möglich machen, mit jedem Programm mit OpenPGP-Standard zu entschlüsseln. –

Antwort

1

Nun, ich hatte das gleiche Problem ein Jahr später. Ich wünschte, du hättest deine gelöst. Ich schreibe hier meine Lösung für den Fall, dass jemand anderes ähnliche Probleme hat.

Ihr Verschlüsselungscode hat kein Problem. Das Problem könnte in der Entschlüsselung liegen. Bei einem verschlüsselten Datenobjekt sollte der richtige Schlüssel gefunden werden, indem die mit dem Objekt gespeicherte Schlüssel-ID verwendet wird. Mein Entschlüsselungsprozess liest wie die folgenden:

private byte[] decryptWithKey(byte[] bytes, PGPSecretKey secKey, String pass) 
     throws PGPException, IOException { 
    PBESecretKeyDecryptor keyDec = new JcePBESecretKeyDecryptorBuilder(
      new JcaPGPDigestCalculatorProviderBuilder().setProvider("BC").build()) 
      .setProvider("BC").build(pass.toCharArray()); 
    ByteArrayOutputStream bout = new ByteArrayOutputStream(); 

    PGPPrivateKey privateKey = secKey.extractPrivateKey(keyDec); 
    PublicKeyDataDecryptorFactory dec1 = 
      new JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").build(privateKey); 
    JcaPGPObjectFactory objFact = new JcaPGPObjectFactory(bytes); 
    PGPEncryptedDataList encList = (PGPEncryptedDataList) objFact.nextObject(); 

    PGPPublicKeyEncryptedData encD = null; 
    for(Iterator<PGPPublicKeyEncryptedData> it = encList.iterator(); it.hasNext();) { 
     PGPPublicKeyEncryptedData end = it.next(); 
     if (secKey.getKeyID() == end.getKeyID()) { 
      encD = end; 
      break; 
     } 
    } 
    assert encD != null: "Cannot find encrypted data with key: " 
      + Long.toHexString(secKey.getKeyID()); 
    InputStream in = encD.getDataStream(dec1); 
    byte[] buf = new byte[BufferSize]; 
    for (int len; (len = in.read(buf)) >= 0;) { 
     bout.write(buf, 0, len); 
    } 
    bout.close(); 
    return bout.toByteArray(); 
} 

Der Schlüssel der for-Schleife ist, die den passenden Schlüssel für das verschlüsselte Objekt findet.

Verwandte Themen