Cerca Java BouncyCastle.
Mentre la crittografia a chiave simmetrica e' abbastanza banale
encrypted = enc(text, key)
text = dec(encrypted, key)
quella a chiave pubblica/privata e' un attimo piu' complessa.
pub,priv = genkeypair()
encrypted = enc(text,pub)
text = dec(encrypted,priv)
encrypted = enc(text,priv)
text = dec(encrypted, pub)
(si puo' cifrare SIA con la chiave pubblica che con quella privata)
Se vuoi un'introduzione, ci sono due libri interessanti
applied cryptography e
handbook of applied cryptography