]> git.argeo.org Git - lgpl/argeo-commons.git/blob - PasswordBasedEncryptionTest.java
95d2db2305ea2c7dff4fc9a29f27618cc605b849
[lgpl/argeo-commons.git] / PasswordBasedEncryptionTest.java
1 package org.argeo.util.crypto;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.InputStream;
6 import java.security.AlgorithmParameters;
7
8 import javax.crypto.Cipher;
9 import javax.crypto.CipherInputStream;
10 import javax.crypto.CipherOutputStream;
11 import javax.crypto.SecretKey;
12 import javax.crypto.SecretKeyFactory;
13 import javax.crypto.spec.IvParameterSpec;
14 import javax.crypto.spec.PBEKeySpec;
15 import javax.crypto.spec.PBEParameterSpec;
16 import javax.crypto.spec.SecretKeySpec;
17
18 import junit.framework.TestCase;
19
20 import org.argeo.StreamUtils;
21 import org.argeo.util.crypto.PasswordBasedEncryption;
22
23 public class PasswordBasedEncryptionTest extends TestCase {
24 public void testEncryptDecrypt() {
25 final String password = "test long password since they are more powerful";
26 PasswordBasedEncryption pbeEnc = new PasswordBasedEncryption(
27 password.toCharArray());
28 String message = "Hello World!";
29 byte[] encrypted = pbeEnc.encryptString(message);
30 // System.out.println("Encrypted: '" + new String(encrypted) + "'");
31 PasswordBasedEncryption pbeDec = new PasswordBasedEncryption(
32 password.toCharArray());
33 InputStream in = null;
34 in = new ByteArrayInputStream(encrypted);
35 String decrypted = pbeDec.decryptAsString(in);
36 // System.out.println("Decrypted: '" + decrypted + "'");
37 StreamUtils.closeQuietly(in);
38 assertEquals(message, decrypted);
39 }
40
41 public void testPBEWithMD5AndDES() throws Exception {
42 String password = "test";
43 String message = "Hello World!";
44
45 byte[] salt = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
46 (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };
47
48 int count = 1024;
49
50 String cipherAlgorithm = "PBEWithMD5AndDES";
51 String secretKeyAlgorithm = "PBEWithMD5AndDES";
52 SecretKeyFactory keyFac = SecretKeyFactory
53 .getInstance(secretKeyAlgorithm);
54 PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
55 PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, count);
56 SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
57 Cipher ecipher = Cipher.getInstance(cipherAlgorithm);
58 ecipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
59 Cipher dcipher = Cipher.getInstance(cipherAlgorithm);
60 dcipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);
61
62 byte[] encrypted = ecipher.doFinal(message.getBytes());
63 byte[] decrypted = dcipher.doFinal(encrypted);
64 assertEquals(message, new String(decrypted));
65
66 }
67
68 public void testPBEWithSHA1AndAES() throws Exception {
69 String password = "test";
70 String message = "Hello World!";
71
72 byte[] salt = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
73 (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };
74 byte[] iv = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
75 (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99,
76 (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
77 (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };
78
79 int count = 1024;
80 // int keyLength = 256;
81 int keyLength = 128;
82
83 String cipherAlgorithm = "AES/CBC/PKCS5Padding";
84 String secretKeyAlgorithm = "PBKDF2WithHmacSHA1";
85 SecretKeyFactory keyFac = SecretKeyFactory
86 .getInstance(secretKeyAlgorithm);
87 PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt,
88 count, keyLength);
89 SecretKey tmp = keyFac.generateSecret(pbeKeySpec);
90 SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
91 Cipher ecipher = Cipher.getInstance(cipherAlgorithm);
92 ecipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(iv));
93
94 // decrypt
95 keyFac = SecretKeyFactory.getInstance(secretKeyAlgorithm);
96 pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, count,
97 keyLength);
98 tmp = keyFac.generateSecret(pbeKeySpec);
99 secret = new SecretKeySpec(tmp.getEncoded(), "AES");
100 // AlgorithmParameters params = ecipher.getParameters();
101 // byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
102 Cipher dcipher = Cipher.getInstance(cipherAlgorithm);
103 dcipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
104
105 byte[] encrypted = ecipher.doFinal(message.getBytes());
106 byte[] decrypted = dcipher.doFinal(encrypted);
107 assertEquals(message, new String(decrypted));
108
109 ByteArrayOutputStream out = new ByteArrayOutputStream();
110 CipherOutputStream cipherOut = new CipherOutputStream(out, ecipher);
111 cipherOut.write(message.getBytes());
112 StreamUtils.closeQuietly(cipherOut);
113 byte[] enc = out.toByteArray();
114
115 ByteArrayInputStream in = new ByteArrayInputStream(enc);
116 CipherInputStream cipherIn = new CipherInputStream(in, dcipher);
117 ByteArrayOutputStream dec = new ByteArrayOutputStream();
118 StreamUtils.copy(cipherIn, dec);
119 assertEquals(message, new String(dec.toByteArray()));
120 }
121 }