Skip to content

Commit e2e32df

Browse files
committed
fix prefix null string, add aescrypt
1 parent 786b7f6 commit e2e32df

File tree

9 files changed

+290
-213
lines changed

9 files changed

+290
-213
lines changed

app/src/androidTest/java/com/zeroone/concealexample/ExampleInstrumentedTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

app/src/main/java/com/zeroone/concealexample/MainActivity.java

Lines changed: 94 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -30,57 +30,111 @@ protected void onCreate(Bundle savedInstanceState) {
3030
super.onCreate(savedInstanceState);
3131
setContentView(R.layout.activity_main);
3232

33-
ConcealPrefRepository.applicationInit(getApplication(), false);
33+
ConcealPrefRepository.applicationInit(getApplication());
3434

35+
concealPrefRepository.clearPrefs();
36+
37+
38+
//FIRST TEST
39+
concealPrefRepository.putString(NAME_KEY, "HAFIQ IQMAL");
40+
concealPrefRepository.putInt(AGE_KEY, 24);
41+
42+
Log.d("FIRST TEST", concealPrefRepository.getString(NAME_KEY));
43+
Log.d("FIRST TEST",concealPrefRepository.getString(AGE_KEY));
44+
Log.d("FIRST TEST SIZE", ""+concealPrefRepository.getPrefsSize());
45+
46+
concealPrefRepository.clearPrefs();
47+
48+
//SECOND TEST
3549
new ConcealPrefRepository.Editor()
3650
.putString(NAME_KEY, "Hafiq Iqmal")
3751
.putInt(AGE_KEY, 24)
3852
.putString(EMAIL_KEY, "[email protected]")
3953
.apply();
4054

55+
Log.d("SECOND TEST", concealPrefRepository.getString(NAME_KEY));
56+
Log.d("SECOND TEST",concealPrefRepository.getString(AGE_KEY));
57+
Log.d("SECOND TEST SIZE", ""+concealPrefRepository.getPrefsSize());
58+
59+
60+
61+
concealPrefRepository.clearPrefs();
4162

4263
//add user details preferences
4364
new ConcealPrefRepository.UserPref("PREFIX").setFirstName("Firstname").setLastName("Lasname").setEmail("[email protected]").apply();
4465

4566
//get user details
46-
Log.d("TAG",new ConcealPrefRepository.UserPref("PREFIX").getFirstName());
47-
Log.d("TAG",new ConcealPrefRepository.UserPref().setDefault("No Data").getLastName());
48-
Log.d("TAG",new ConcealPrefRepository.UserPref().setDefault("No Data").getEmail());
49-
50-
51-
// Map<String,String> map =concealPrefRepository.getAllSharedPrefData();
52-
// for(Map.Entry<String,?> entry : map.entrySet()){
53-
// try {
54-
// Log.d("TAG",entry.getKey()+" :: "+entry.getValue().toString());
55-
// }
56-
// catch (Exception e){
57-
// e.printStackTrace();
58-
// }
59-
// }
60-
//
61-
// List<CryptoFile> cryptoFileList = concealPrefRepository.getAllConcealEncryptedFiles();
62-
// for (CryptoFile cryptoFile :cryptoFileList){
63-
// Log.d("TAG",cryptoFile.getFileName());
64-
// }
65-
//
66-
// Log.d("TAG",""+concealPrefRepository.getPrefsSize());
67-
//
68-
// ConcealCrypto concealCrypto = new ConcealCrypto.CryptoBuilder(this)
69-
// .setEnableCrypto(true) //default true
70-
// .setKeyChain(CryptoConfig.KEY_256) // CryptoConfig.KEY_256 or CryptoConfig.KEY_128
71-
// .createPassword("Mac OSX")
72-
// .create();
73-
//
74-
// String test = "Hello World";
75-
// String cipher = concealCrypto.obscure(test); //encrypt
76-
// Log.d("Display", cipher);
77-
// String dec = concealCrypto.deObscure(cipher); //decrypt
78-
// Log.d("Display", cipher+" ===== "+dec);
79-
//
80-
//
81-
// cipher = concealCrypto.obscureWithIteration(test,4); //encrypt with 4 times
82-
// Log.d("Display", cipher);
83-
// dec = concealCrypto.deObscureWithIteration(cipher,3); //decrypt with 4 times
84-
// Log.d("Display", cipher+" ===== "+dec);
67+
Log.d("THIRD_TEST",new ConcealPrefRepository.UserPref("PREFIX").getFirstName());
68+
Log.d("THIRD_TEST",new ConcealPrefRepository.UserPref().setDefault("No Data").getLastName());
69+
Log.d("THIRD_TEST",new ConcealPrefRepository.UserPref("PREFIX").setDefault("No Data").getEmail());
70+
Log.d("THIRD_TEST TEST SIZE", ""+concealPrefRepository.getPrefsSize());
71+
72+
73+
74+
concealPrefRepository.clearPrefs();
75+
76+
77+
ConcealPrefRepository.UserPref userPref = new ConcealPrefRepository.UserPref("PREFIX", "No Data");
78+
userPref.setUserName("afiqiqmal");
79+
userPref.setEmail("[email protected]");
80+
userPref.apply();
81+
82+
83+
//get user details
84+
Log.d("FOURTH_TEST",userPref.getUserName());
85+
Log.d("FOURTH_TEST",userPref.getEmail());
86+
87+
88+
89+
ConcealPrefRepository.DevicePref devicePref = new ConcealPrefRepository.DevicePref("PREFIX", "No Data");
90+
devicePref.setDeviceId("ABC123123123");
91+
devicePref.setDeviceOS("android");
92+
devicePref.apply();
93+
94+
95+
//get user details
96+
Log.d("FIFTH_TEST",devicePref.getDeviceId());
97+
Log.d("FIFTH_TEST",devicePref.getDeviceOs());
98+
99+
100+
101+
Map<String,String> map =concealPrefRepository.getAllSharedPrefData();
102+
for(Map.Entry<String,?> entry : map.entrySet()){
103+
try {
104+
Log.d("VIEW_ALL",entry.getKey()+" :: "+entry.getValue().toString());
105+
}
106+
catch (Exception e){
107+
e.printStackTrace();
108+
}
109+
}
110+
Log.d("VIEW ALL SIZE", ""+concealPrefRepository.getPrefsSize());
111+
112+
113+
ConcealCrypto concealCrypto = new ConcealCrypto.CryptoBuilder(this)
114+
.setEnableCrypto(true) //default true
115+
.setKeyChain(CryptoConfig.KEY_256) // CryptoConfig.KEY_256 or CryptoConfig.KEY_128
116+
.createPassword("Mac OSX")
117+
.create();
118+
119+
String test = "Hello World";
120+
String cipher = concealCrypto.obscure(test); //encrypt
121+
Log.d("CYRPTO TEST E", cipher);
122+
String dec = concealCrypto.deObscure(cipher); //decrypt
123+
Log.d("CYRPTO TEST D", dec);
124+
125+
test = "Hello World Iteration";
126+
cipher = concealCrypto.obscureWithIteration(test,4); //encrypt with 4 times
127+
Log.d("CYRPTO TEST E", cipher);
128+
dec = concealCrypto.deObscureWithIteration(cipher,4); //decrypt with 4 times
129+
Log.d("CYRPTO TEST D", dec);
130+
131+
132+
133+
cipher = concealCrypto.aesEncrypt("Hello World is World Hello Aes Cryption");
134+
Log.d("AES E", cipher);
135+
dec = concealCrypto.aesDecrypt(cipher);
136+
Log.d("AES D", dec);
137+
138+
85139
}
86140
}

