public class DHPublicKey extends PublicKeyInfo implements javax.crypto.interfaces.DHPublicKey
iaik.x509.PublicKeyInfo
for
supporting DH public keys to be used within X.509 certificates . This class
implements the javax.crypto.interfaces.DHPublicKey
interface for
providing the functionality of a public key as used within DH key agreement.
The Diffie-Hellman algorithm constitutes a key-exchange (or key-agreement) algorithm where some entities communicate according to a predescribed protocol for generating a shared secret only known by them.
The Diffie-Hellman algorithm has been the first public-key algorithm. It only can be used for key-agreement, but not for data encrypting and decrypting.
PKCS#3
describes a method for implementing the Diffie-Hellman key agreement where
two entities use general Diffie-Hellman parameters (an odd prime
p
, an integer base g
satisfying
0 < g < p
, and optionally an integer
l
prescribing the length of the private value), generated from
some central authority (which may be an entity itself), to perform two phases
of the key agreement protocol:
x
satisfying 0 < x < p-1
. If the central
authority has prescribed the length l
of the private value
x
, it has to fulfill
2(l-1) <= x < 2l
. From
the private value, the public value y
is created by doing
y = (gx)(mod p)
with
0 < y < p
. Subsequently each entity sends
the public value just created to the other entity involved in the key
agreement.
y'
received from
the other entity to finally create the shared secret z
from the
own private value x:
z = (y'x)(mod p) with 0 < z < p
.
There may be more than only two entities involved into a Diffie-Hellman key agreement.
Any application wishing to be participated into a Diffie-Hellman key
agreement has to instantiate the javax.crypto.KeyAgreement
class
and initialize it with its DHPrivateKey for bringing in the required private
information. A DH private key maybe generated using a proper key pair
generator, e.g.:
KeyPairGnerator dh_key_gen = KeyPairGenerator.getInstance("DH"); dh_key_gen.initialize(1024); KeyPair dh_key_pair = dh_key_gen.generateKeyPair(); DHPrivateKey dh_priv_key = (DHPrivateKey) dh_key_pair.getPrivate(); KeyAgreement dh_key_agreement = KeyAgreement.getInstance("DH"); dh_key_agreement.init(dh_priv_key);
Each phase of a key agreement is performed by a call to the
doPhase
method, supplied with some other entity's public key or
some intermediate key resulting from the last phase. When calling
doPhase
, it has to be specified whether to perform already the
last phase of the key agreement or not by setting the lastPhase
parameter to true
or false
:
dh_key_agreement.doPhase(dhPubKey_from_other_entity, true);Actually generating the shared secret is done by calling the
generateSecret
method:
byte[] shared_secret = dh_key_agreemant.generateSecret();
PublicKeyInfo
,
DHPublicKey
,
KeyAgreement
,
DHGenParameterSpec
,
DHParameterSpec
,
DHPrivateKeySpec
,
DHPublicKeySpec
,
KeyPairGenerator
,
KeyPair
,
DHPrivateKey
,
DHKeyPairGenerator
,
DHKeyFactory
,
DHParameters
,
DHParameterGenerator
,
DHKeyAgreement
,
Serialized Formpublic_key_algorithm
Constructor and Description |
---|
DHPublicKey(ASN1Object obj)
Creates a new DHPublicKey from the given ASN.1 object.
|
DHPublicKey(java.math.BigInteger y,
javax.crypto.spec.DHParameterSpec parameters)
Creates a new DHPublicKey from public key value and DH parameter
specification
|
DHPublicKey(byte[] pk)
Creates a new DHPublicKey from the given DER encoded byte array.
|
DHPublicKey(javax.crypto.spec.DHPublicKeySpec keySpec)
Creates a new DHPublicKey from the given DHPublicKeySpec representing the
DH public key value y, and the public values p, g and l.
|
DHPublicKey(java.io.InputStream is)
Creates a new DHPublicKey from an InputStream.
|
Modifier and Type | Method and Description |
---|---|
protected void |
decode(byte[] publicKey)
Decodes a DHPublicKey, encoded in DER format.
|
byte[] |
encode()
Returns the raw DH public key (not wrapped in a X.509 PublicKeyInfo) as DER
encoded ASN.1 object.
|
java.lang.String |
getAlgorithm()
Returns the name of the appertaining algorithm.
|
byte[] |
getFingerprint()
Returns the fingerprint of this DH public key.
|
javax.crypto.spec.DHParameterSpec |
getParams()
Returns the key parameters.
|
java.math.BigInteger |
getY()
Returns the public value
y as BigInteger. |
int |
hashCode()
Returns a hash code for this object.
|
java.lang.String |
toString()
Returns a string that represents the contents of this public key.
|
static void |
validatePublicKey(java.math.BigInteger y,
java.math.BigInteger p,
java.math.BigInteger g)
Validates the given DHPublicKey.
|
clone, createPublicKeyInfo, decode, equals, getAlgorithmID, getEncoded, getFormat, getPublicKey, getPublicKey, getPublicKey, getPublicKey, getPublicKey, getPublicKey, toASN1Object, writeTo
public DHPublicKey(java.math.BigInteger y, javax.crypto.spec.DHParameterSpec parameters)
y
- the BigInteger value representing the DH public key value yparameters
- the DH parameters p (prime modulus), g (base generator) and l
(length of the private value x) as DHParameterSpecDHParameterSpec
public DHPublicKey(javax.crypto.spec.DHPublicKeySpec keySpec)
keySpec
- the DHPublicKeySpec representing the public key value
y
, the prime modulus p
, the base
generator g
, and the length l
of the
private valueDHPublicKeySpec
public DHPublicKey(byte[] pk) throws java.security.InvalidKeyException
This constructor may be used for parsing an already existing DH public key,
wrapped into a X.509 PublicKeyInfo
that is
supplied as DER encoded byte array.
pk
- the byte array holding the DER encoded public key infojava.security.InvalidKeyException
- if something is wrong with the key encodingpublic DHPublicKey(ASN1Object obj) throws java.security.InvalidKeyException
PublicKeyInfo
holding the DH public key.
obj
- the public key ASN.1 data structurejava.security.InvalidKeyException
- if something is wrong with the key encodingpublic DHPublicKey(java.io.InputStream is) throws java.io.IOException, java.security.InvalidKeyException
This constructor may be used for parsing an already existing DH public key,
wrapped into a X.509 PublicKeyInfo
that is
supplied as DER encoded byte array.
is
- the input stream with the data to be read to initialize the public
keyjava.io.IOException
- if an I/O error occursjava.security.InvalidKeyException
- if something is wrong with the key encodingpublic static void validatePublicKey(java.math.BigInteger y, java.math.BigInteger p, java.math.BigInteger g) throws java.security.InvalidKeyException
null
)
is in the interval [2,p-2] (see RFC 7919, 5.2; RFC 2631, 2.1.5).y
- the public value yp
- the prime modulus pg
- the base generator g, maybe null
if we are on the
server side and have to validate the client public value only
received in the ClientKeyExchange messagejava.security.InvalidKeyException
- if the DH key is supposed to be a weak keyprotected void decode(byte[] publicKey) throws java.security.InvalidKeyException
From the given DER encoded byte array an ASN.1 object is created and parsed
for the public key value y
and the DH parameters prime
p
and base g
, and - if included - the length
l
of the private value x
.
This method is protected and typically will not be used by an application.
Rather it is used by the parent X.509 PublicKeyInfo
class for decoding the inherent DH public key.
decode
in class PublicKeyInfo
publicKey
- the public key as DER encoded ASN.1 objectjava.security.InvalidKeyException
- if the given key is not a DH public keypublic byte[] encode()
This method typically may not be used by an application. Rather it is used
by the parent X.509 PublicKeyInfo
class for
encoding the inherent DH public key.
encode
in class PublicKeyInfo
public java.lang.String getAlgorithm()
getAlgorithm
in interface java.security.Key
getAlgorithm
in class PublicKeyInfo
public java.math.BigInteger getY()
y
as BigInteger.
getY
in interface javax.crypto.interfaces.DHPublicKey
y
as BigIntegerpublic javax.crypto.spec.DHParameterSpec getParams()
getParams
in interface javax.crypto.interfaces.DHKey
public byte[] getFingerprint()
getFingerprint
in class PublicKeyInfo
public int hashCode()
hashCode
in class PublicKeyInfo
public java.lang.String toString()
toString
in class PublicKeyInfo