org.logi.crypto.keys
Class DHKey

java.lang.Object
  |
  +--org.logi.crypto.Crypto
        |
        +--org.logi.crypto.keys.K
              |
              +--org.logi.crypto.keys.DHKey
All Implemented Interfaces:
CipherKey, Key, SignatureKey
Direct Known Subclasses:
ElGamalKey

public class DHKey
extends K
implements Key, CipherKey, SignatureKey

This object holds one Diffie-Hellman key. They can be used for Diffie-Hellman key-exchange with the DHKeyExNoninter and related classes or directly for encryption and signatures, in which case it uses the ElGamal algorithm.

The modulus and generator for the group from which the key is chosen are fixed for a given key-size. They are pre-calculated for a few bit-sizes, but take long to claculate for others.

The CDS for a Diffie-Hellman key is DHKey(x,g,m,pub) for a public key or DHKey(x,g,m,pri) for a private key. In both cases x,g and m are hexadecimal numbers.

Author:
Logi Ragnarsson (logir@logi.org)
See Also:
DHKeyExNoninter

Fields inherited from class org.logi.crypto.Crypto
BIT, cdsPath, EMPTY_ARRAY, FOUR, keySource, NIBBLE, ONE, primeCertainty, random, TWO, ZERO
 
Constructor Summary
DHKey(java.math.BigInteger x, java.math.BigInteger g, java.math.BigInteger m, boolean pri)
          Create a new Diffie-Hellman key object.
DHKey(int n)
          Create a random private DHKey with an n bit modulus.
 
Method Summary
 int cipherBlockSize()
          Returns the size of the blocks that can be decrypted in one call to decrypt().
static KeyPair createKeys(int n)
          Create a pair of public/private keys in a group with an n bit modulo.
 void decrypt(byte[] source, int i, byte[] dest, int j)
          Decrypt one block of data.
 void encrypt(byte[] source, int i, byte[] dest, int j)
          Encrypt one block of data.
 boolean equals(java.lang.Object o)
          Return true iff the two keys are equivalent.
 java.lang.String getAlgorithm()
          The name of the algorithm is "Diffie-Hellman".
 java.math.BigInteger getG()
          Return the generator for this key.
static java.math.BigInteger getGenerator(java.math.BigInteger m)
          Return a Generator for a modulus group.
 java.math.BigInteger getKey()
          Return the BigInteger representing this key.
 java.math.BigInteger getM()
          Return the modulus for this key.
static java.math.BigInteger getModulus(int n)
          Return a Diffie-Hellman modulus.
 DHKey getPublic()
          Return the public key from the pair.
 int getSize()
          Return the "size" of the key.
 boolean isPrivate()
          Returns true iff this is a private key.
 boolean matches(Key key)
          Check if a key mathces this.
static DHKey parseCDS(java.lang.String key)
          If "DHKey( key )" is a valid CDS for a DHKey, then DHKey.parseCDS(key) will return the described DHKey object.
 int plainBlockSize()
          Returns the size of the blocks that can be encrypted in one call to encrypt().
 Signature sign(Fingerprint fp)
          Create a signature for a Fingerprint fith a private key.
 int signatureSize()
          Returns the length of a signature in bytes.
 int signBlockSize()
          Returns the maximum size in bytes of the fingerprints that can be signed.
 java.lang.String toString()
          Return a CDS for this key.
 boolean verify(Signature s, Fingerprint fp)
          Verify a Signature on a Fingerprint with a public key.
 
Methods inherited from class org.logi.crypto.keys.K
getFingerprint, getFingerprint, hashCode, matchFingerprint, matchFingerprint
 
Methods inherited from class org.logi.crypto.Crypto
binString, binString, equal, equalRelaxed, equalSub, fromHexNibble, fromHexString, fromString, fromString, hexString, hexString, hexString, hexString, hexString, initRandom, initRandom, makeClass, makeInt, makeLong, makeSessionKey, pastSpace, pickBits, pickBits, readBlock, readInt, writeBytes, writeBytes, writeInt
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.logi.crypto.keys.Key
getFingerprint, getFingerprint, hashCode, matchFingerprint, matchFingerprint
 

Constructor Detail

DHKey

public DHKey(java.math.BigInteger x,
             java.math.BigInteger g,
             java.math.BigInteger m,
             boolean pri)
Create a new Diffie-Hellman key object. An object is created for x in the group modulo m with generator g. It is a private key iff pri is true.

DHKey

public DHKey(int n)
Create a random private DHKey with an n bit modulus.

