· 7 years ago · Mar 14, 2018, 05:40 AM
1import java.security.Key;
2import java.security.KeyPair;
3import java.security.KeyPairGenerator;
4import java.security.SecureRandom;
5import java.security.interfaces.RSAPrivateCrtKey;
6import java.security.interfaces.RSAPrivateKey;
7import java.security.interfaces.RSAPublicKey;
8import java.security.spec.RSAKeyGenParameterSpec;
9
10import javax.crypto.Cipher;
11import javax.crypto.KeyGenerator;
12import javax.crypto.SecretKey;
13import javax.crypto.SecretKeyFactory;
14import javax.crypto.spec.PBEKeySpec;
15import javax.crypto.spec.SecretKeySpec;
16
17public class Tutorial2 {
18
19 public byte[] generateRandomWithDRBG(int len) throws Exception {
20 byte[] bytes = new byte[len];
21
22 SecureRandom drbg = SecureRandom.getInstance("DRBG");
23 // if not seeded, the first call to nextBytes() will force it to
24 // seed itself from an implementation-specific entropy source.
25 drbg.nextBytes(bytes);
26
27 return bytes;
28
29 }
30
31 // Generate 128-bit AES key
32 public SecretKey generateAesKey(int keyBitLen) throws Exception {
33 // init CSPRNG
34 SecureRandom sRandom = new SecureRandom();
35
36 // generate AES Key
37 KeyGenerator keyGen = KeyGenerator.getInstance("AES");
38 keyGen.init(keyBitLen, sRandom);
39 SecretKey key = keyGen.generateKey();
40
41 // display AES key in dex
42 //System.out.println(toHex(key.getEncoded()));
43
44 return key;
45 }
46
47 //Generate 1024-bit RSA key-pair
48/* public KeyFair generateRSAKeyFair(int keyBitLen) throws Exception
49 {
50 // init CSPRNG
51 SecureRandom sRandom = new SecureRandom();
52
53 //generate RSA key pair
54 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
55 RSAKeyGenParameterSpec rsaSpec =
56 new RSAKeyGenParameterSpec(keyBitLen, RSAKeyGenParameterSpec.F4);
57 keyGen.initialize(rsaSpec,sRandom);
58 KeyPair keypair = keyGen.generateKeyPair();
59
60 // display RSA public key in decimal
61 RSAPublicKey publicKey = (RSAPublicKey)keypair.getPublic();
62 System.out.println(publicKey.getPublicExponent().toString());
63 System.out.println(publicKey.getModulus().toString());
64
65 //display RSA private key n decimal
66 RSAPrivateKey privateKey = (RSAPrivateCrtKey)keypair.getPrivate();
67 System.out.println(privateKey.getPrivateExponent().toString());
68 System.out.println(privateKey.getModulus().toString());
69
70 return keypair;
71 }*/
72
73
74 //AES key-wrap
75 public byte[] wrapKeyWithAESkey(Key key, SecretKey KEK) throws Exception
76 {
77 // init cipher
78 Cipher cipher = Cipher.getInstance("AESWRAP");
79 cipher.init(Cipher.WRAP_MODE,KEK);
80
81 //wrap key
82 byte[] wrappedKey = cipher.wrap(key);
83
84 //display wrapped key in hex
85 //System.out.println(toHex(wrappedKey));
86
87 return wrappedKey;
88 }
89
90 //Unwrap key protected with AES key-wrap
91 public Key unwrapKeyWIthAESKey(byte[] wrappedKey, SecretKey KEK) throws Exception
92 {
93 // init cipher
94 Cipher cipher = Cipher.getInstance("AESWrap");
95 cipher.init(Cipher.UNWRAP_MODE, KEK);
96
97 // unwrap key
98 Key key = cipher.unwrap(wrappedKey, "AES", Cipher.SECRET_KEY);
99
100 return key;
101 }
102
103 //PBKDF2 to derive an AES key from a user password
104 public SecretKey derieveAESkeyFromPdkdf2(char[] passwd, byte[] salt, int iteration, int keyLen) throws Exception
105 {
106 // init PDKDF2
107 SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PDKDF2WithHmacSHA256");
108 PBEKeySpec keySpec = new PBEKeySpec(passwd, salt, iteration, keyLen);
109
110 //derieve secret key
111 SecretKey s = keyFac.generateSecret(keySpec);
112 SecretKey key = new SecretKeySpec(s.getEncoded(),"AES");
113
114 return key;
115 }
116
117}