is.logi.crypto.keys
Class RSAKey

java.lang.Object
  |
  +--is.logi.crypto.Crypto
        |
        +--is.logi.crypto.keys.K
              |
              +--is.logi.crypto.keys.RSAKey

public class RSAKey
extends K
implements CipherKey, SignatureKey

The RSA algorithm is probably the best known and most widely used public key algorithm. Breaking one RSA key is believed to be as difficult as factoring the large integer that comprises the key, and there is no known way to do this in a reasonable time. Therefore RSA should be about as secure as anything if you keep your keys long. 1024 bits should be more than enough in most cases, but the clinically paranoid may want to use up to 4096 bit keys.

Each RSA key is a pair (r,n) of integers and matches another key (s,n). If P is a block of plain data represented as an integer smaller than n, then it can be encrypted with the transformation:

E = (P^r) mod n
which has the inverse transformation:
P = (E^s) mod n

The key owner will keep one key secret and publish the other as widely as possible. This allows anyone who gets hold of the public key to encrypt data which can only be decrypted with the corresponding private key.

Data that is encrypted with a private key can similarly only be decrypted with the corresponding public key. This is useful for digital signatures.

When P is created from an array of bytes, it will correspond to as many bytes of plain data as the bytes needed to store n, less one.

Each chunk of ciphertext encrypted with RSAKey has as many bytes as the key modulo. However, the plaintext it encodes has one less byte.

The CDS for the RSAKey class is RSAKey(r,n,pub) for a public key, RSAKey(r,n,pri) for a private key or RSAKey(r,n,p) for a private key where we know one factor of n. In all cases r, n and p are hexadecimal numbers.

Author:
Logi Ragnarsson (logir@hi.is)
See Also:
Signature, Crypto.fromString(String)

Fields inherited from class is.logi.crypto.Crypto
BIT, cdsPath, keySource, NIBBLE, primeCertainty, random
 
Constructor Summary
RSAKey(java.math.BigInteger r, java.math.BigInteger n, boolean pri)
          Create a new RSA key (r,n).
 
Method Summary
 int cipherBlockSize()
          Returns the size of the blocks that can be decrypted in one call to decrypt().
static KeyPair createKeys(java.math.BigInteger r, java.math.BigInteger s, java.math.BigInteger n)
          Create a KeyPair object holding objects for the public RSA key (r,n) and the private RSA key (s,n).
static KeyPair createKeys(int bitLength)
          Create a pair of public/private keys.
 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 "RSA".
 int getSize()
          Return the size of the key modulo in bits.
 boolean isPrivate()
          Return true iff this is a private key.
 boolean matches(Key key)
          Check if a key mathces this.
static RSAKey parseCDS(java.lang.String key)
          If "RSAKey( key )" is a valid CDS for a RSAKey, then RSAKey.parseCDS(key) will return the described RSAKey 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 the signature in bytes.
 int signBlockSize()
          Returns the maximum size in bytes of the fingerprint 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 is.logi.crypto.keys.K
getFingerprint, hashCode, matchFingerprint
 
Methods inherited from class is.logi.crypto.Crypto
binString, binString, equal, equalRelaxed, equalSub, fromHexNibble, fromHexString, fromString, fromString, hexString, hexString, hexString, hexString, makeClass, makeInt, makeLong, makeSessionKey, pastSpace, pickBits, pickBits, readInt, writeBytes, writeBytes, writeInt
 
Methods inherited from class java.lang.Object
getClass, notify, notifyAll, wait, wait, wait
 

Constructor Detail

RSAKey

public RSAKey(java.math.BigInteger r,
              java.math.BigInteger n,
              boolean pri)
Create a new RSA key (r,n). It is a private key if pri is true.
Method Detail

parseCDS

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

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

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

createKeys

public static KeyPair createKeys(int bitLength)
Create a pair of public/private keys. The key modulo will be bitLength or bitLength-1 bits.

createKeys

public static KeyPair createKeys(java.math.BigInteger r,
                                 java.math.BigInteger s,
                                 java.math.BigInteger n)
                          throws KeyException
Create a KeyPair object holding objects for the public RSA key (r,n) and the private RSA key (s,n).
Throws:
KeyException - if (r,n) and (s,n) does not describe a valid pair of RSA keys.

getSize

public int getSize()
Return the size of the key modulo in bits.
Overrides:
getSize in class K

getAlgorithm

public java.lang.String getAlgorithm()
The name of the algorithm is "RSA".

isPrivate

public boolean isPrivate()
Return true iff this is a private key.

toString

public java.lang.String toString()
Return a CDS for this key.
Overrides:
toString in class java.lang.Object
See Also:
Crypto.fromString(java.io.Reader)

equals

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

matches

public final boolean matches(Key key)
Check if a key mathces this. This is true if this and key are a matched pair of public/private keys.

plainBlockSize

public int plainBlockSize()
Returns the size of the blocks that can be encrypted in one call to encrypt(). For RSA 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 RSA 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 fingerprint that can be signed.
Specified by:
signBlockSize in interface SignatureKey

signatureSize

public int signatureSize()
Returns the length of the 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-1999 Logi Ragnarsson