|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--is.logi.crypto.Crypto | +--is.logi.crypto.keys.K | +--is.logi.crypto.keys.RSAKey
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.
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 |
public RSAKey(java.math.BigInteger r, java.math.BigInteger n, boolean pri)
(r,n)
.
It is a private key if pri
is true.Method Detail |
public static RSAKey parseCDS(java.lang.String key) throws InvalidCDSException
A valid CDS can be created by calling the RSAKey.toString() method.
Crypto.fromString(String)
public static KeyPair createKeys(int bitLength)
bitLength
or bitLength-1
bits.public static KeyPair createKeys(java.math.BigInteger r, java.math.BigInteger s, java.math.BigInteger n) throws KeyException
(r,n)
and the private RSA key (s,n).public int getSize()
public java.lang.String getAlgorithm()
public boolean isPrivate()
public java.lang.String toString()
Crypto.fromString(java.io.Reader)
public boolean equals(java.lang.Object o)
public final boolean matches(Key key)
public int plainBlockSize()
public int cipherBlockSize()
public void encrypt(byte[] source, int i, byte[] dest, int j)
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()
.
public void decrypt(byte[] source, int i, byte[] dest, int j)
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()
.
public int signBlockSize()
public int signatureSize()
public Signature sign(Fingerprint fp) throws KeyException
public boolean verify(Signature s, Fingerprint fp) throws KeyException
The method returns true iff s
is a signature for
fp
created with the mathcin private key.
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |