1 package org.wiztools.wizcrypt;
2
3 import java.io.UnsupportedEncodingException;
4 import java.security.InvalidKeyException;
5 import java.security.MessageDigest;
6 import java.security.NoSuchAlgorithmException;
7 import java.util.ResourceBundle;
8 import javax.crypto.Cipher;
9 import javax.crypto.NoSuchPaddingException;
10 import javax.crypto.SecretKey;
11 import javax.crypto.spec.SecretKeySpec;
12 import static org.wiztools.wizcrypt.WizCryptAlgorithms.PWD_HASH;
13 import static org.wiztools.wizcrypt.WizCryptAlgorithms.STR_ENCODE;
14 import static org.wiztools.wizcrypt.WizCryptAlgorithms.CRYPT_ALGO;
15
16 /***
17 * This class has static methods to create <code>CipherKey</code> objects.
18 * @see CipherKey
19 * @see WizCrypt
20 */
21 public final class CipherKeyGen{
22
23 /*** Disallow public creation of instances of this class. */
24 private CipherKeyGen(){
25 }
26
27 private static byte[] passHash(final byte[] passKey)
28 throws NoSuchAlgorithmException,
29 UnsupportedEncodingException{
30 MessageDigest md = MessageDigest.getInstance(PWD_HASH);
31 md.update(passKey);
32 byte[] raw = md.digest();
33 return raw;
34 }
35
36 private static CipherKey getCipherKey(final String keyStr, final int mode)
37 throws NoSuchAlgorithmException,
38 UnsupportedEncodingException,
39 InvalidKeyException,
40 NoSuchPaddingException{
41 byte[] passKeyHash = null;
42 Cipher cipher = null;
43
44 byte[] passKey = keyStr.getBytes(STR_ENCODE);
45
46 SecretKey key = new SecretKeySpec(passKey, CRYPT_ALGO);
47 cipher = Cipher.getInstance(CRYPT_ALGO);
48 cipher.init(mode, key);
49 passKeyHash = CipherKeyGen.passHash(passKey);
50
51 CipherKey ck = new CipherKey(cipher, passKeyHash);
52
53 return ck;
54 }
55
56 /***
57 * This is the public API used for getting the <code>CipherKey</code> object
58 * used in <code>WizCrypt</code> public APIs.
59 *
60 * @param keyStr The password used for creating the cipher.
61 * @throws NoSuchAlgorithmException When the Algorithm used by WizCrypt (RC4) is not found in JVM. This is highly unlikely, because SUN JVM has this.
62 * @throws UnsupportedEncodingException Password provided is encoded using UTF-8. If UTF-8 encoder is not available in JVM, this exception is thrown. This exception is not likely to happen.
63 * @throws InvalidKeyException The key should be of specific size. If this size limits are not met, <code>InvalidKeyException</code> exception is thrown.
64 * @throws NoSuchPaddingException This exception is thrown when a particular padding mechanism is requested but is not available in the environment. This also is also highly unlikely to happen.
65 * @return Returns the initialized <code>CipherKey</code> object for encryption.
66 * @see WizCrypt#encrypt(InputStream is, OutputStream os, CipherKey ce)
67 * @see CipherKey
68 */
69 public static CipherKey getCipherKeyForEncrypt(final String keyStr)
70 throws NoSuchAlgorithmException,
71 UnsupportedEncodingException,
72 InvalidKeyException,
73 NoSuchPaddingException{
74 return getCipherKey(keyStr, Cipher.ENCRYPT_MODE);
75 }
76
77 /***
78 * This is the public API used for getting the <code>CipherKey</code> object
79 * used in <code>WizCrypt</code> public APIs.
80 *
81 * @param keyStr The password used for creating the cipher.
82 * @throws NoSuchAlgorithmException When the Algorithm used by WizCrypt (RC4) is not found in JVM. This is highly unlikely, because SUN JVM has this.
83 * @throws UnsupportedEncodingException Password provided is encoded using UTF-8. If UTF-8 encoder is not available in JVM, this exception is thrown. This exception is not likely to happen.
84 * @throws InvalidKeyException The key should be of specific size. If this size limits are not met, <code>InvalidKeyException</code> exception is thrown.
85 * @throws NoSuchPaddingException This exception is thrown when a particular padding mechanism is requested but is not available in the environment. This also is also highly unlikely to happen.
86 * @return Returns the initialized <code>CipherKey</code> object for decryption.
87 * @see WizCrypt#decrypt(InputStream is, OutputStream os, CipherKey ce)
88 * @see CipherKey
89 */
90 public static CipherKey getCipherKeyForDecrypt(final String keyStr)
91 throws NoSuchAlgorithmException,
92 UnsupportedEncodingException,
93 InvalidKeyException,
94 NoSuchPaddingException{
95 return getCipherKey(keyStr, Cipher.DECRYPT_MODE);
96 }
97 }