Skip to content

Instantly share code, notes, and snippets.

@stephen-marc
Created April 27, 2015 10:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stephen-marc/e9599d83c79c442f2af5 to your computer and use it in GitHub Desktop.
Save stephen-marc/e9599d83c79c442f2af5 to your computer and use it in GitHub Desktop.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import org.bouncycastle.mail.smime.SMIMEEnvelopedGenerator;
import java.security.*;
import org.bouncycastle.jce.provider.*;
/**
* a simple example that creates a single encrypted mail message.
* <p>
* The key store can be created using the class in
* org.bouncycastle.jce.examples.PKCS12Example - the program expects
only one
* key to be present in the key file.
* <p>
* Note: while this means that both the private key is available to
* the program, the private key is retrieved from the keystore only
for
* the purposes of locating the corresponding public key, in normal
circumstances
* you would only be doing this with a certificate available.
*/
public class CreateEncryptedMail
{
public static void main(
String args[])
throws Exception
{
if (args.length != 2)
{
System.err.println("usage: CreateEncryptedMail
pkcs12Keystore password");
System.exit(0);
}
if (java.security.Security.getProvider("BC") == null) {
System.out.println("Can't find BC - adding");
java.security.Security.addProvider(new
org.bouncycastle.jce.provider.BouncyCastleProvider());
}
//
// Open the key store
//
KeyStore ks = KeyStore.getInstance("PKCS12","BC");
ks.load(new FileInputStream(args[0]), args[1].toCharArray());
/*KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream(args[0]);
ks.load(fis, args[1].toCharArray());
fis.close();
*/
Enumeration e = ks.aliases();
String keyAlias = null;
while (e.hasMoreElements())
{
String alias = (String)e.nextElement();
if (ks.isKeyEntry(alias))
{
keyAlias = alias;
}
}
if (keyAlias == null)
{
System.err.println("can't find a private key!");
System.exit(0);
}
Certificate[] chain = ks.getCertificateChain(keyAlias);
//
// create the generator for creating an smime/encrypted
message
//
SMIMEEnvelopedGenerator gen = new SMIMEEnvelopedGenerator();
gen.addKeyTransRecipient((X509Certificate)chain[0]);
//
// create a subject key id - this has to be done the same way
as
// it is done in the certificate associated with the private
key
// version 3 only.
//
/*
MessageDigest dig =
MessageDigest.getInstance("SHA1", "BC");
dig.update(cert.getPublicKey().getEncoded());
gen.addKeyTransRecipient(cert.getPublicKey(), dig.digest());
*/
//
// create the base for our message
//
MimeBodyPart msg = new MimeBodyPart();
msg.setText("Hello world!");
//java.security.Security.insertProviderAt(new
org.bouncycastle.jce.provider.BouncyCastleProvider(), 6);
//MimeBodyPart mp = gen.generate(msg,SMIMEEnvelopedGenerator.DES_EDE3_CBC,"BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.RC2_CBC, "BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.IDEA_CBC, "BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.DES_EDE3_CBC, "BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.CAST5_CBC, "BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.AES256_CBC, "BC");
// MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.AES192_CBC, "BC");
MimeBodyPart mp = gen.generate(msg,
SMIMEEnvelopedGenerator.AES128_CBC, "BC");
// Get a Session object and create the mail message
//
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
Address fromUser = new InternetAddress("\"Eric H.
Echidna\"<eric@bouncycastle.org>");
Address toUser = new
InternetAddress("example@bouncycastle.org");
MimeMessage body = new MimeMessage(session);
body.setFrom(fromUser);
body.setRecipient(Message.RecipientType.TO, toUser);
body.setSubject("example encrypted message");
body.setContent(mp.getContent(), mp.getContentType());
body.saveChanges();
body.writeTo(new FileOutputStream("encrypted.message"));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment