Date: Tue, 17 Feb 1998 16:14:40 -0800 (PST)
From: Jan Luehe <Jan.Luehe@Eng>
Subject: Re: jce1.2 public-key encryption
To: java-security@web1.javasoft.com, Patrick.Charles@fmr.com
Patrick:
> Where can I find a public-key encryption example using jce1.2?
>
> Generating a key pair with default settings from a Diffie-Hellman
> KeyPairGenerator
> seems to lock up the vm indefinitely. Perhaps the default key is 'too'
> long?
>
> i.e.
>
> public static void main(String[] args) throws Exception
> {
> String algorithmName = "DH";
>
> try {
> System.out.println("algorithmName: " + algorithmName);
> KeyPairGenerator keyPairGenerator =
> KeyPairGenerator.getInstance(algorithmName);
> System.out.println("keyPairGenerator: " + keyPairGenerator);
> KeyPair keyPair = keyPairGenerator.genKeyPair();
> System.out.println("keyPair: " + keyPair);
>
> // performASymmetricTest(algorithmName, keyPair, plainText);
> }
> catch(NoSuchAlgorithmException e) {
> }
>
>
> manually initializing the generator:
> i.e. keyPairGenerator.initialize(1024, new SecureRandom());
> avoids this problem, but it seems like the defaults should be more
> reasonable.
>
> (or is this not feasible because the key family parameters vary from
> public-key algorithm to
> algorithm?)
Choosing a strong prime modulus "p" takes most of the time!
You can speed up the key generation by using pre-generated
Diffie-Hellman parameters (e.g., the ones defined by SKIP).
Usually, the Diffie-Hellman parameters are defined by some
central authority (which generates them only once), and are
not generated on a per-connection basis.
Try the following, and you will see a difference:
DHParameterSpec dhParamSpec = new DHParameterSpec
(skip1024Modulus, skip1024Base);
KeyPairGenerator kpairGen = KeyPairGenerator.getInstance("DH");
kpairGen.initialize(dhParamSpec);
KeyPair kpair = kpairGen.generateKeyPair();
// The 1024 bit Diffie-Hellman modulus values used by SKIP
private static final byte skip1024ModulusBytes[] = {
(byte)0xF4, (byte)0x88, (byte)0xFD, (byte)0x58,
(byte)0x4E, (byte)0x49, (byte)0xDB, (byte)0xCD,
(byte)0x20, (byte)0xB4, (byte)0x9D, (byte)0xE4,
(byte)0x91, (byte)0x07, (byte)0x36, (byte)0x6B,
(byte)0x33, (byte)0x6C, (byte)0x38, (byte)0x0D,
(byte)0x45, (byte)0x1D, (byte)0x0F, (byte)0x7C,
(byte)0x88, (byte)0xB3, (byte)0x1C, (byte)0x7C,
(byte)0x5B, (byte)0x2D, (byte)0x8E, (byte)0xF6,
(byte)0xF3, (byte)0xC9, (byte)0x23, (byte)0xC0,
(byte)0x43, (byte)0xF0, (byte)0xA5, (byte)0x5B,
(byte)0x18, (byte)0x8D, (byte)0x8E, (byte)0xBB,
(byte)0x55, (byte)0x8C, (byte)0xB8, (byte)0x5D,
(byte)0x38, (byte)0xD3, (byte)0x34, (byte)0xFD,
(byte)0x7C, (byte)0x17, (byte)0x57, (byte)0x43,
(byte)0xA3, (byte)0x1D, (byte)0x18, (byte)0x6C,
(byte)0xDE, (byte)0x33, (byte)0x21, (byte)0x2C,
(byte)0xB5, (byte)0x2A, (byte)0xFF, (byte)0x3C,
(byte)0xE1, (byte)0xB1, (byte)0x29, (byte)0x40,
(byte)0x18, (byte)0x11, (byte)0x8D, (byte)0x7C,
(byte)0x84, (byte)0xA7, (byte)0x0A, (byte)0x72,
(byte)0xD6, (byte)0x86, (byte)0xC4, (byte)0x03,
(byte)0x19, (byte)0xC8, (byte)0x07, (byte)0x29,
(byte)0x7A, (byte)0xCA, (byte)0x95, (byte)0x0C,
(byte)0xD9, (byte)0x96, (byte)0x9F, (byte)0xAB,
(byte)0xD0, (byte)0x0A, (byte)0x50, (byte)0x9B,
(byte)0x02, (byte)0x46, (byte)0xD3, (byte)0x08,
(byte)0x3D, (byte)0x66, (byte)0xA4, (byte)0x5D,
(byte)0x41, (byte)0x9F, (byte)0x9C, (byte)0x7C,
(byte)0xBD, (byte)0x89, (byte)0x4B, (byte)0x22,
(byte)0x19, (byte)0x26, (byte)0xBA, (byte)0xAB,
(byte)0xA2, (byte)0x5E, (byte)0xC3, (byte)0x55,
(byte)0xE9, (byte)0x2F, (byte)0x78, (byte)0xC7
};
// The SKIP 1024 bit modulus
private static final BigInteger skip1024Modulus = new BigInteger
(1, skip1024ModulusBytes);
// The base used with the SKIP 1024 bit modulus
private static final BigInteger skip1024Base = BigInteger.valueOf(2);
>
>
> Anyway...
>
> Second question: Cipher throws a NoSuchAlgorithmException when
> requesting a "DH" or
> "DSA" instance.
> If Cipher is for use only with symmetric algorithms, how does one create
> a
> CipherInputStream for doing a public key encryption?
Currently, the implementations of Cipher(Spi) in the JCE provider
are for DES and triple DES only.
RSA Data Security is going to provide an implementation of Cipher
for RSA in their Jsafe provider.
(Our licensing terms with RSA prevent us from supplying
such an implementation - in Java - in our own provider.)
DSA is not reversible, so you cannot use it for encryption.
Diffie-Hellman is used as a key agreement algorithm: You use the
shared secret as an encryption key, e.g., for DES or triple DES.
Jan