|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--javax.crypto.CipherSpi | +--iaik.security.cipher.BufferedCipher | +--iaik.security.cipher.TripleDES | +--iaik.security.cipher.PbeWithSHAAnd3_KeyTripleDES_CBC
This class implements from the Personal Information Exchange Standard (PKCS#12) the pbeWithSHAAnd3_KeyTripleDES_CBC algorithm (object identifier: 1.2.840.113549.1.12.1.3).
The pbeWithSHAAnd3_KeyTripleDES_CBC key-encryption algorithm is used to encrypt a given message with the TripleDES algorithm in CBC mode using a secret key which is derived from a password with the SHA hash algorithm.
PKCS#12 breaks with the PKCS#5 recommendation suggesting passwords to consist of printable ASCII characters. PKCS #12 creates passwords from BMPStrings with a NULL terminator by encoding every character of the original BMPString in 2 bytes in big-endian format (most-significant byte first).
As an alternative to the PKCS#5 pbeWithMD5AndDES-CBC
and
pbeWithMD2AndDES-CBC
algorithms, the
pbeWithSHAAnd3_KeyTripleDES_CBC
algorithm may be used for
encrypting private keys, as described in PKCS#8.
Suppose you have created a RSAPrivateKey rsa_priv_key
and are going
to protect it with a password according to PKCS#5, (PKCS#12) and PKCS#8. You
therefore will encode a value of type PrivateKeyInfo
according
to PKCS#8 to represent the private key in an algorithm-independent manner,
which subsequently will be encrypted using the PbeWithSHAAnd3_KeyTripleDES_CBC
algorithm and encoded as PKCS#8 EncryptedPrivateKeyInfo (EncryptedPrivateKeyInfo
):
Decrypting goes the reverse way obtaining a PrivateKeyInfo from the EncryptedPrivateKeyInfo and "extracting" the RSAPrivateKey:import iaik.pkcs.pkcs8.*; ... EncryptedPrivateKeyInfo epki = new EncryptedPrivateKeyInfo(rsa_priv_key); epki.encrypt("password", AlgorithmID.pbeWithSHAAnd3_KeyTripleDES_CBC, null);
RSAPrivateKey rsa_priv_key = (RSAPrivateKey)epki.decrypt("password");
You also may use the PbeWithSHAAnd3_KeyTripleDES_CBC algorithm for password based
encrypting some message in the common way by directly using the
Cipher.getInstance
method when not intending to deal with PKCS#8
EncryptedPrivateKeyInfo
.
When doing so, you will have to use
PBEKeyBMP
(created from a password, which is treated as a BMPString according to PKCS#12)
and PBEParameterSpec
(created from salt and iteration count) for properly
initializing the cipher; for instance (do not forget to include exception handling!):
Random random = new Random(); // salt byte[] salt = new byte[16]; random.nextBytes(salt); //iteration count int count = 1; // PBE paramters PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count); // PBEKeyBMP from password PBEKeyBMP pbeKey = new PBEKeyBMP("password"); Cipher pbeCipher = Cipher.getInstance("PbeWithSHAAnd3_KeyTripleDES_CBC"); // initialize for encryption pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec); // encrypt data byte[] cipher_data = pbeCipher.doFinal(plain_data); // now decrypt pbeCipher = Cipher.getInstance("PbeWithSHAAnd3_KeyTripleDES_CBC"); // initialize for decryption pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec); // decrypt cipher data byte[] decrypted_data = pbeCipher.doFinal(cipherdata);
PrivateKeyInfo
,
EncryptedPrivateKeyInfo
,
TripleDES
,
PBEKeyBMP
,
PBEParameterSpec
,
PBEGenParameterSpec
,
PBEParameterGenerator
,
PBEParameters
,
IaikPBEParameterSpec
Field Summary | |
protected AlgorithmParameters |
params
|
Constructor Summary | |
PbeWithSHAAnd3_KeyTripleDES_CBC()
Creates a new PbeWithSHAAnd3_KeyTripleDES_CBC Cipher object. |
Method Summary | |
protected int |
engineGetKeySize(Key key)
New method in JCE 1.2.1 |
AlgorithmParameters |
engineGetParameters()
Returns the parameters of the algorithm. |
void |
engineInit(int opmode,
Key key,
AlgorithmParameterSpec paramSpec,
SecureRandom random)
Initializes this cipher for encryption or decryption. |
void |
engineInit(int opmode,
Key key,
AlgorithmParameters params,
SecureRandom random)
Initializes this cipher for encryption or decryption. |
void |
engineInit(int opmode,
Key key,
SecureRandom random)
Initializes this cipher for encryption or decryption. |
void |
engineSetMode(String mode)
This method only overwrites the corresponding method in its superclass and does nothing. |
void |
engineSetPadding(String padding)
This method only overwrites the corresponding method in its superclass and does nothing. |
protected void |
initCipher(int opmode,
Key key,
SecureRandom random)
Is used by the engineInit methods and initializes the cipher. |
Methods inherited from class iaik.security.cipher.TripleDES |
engineDoFinal, engineDoFinal, engineGetBlockSize, engineGetIV, engineGetOutputSize, engineUnwrap, engineUpdate, engineUpdate, engineWrap, getModeBlockSize, toString |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Field Detail |
protected AlgorithmParameters params
Constructor Detail |
public PbeWithSHAAnd3_KeyTripleDES_CBC() throws NoSuchAlgorithmException, NoSuchPaddingException
Usually this constructor is not directly called for using the PbeWithSHAAnd3_KeyTripleDES_CBC algorithm for password-based encrypting some message. Rather
is used to get a PbeWithSHAAnd3_KeyTripleDES_CBC Cipher object. When dealing with PKCS#8 EncryptedPrivateKeyInfo, this algorithm is specified by its appertaining AlgorithmID, e.g.Cipher.getInstance("PbeWithSHAAnd3_KeyTripleDES_CBC")
causing a call to theepki.encrypt("password", AlgorithmID.pbeWithSHAAnd3_KeyTripleDES_CBC, null);
iaik.asn1.structures.AlgorithmID.getInstance()
method which in its turn calls
Cipher.getInstance(algorithmID.getName())
for actually
getting an implementation of the the PbeWithSHAAnd3_KeyTripleDES_CBC algorithm,
finally leading to this constructor.
NoSuchAlgorithmException
- if there is no implementation for 3DES-CBCNoSuchPaddingException
- if there is no implementaion for PKCS5PaddingCipher.getInstance(java.lang.String)
Method Detail |
public AlgorithmParameters engineGetParameters()
engineGetParameters
in class iaik.security.cipher.BufferedCipher
public void engineInit(int opmode, Key key, SecureRandom random) throws InvalidKeyException
engineInit
in class iaik.security.cipher.BufferedCipher
opmode
- Cipher.ENCRYPT_MODE or Cipher.DECRYPT_MODEkey
- the password as PBEKeyBMPrandom
- not needed - shall be nullInvalidKeyException
- if the key algorithm is not "PBE" or the format is not "RAW_BMP"public void engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
params
is of type PBEParameters,
created from salt (of 8 byte length) and iteration count as specified in PKCS#12.engineInit
in class iaik.security.cipher.BufferedCipher
opmode
- Cipher.ENCRYPT_MODE or Cipher.DECRYPT_MODEkey
- the password as PBEKeyBMPparams
- the algorithm parameters of type PBEParametersrandom
- not needed - shall be nullInvalidKeyException
- if the key algorithm is not "PBE" or the format is not "RAW_BMP"InvalidAlgorithmParameterException
- if the parameter is no instance of PBEParameterspublic void engineInit(int opmode, Key key, AlgorithmParameterSpec paramSpec, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
params
is of type PBEParameterSpec,
created from salt (of 8 byte length) and iteration count as specified in PKCS#12.
engineInit
in class iaik.security.cipher.BufferedCipher
opmode
- Cipher.ENCRYPT_MODE or Cipher.DECRYPT_MODEkey
- the password as PBEKeyBMPparams
- the algorithm parameters of type PBEParameterSpecrandom
- not needed - shall be nullInvalidKeyException
- if the key algorithm is not "PBE" or the format is not "RAW_BMP"InvalidAlgorithmParameterException
- if the parameter is no instance of PBEParameterSpecprotected void initCipher(int opmode, Key key, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException
public void engineSetPadding(String padding) throws NoSuchPaddingException
engineSetPadding
in class iaik.security.cipher.BufferedCipher
padding
- the name of the padding schemepublic void engineSetMode(String mode) throws NoSuchAlgorithmException
engineSetMode
in class iaik.security.cipher.BufferedCipher
mode
- the cipher modeprotected int engineGetKeySize(Key key) throws InvalidKeyException
CipherSpi
engineGetKeySize
in class iaik.security.cipher.BufferedCipher
|
This Javadoc may contain text parts from Internet Standard specifications (RFC 2459, 3280, 3039, 2560, 1521, 821, 822, 2253, 1319, 1321, ,2630, 2631, 2268, 3058, 2984, 2104, 2144, 2040, 2311, 2279, see copyright note) and RSA Data Security Public-Key Cryptography Standards (PKCS#1,3,5,7,8,9,10,12, see copyright note). | ||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: INNER | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |