Mostrando entradas con la etiqueta PGP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PGP. Mostrar todas las entradas

miércoles, 16 de marzo de 2011

Encrypting using PGP (GnuPG) and Java

So I was required to encrypt some files in a bpm process using GNUPPGP. There are not too many libraries out there that makes this and are for free. So after some googling I found this site http://www.cryptix.org/ . Very cool !!!!

After I download this two links

Cryptix OpenPGP snapshot 2005/04/18 cryptix-openpgp-20050418-snap.zip
Cryptix JCE snapshot 2005/03/28 cryptix-jce-20050328-snap.zip

I create I simple Helper that will simplify the final user to use them.

My helper looks like this
  • First register the Crypto :

private static final String OPEN_PGP = "OpenPGP";
static {
//**********************************************************************
// Dynamically register both the Cryptix JCE and Cryptix OpenPGP
// providers.
//**********************************************************************
java.security.Security.addProvider(new CryptixCrypto());
java.security.Security.addProvider(new CryptixOpenPGP());
}


  • Second create a simple helper method that accepts a byte[] or Binary in BPM and returns the encrypted byte[].


public static byte[] encryptFile(File publicKey, byte[] contentToEncrypt) {
//**********************************************************************
// First read the key.
//**********************************************************************
KeyBundle publicBob = null;
FileInputStream in = null;

try {
MessageFactory mf = MessageFactory.getInstance(OPEN_PGP);
in = new FileInputStream(publicKey);
Collection msgs = mf.generateMessages(in);
KeyBundleMessage kbm = (KeyBundleMessage) msgs.iterator().next();
publicBob = kbm.getKeyBundle();
} catch (IOException ioe) {
throw new RuntimeException("IOException... You did remember to run the " + "GenerateAndWriteKey example first, right?", ioe);
} catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
throw new RuntimeException("Cannot find the OpenPGP MessageFactory. " + "This usually means that the Cryptix OpenPGP provider is not " + "installed correctly.", nsae);
} catch (MessageException me) {
me.printStackTrace();
throw new RuntimeException("Reading keybundle failed.", me);
} finally {
if (in != null)
try {
in.close();
} catch (IOException e) {
//ignore this exception!!!
}
}


//**********************************************************************
// The actual stream encryption.
//**********************************************************************
BufferedInputStream bin = null;
LiteralMessageOutputStream literalMessageOutputStream = null;
try {
ByteArrayOutputStream encryptedFileOutputStream = new ByteArrayOutputStream();
literalMessageOutputStream = LiteralMessageOutputStream.getInstance(OPEN_PGP);
EncryptedMessageOutputStream encryptedMessage = EncryptedMessageOutputStream.getInstance(OPEN_PGP);
SecureRandom sr = new SecureRandom();
literalMessageOutputStream.init(encryptedMessage, sr); // Literal writes to Encrypted
encryptedMessage.init(encryptedFileOutputStream, sr); // Encrypted writes to file
encryptedMessage.addRecipient(publicBob);
//
literalMessageOutputStream.write(contentToEncrypt);
return encryptedFileOutputStream.toByteArray();

} catch (NoSuchAlgorithmException nsae) {
throw new RuntimeException("Cannot find OpenPGP implementation." +
" This usually means that the Cryptix OpenPGP provider is not " +
"installed correctly.", nsae);
} catch (MessageStreamException me) {
throw new RuntimeException("Streaming the message failed.", me);
} catch (IOException ioe) {
throw new RuntimeException("IO error.", ioe);
} finally {
if (bin != null) {
try {
bin.close();
} catch (IOException e) {
//ignore error
}
}
if (literalMessageOutputStream != null) {
try {
literalMessageOutputStream.close();
} catch (IOException e) {
//ignore error
}
}
}
}




Issues I found

java.security.InvalidKeyException: Illegal key size


Solution replace the security files
  1. Suppose you are using jdk15. Go to http://java.sun.com/javase/downloads/index_jdk5.jsp
  2. Go to the Other Downloads section and click on download link next to "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 5.0"
  3. Download jce_policy-1_5_0.zip and extract it in to a directory.
  4. You will find local_policy.jar and US_export_policy.jar files there in the extracted directory. Copy these two files to $JAVA_HOME/jre/lib/security directory. (These files will already be there. you may replace them)