|
import java.io.InputStream; |
|
import org.bouncycastle.openpgp.PGPEncryptedData; |
|
import org.bouncycastle.openpgp.PGPEncryptedDataList; |
|
import org.bouncycastle.openpgp.PGPLiteralData; |
|
import org.bouncycastle.openpgp.PGPObjectFactory; |
|
import org.bouncycastle.openpgp.PGPPrivateKey; |
|
import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData; |
|
import org.bouncycastle.openpgp.bc.BcPGPObjectFactory; |
|
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory; |
|
import org.bouncycastle.openpgp.operator.bc.BcPublicKeyDataDecryptorFactory; |
|
import org.bouncycastle.util.io.Streams; |
|
|
|
public class PGPHelper { |
|
|
|
public byte[] decrypt(String userId, String password, byte[] pgpEncryptedData) { |
|
try { |
|
PGPPrivateKey pgpPrivateKey = loadPrivateKey(privateKey.getInputStream(), userId, password.toCharArray()); |
|
PGPObjectFactory pgpFact = new BcPGPObjectFactory(pgpEncryptedData); |
|
PGPEncryptedDataList encList = (PGPEncryptedDataList) pgpFact.nextObject(); |
|
// find the matching public key encrypted data packet. |
|
PGPPublicKeyEncryptedData encData = null; |
|
for (PGPEncryptedData pgpEnc : encList) { |
|
PGPPublicKeyEncryptedData pkEnc |
|
= (PGPPublicKeyEncryptedData) pgpEnc; |
|
if (pkEnc.getKeyID() == pgpPrivateKey.getKeyID()) { |
|
encData = pkEnc; |
|
break; |
|
} |
|
} |
|
if (encData == null) { |
|
throw new IllegalStateException("matching encrypted data not found"); |
|
} |
|
// build decryptor factory |
|
PublicKeyDataDecryptorFactory dataDecryptorFactory = |
|
new BcPublicKeyDataDecryptorFactory(pgpPrivateKey); |
|
InputStream clear = encData.getDataStream(dataDecryptorFactory); |
|
byte[] literalData = Streams.readAll(clear); |
|
clear.close(); |
|
// check data decrypts okay |
|
if (encData.verify()) { |
|
// parse out literal data |
|
PGPObjectFactory litFact = new BcPGPObjectFactory(literalData); |
|
PGPLiteralData litData = (PGPLiteralData) litFact.nextObject(); |
|
return Streams.readAll(litData.getInputStream()); |
|
} |
|
throw new IllegalStateException("modification check failed"); |
|
} catch (Exception e) { |
|
throw new RuntimeException("fail to decrypt", e); |
|
} |
|
} |
No comments:
Post a Comment