app/src/test/java/com/zeroone/concealexample/ExampleUnitTest.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

library/src/androidTest/java/com/zeroone/conceal/ExampleInstrumentedTest.java

Lines changed: 0 additions & 26 deletions
This file was deleted.

library/src/main/java/com/zeroone/conceal/CipherUtils.java

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
import android.util.Base64;
44

55
import java.io.UnsupportedEncodingException;
6+
import java.util.Random;
7+
8+
import javax.crypto.Cipher;
9+
import javax.crypto.spec.IvParameterSpec;
10+
import javax.crypto.spec.SecretKeySpec;
611

712
/**
813
* @author : hafiq on 29/03/2017.
@@ -55,4 +60,90 @@ static String decode64WithIteration(String plaintext,int iteration){
5560

5661
return null;
5762
}
63+
64+
static String getRandomString(int length) {
65+
char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
66+
StringBuilder sb = new StringBuilder();
67+
Random random = new Random();
68+
for (int i = 0; i < length; i++) {
69+
char c = chars[random.nextInt(chars.length)];
70+
sb.append(c);
71+
}
72+
73+
return sb.toString();
74+
}
75+
76+
static String AesCrypt(String key, String iv, String data) {
77+
try {
78+
int CIPHER_KEY_LEN = 16;
79+
if (key.length() < CIPHER_KEY_LEN) {
80+
int numPad = CIPHER_KEY_LEN - key.length();
81+
82+
StringBuilder keyBuilder = new StringBuilder(key);
83+
for(int i = 0; i < numPad; i++){
84+
keyBuilder.append("0");
85+
}
86+
key = keyBuilder.toString();
87+
88+
} else if (key.length() > CIPHER_KEY_LEN) {
89+
key = key.substring(0, CIPHER_KEY_LEN); //truncate to 16 bytes
90+
}
91+
92+
93+
IvParameterSpec initVector = new IvParameterSpec(iv.getBytes("UTF-8"));
94+
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
95+
96+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
97+
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, initVector);
98+
99+
byte[] encryptedData = cipher.doFinal((data.getBytes()));
100+
101+
String base64_EncryptedData = Base64.encodeToString(encryptedData, Base64.DEFAULT);
102+
String base64_IV = Base64.encodeToString(iv.getBytes("UTF-8"), Base64.DEFAULT);
103+
104+
return Base64.encodeToString((base64_EncryptedData + ":" + base64_IV).getBytes("UTF-8"), Base64.DEFAULT);
105+
106+
} catch (Exception ex) {
107+
ex.printStackTrace();
108+
}
109+
110+
return null;
111+
}
112+
113+
static String AesDecrypt(String key, String data) {
114+
try {
115+
116+
int CIPHER_KEY_LEN = 16;
117+
if (key.length() < CIPHER_KEY_LEN) {
118+
int numPad = CIPHER_KEY_LEN - key.length();
119+
120+
StringBuilder keyBuilder = new StringBuilder(key);
121+
for(int i = 0; i < numPad; i++){
122+
keyBuilder.append("0");
123+
}
124+
key = keyBuilder.toString();
125+
126+
} else if (key.length() > CIPHER_KEY_LEN) {
127+
key = key.substring(0, CIPHER_KEY_LEN); //truncate to 16 bytes
128+
}
129+
130+
String[] parts = new String(Base64.decode(data, Base64.DEFAULT)).split(":");
131+
132+
IvParameterSpec iv = new IvParameterSpec(Base64.decode(parts[1], Base64.DEFAULT));
133+
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
134+
135+
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
136+
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
137+
138+
byte[] decodedEncryptedData = Base64.decode(parts[0], Base64.DEFAULT);
139+
140+
byte[] original = cipher.doFinal(decodedEncryptedData);
141+
142+
return new String(original);
143+
} catch (Exception ex) {
144+
ex.printStackTrace();
145+
}
146+
147+
return null;
148+
}
58149
}

library/src/main/java/com/zeroone/conceal/ConcealCrypto.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.lang.ref.WeakReference;
2626
import java.security.MessageDigest;
2727
import java.security.NoSuchAlgorithmException;
28+
import java.util.Random;
2829

2930
import static com.zeroone.conceal.model.Constant.DEFAULT_DIRECTORY;
3031
import static com.zeroone.conceal.model.Constant.DEFAULT_FILES_FOLDER;
@@ -39,17 +40,17 @@
3940
public class ConcealCrypto {
4041

4142
private Crypto crypto;
42-
private Context mContext;
4343
private KeyChain keyChain;
4444
private Entity mEntityPassword = Entity.create(BuildConfig.APPLICATION_ID);
45+
private String mEntityPasswordRaw = null;
4546
private boolean enableCrypto=true;
4647
private boolean enableHashKey =true;
4748
private String MAIN_DIRECTORY;
4849

4950
private ConcealCrypto(CryptoBuilder builder){
5051
crypto = builder.crypto;
51-
mContext = builder.context.get();
5252
mEntityPassword = builder.mEntityPassword;
53+
mEntityPasswordRaw = builder.mEntityPasswordRaw;
5354
enableCrypto = builder.mEnabledCrypto;
5455
enableHashKey = builder.mEnableHashKey;
5556
MAIN_DIRECTORY = builder.mFolderName;
@@ -322,6 +323,14 @@ public String deObscureWithIteration(String cipher,int iteration){
322323
return plainText;
323324
}
324325

326+
public String aesEncrypt(String plainText) {
327+
return CipherUtils.AesCrypt(mEntityPasswordRaw, CipherUtils.getRandomString(16) ,plainText);
328+
}
329+
330+
public String aesDecrypt(String plainText) {
331+
return CipherUtils.AesDecrypt(mEntityPasswordRaw , plainText);
332+
}
333+
325334
public static class CryptoBuilder{
326335
private WeakReference<Context> context;
327336
private KeyChain makeKeyChain;

0 commit comments

Comments
 (0)