Pre-calcualted modula exist for bit lengths 256, 512, 1024 and 2048. Using these values saves a lot of time and does not weaken the keys.

Method Detail

parseCDS

public static DHKey parseCDS(java.lang.String key)
                      throws InvalidCDSException
If "DHKey( key )" is a valid CDS for a DHKey, then DHKey.parseCDS(key) will return the described DHKey object.

A valid CDS can be created by calling the DHKey.toString() method.

Throws:
InvalidCDSException - if the CDS is malformed.
See Also:
Crypto.fromString(String)

getModulus

public static java.math.BigInteger getModulus(int n)
Return a Diffie-Hellman modulus.

Return the largest prime p < 2^n such that (p-1)/2 is prime. This takes a long time unless n is one of 256, 512, 1024 or 2048.

The reason for the second constraint on p is to make the Discrete-Logarithm problem harder in the group Z_p. In particular it thwarts the Pholig-Hellman algorithm.


getGenerator

public static java.math.BigInteger getGenerator(java.math.BigInteger m)
Return a Generator for a modulus group.

Returns the smallest number g > 1 with gcd(g,m-1)=1.


createKeys

public static KeyPair createKeys(int n)
Create a pair of public/private keys in a group with an n bit modulo.

Pre-calcualted modula exist for bit lengths 256, 512, 1024 and 2048. Using these values saves a lot of time and does not weaken the keys.


getSize

public int getSize()
Return the "size" of the key. This is a (fairly inaccurate) measure of how difficult it is to break and is heavily dependant on the algorithm used.
Specified by:
getSize in interface Key

getAlgorithm

public java.lang.String getAlgorithm()
The name of the algorithm is "Diffie-Hellman".
Specified by:
getAlgorithm in interface Key

isPrivate

public boolean isPrivate()
Returns true iff this is a private key.
Specified by:
isPrivate in interface Key

getPublic

public DHKey getPublic()
Return the public key from the pair.

getKey

public java.math.BigInteger getKey()
Return the BigInteger representing this key.

getM

public java.math.BigInteger getM()
Return the modulus for this key.

getG

public java.math.BigInteger getG()
Return the generator for this key.

equals

public final boolean equals(java.lang.Object o)
Return true iff the two keys are equivalent.
Overrides:
equals in class java.lang.Object

matches

public boolean matches(Key key)
Check if a key mathces this. This is true if this and key are a matched pair of public/private.
Specified by:
matches in interface Key

toString

public java.lang.String toString()
Return a CDS for this key.
Overrides:
toString in class java.lang.Object

plainBlockSize

public int plainBlockSize()
Returns the size of the blocks that can be encrypted in one call to encrypt(). For ElGamal keys this depends on the size of the key.
Specified by:
plainBlockSize in interface CipherKey

cipherBlockSize

public int cipherBlockSize()
Returns the size of the blocks that can be decrypted in one call to decrypt(). For ElGamal keys this depends on the size of the key.
Specified by:
cipherBlockSize in interface CipherKey

encrypt

public void encrypt(byte[] source,
                    int i,
                    byte[] dest,
                    int j)
Encrypt one block of data. The plaintext is taken from source starting at offset i and ciphertext is written to dest, starting at offset j.

The amount of data read and written will match the values returned by plainBlockSize() and cipherBlockSize().

Specified by:
encrypt in interface CipherKey

decrypt

public void decrypt(byte[] source,
                    int i,
                    byte[] dest,
                    int j)
Decrypt one block of data. The ciphertext is taken from source starting at offset i and plaintext is written to dest, starting at offset j.

The amount of data read and written will match the values returned by cipherBlockSize() and plainBlockSize().

Specified by:
decrypt in interface CipherKey

signBlockSize

public int signBlockSize()
Returns the maximum size in bytes of the fingerprints that can be signed.
Specified by:
signBlockSize in interface SignatureKey

signatureSize

public int signatureSize()
Returns the length of a signature in bytes.
Specified by:
signatureSize in interface SignatureKey

sign

public Signature sign(Fingerprint fp)
               throws KeyException
Create a signature for a Fingerprint fith a private key.
Specified by:
sign in interface SignatureKey
Throws:
KeyException - if the key modulus is shorter than the signature.
KeyException - if this is not a private key

verify

public boolean verify(Signature s,
                      Fingerprint fp)
               throws KeyException
Verify a Signature on a Fingerprint with a public key.

The method returns true iff s is a signature for fp created with the mathcin private key.

Specified by:
verify in interface SignatureKey
Throws:
KeyException - if this is not a public key


Copyright 1997-2000 Logi Ragnarsson