public abstract class RSASignature
extends java.security.SignatureSpi
Digital signatures are used for ensuring data authentication and data integrity. RSA PKCS1v1.5
based signature algorithms use a proper hash function for creating a
message digest of the message to be signed. Subsequently this message digest is wrapped
in a DigestInfo
and then encrypted with the RSA private key of the entity going
to sign the message. Message and encrypted message digest together are sent to the intended
recipient that verifies the signature by decrypting the received encrypted message digest with
the corresponding RSA public key, and comparing it with the hash value derived from the
received original message after hashing it with the same hash function as used by the entity
that has sent the message.
This class follows the guidelines presented in PKCS#1 (v.2.1)) for implementing a PKCS#1v1.5 (RSASSA-PKCS1-v1_5) signature algorithm based on the RSA encryption method.
An application wishing to sign some message or to verify some signature, generally
has to perform three steps (in the following example, HASH
has to be
replaced by the name of the desired hash algorithm):
getInstance
method, e.g.:
Signature hash_rsa = Signature.getInstance("HASHwithRSA");
hash_rsa.initSign(rsaPrivateKey);
hash_rsa.initVerify(rsaPublicKey);
sign
method returning the signature as byte array.
Otherwise, if the Signature object has been initialized for verifying, first the
data to be verified is supplied to the Signature object, and subsequently the
signature is verified by calling the verify
method, supplied with
the byte array holding the corresponding signature value:
hash_rsa.update(data); byte[] signature = hash_rsa.sign();
hash_rsa.update(data); System.out.println("Signature " + (hash_rsa.verify(signature) ? "correct!" : "not correct!"));
Md2RSASignature
,
Md5RSASignature
,
ShaRSASignature
,
Sha224RSASignature
,
Sha256RSASignature
,
Sha384RSASignature
,
Sha512RSASignature
,
RipeMd128RSASignature
,
RipeMd160RSASignature
,
RawRSAPkcs1v15Signature
,
RawRSASignature
,
Signature
Modifier and Type | Field and Description |
---|---|
protected java.security.MessageDigest |
hash
The MessageDigest engine used to hash the data; supplied with an instance of the desired MessageDigest
algorithm by any extending subclass.
|
Modifier | Constructor and Description |
---|---|
protected |
RSASignature(AlgorithmID hashAlgorithm,
java.security.MessageDigest hash)
Creates a RSA PKCS#1v1.5 Signature object with a specified hash algorithm.
|
protected |
RSASignature(java.lang.String name,
java.security.MessageDigest hash)
Creates a RSA PKCS#1v1.5 Signature object with the given name using the
specified hash algorithm.
|
Modifier and Type | Method and Description |
---|---|
protected java.lang.Object |
engineGetParameter(java.lang.String param)
This method is not used and only throws an InvalidParameterException.
|
protected void |
engineInitSign(java.security.PrivateKey pk)
SPI: Initializes this Signature object with the given
RSA private key for going to sign some data.
|
protected void |
engineInitSign(java.security.PrivateKey pk,
java.security.SecureRandom random)
SPI: Initializes this Signature object with the given
RSA private key for going to sign some data.
|
protected void |
engineInitVerify(java.security.PublicKey pk)
SPI: Initializes this Signature object with the given
RSA public key for performing a signature verification.
|
protected void |
engineSetParameter(java.security.spec.AlgorithmParameterSpec params)
Allows to supply a SecureRandom object if required by the underlying signature scheme
(e.g.
|
protected void |
engineSetParameter(java.lang.String param,
java.lang.Object value)
Allows to supply a SecureRandom object if required by the underlying signature scheme
(e.g.
|
protected byte[] |
engineSign()
SPI: Calculates the signature.
|
protected void |
engineUpdate(byte b)
SPI: Updates the data to be signed or verified
with the specified byte.
|
protected void |
engineUpdate(byte[] b,
int off,
int len)
SPI: Updates the data to be signed or verified with the
specified number of bytes, beginning at the specified offset within the given byte array.
|
protected boolean |
engineVerify(byte[] sigBytes)
Verifies the given signature of a message according to PKCS#1v1.5.
|
protected java.security.MessageDigest hash
protected RSASignature(AlgorithmID hashAlgorithm, java.security.MessageDigest hash)
This constructor is called from subclasses to represent a RSA PKCS#1v1.5 signature with a defined hash algorithm.
Applications use
for creating a Signature object, whereSignature.getInstance("HASHwithRSA");
HASH
has to be replaced
by the name of the desired hash algorithm.hashAlgorithm
- the algorithm id of the hash algorithm to usehash
- the MessageDigest engine to be used for hashing the dataSignature.getInstance(java.lang.String)
protected RSASignature(java.lang.String name, java.security.MessageDigest hash)
This constructor is called from subclasses to represent a raw RSA PKCS#1v1.5
signature engine
.
name
- the name of the signature algorithmhash
- the MessageDigest engine to be used for hashing the dataSignature.getInstance(java.lang.String)
protected byte[] engineSign() throws java.security.SignatureException
engineSign
in class java.security.SignatureSpi
java.security.SignatureException
- if an error occurs when creating the signatureprotected boolean engineVerify(byte[] sigBytes) throws java.security.SignatureException
PKCS#1v1.5
defines a signature as bit string, which has to be converted into an octet
string, RSA decrypted with the signer's RSA public key, and DER decoded for
giving an ASN.1 DigestInfo
. From this DigestInfo
the message digest has to be taken to compare it with the message digest
derived from hashing the original message with the same message digest
algorithm.
Please notice that the first step of bit-string-to-octet-string conversion already has to be done when calling this verify method. In this way the supplied sigBytes value has to be the octet string signature value.
engineVerify
in class java.security.SignatureSpi
sigBytes
- the signature bytes to be verifiedtrue
if signature is OK, false
otherwisejava.security.SignatureException
- if an error occurs when verifying the signatureprotected void engineInitVerify(java.security.PublicKey pk) throws java.security.InvalidKeyException
engineInitVerify
in class java.security.SignatureSpi
pk
- the RSA public key belonging to the RSA private key that has been used for signing.java.security.InvalidKeyException
- if a key encoding error occursprotected void engineInitSign(java.security.PrivateKey pk) throws java.security.InvalidKeyException
engineInitSign
in class java.security.SignatureSpi
pk
- the RSA private key to be used for signing.java.security.InvalidKeyException
- if a key encoding error occursprotected void engineInitSign(java.security.PrivateKey pk, java.security.SecureRandom random) throws java.security.InvalidKeyException
If a SecureRandom never has been supplied by the application, the signature engine will use a default SecureRandom, if required.
engineInitSign
in class java.security.SignatureSpi
pk
- the RSA private key to be used for signing.random
- the SecureRandom if random numbers are required by the signature engine (e.g. PSS)java.security.InvalidKeyException
- if a key encoding error occursprotected void engineUpdate(byte b)
engineUpdate
in class java.security.SignatureSpi
b
- the byte to be used for updating.protected void engineUpdate(byte[] b, int off, int len)
engineUpdate
in class java.security.SignatureSpi
b
- the byte array holding the data to be used for this update operation.off
- the offset, indicating the start position within the given byte array.len
- the number of bytes to be obtained from the given byte array, starting at the given position.protected void engineSetParameter(java.lang.String param, java.lang.Object value) throws java.security.InvalidParameterException
initSign(PrivateKey, SecureRandom)
is not available. If required by the underlying signature scheme (e.g. PSS) an
application may supply a SecureRandom object as parameter
.
If a SecureRandom never has been supplied by the application, the signature engine will use
a default SecureRandom, if required.engineSetParameter
in class java.security.SignatureSpi
param
- ignoredvalue
- the SecureRandom supplied as PKCS1AlgorithmParameterSpecjava.security.InvalidParameterException
- if the SecureRandom is not supplied as PKCS1AlgorithmParameterSpecprotected void engineSetParameter(java.security.spec.AlgorithmParameterSpec params) throws java.security.InvalidAlgorithmParameterException
initSign(PrivateKey, SecureRandom)
to supply a SecureRandom object if required.
If a SecureRandom never has been supplied by the application, the signature engine will use
a default SecureRandom, if required.engineSetParameter
in class java.security.SignatureSpi
params
- the SecureRandom supplied as PKCS1AlgorithmParameterSpecjava.security.InvalidParameterException
- if the SecureRandom is not supplied as PKCS1AlgorithmParameterSpecjava.security.InvalidAlgorithmParameterException
protected java.lang.Object engineGetParameter(java.lang.String param) throws java.security.InvalidParameterException
engineGetParameter
in class java.security.SignatureSpi
java.security.InvalidParameterException
- This Method is not supported