AES key generation in Android

前端 未结 2 1144
不知归路
不知归路 2021-01-01 08:04

Currently I am working in generating a key for AES encryption/decryption. The key is based on a password an a random salt per user. My first idea was to made a SecretKeyFact

相关标签:
2条回答
  • 2021-01-01 08:10

    Try this:

    public static String encrypt(String seed, String cleartext) throws Exception {
                   byte[] rawKey = getRawKey(seed.getBytes("UTF-16"));
                   byte[] result = encrypt(rawKey, cleartext.getBytes("UTF-16"));
                   return toHex(result);
           }
           
           public static String decrypt(String seed, String encrypted) throws Exception {
                   byte[] rawKey = getRawKey(seed.getBytes("UTF-16"));
                   byte[] enc = toByte(encrypted);
                   byte[] result = decrypt(rawKey, enc);
                   return new String(result);
                  }
    
           private static byte[] getRawKey(byte[] seed) throws Exception {
                   KeyGenerator kgen = KeyGenerator.getInstance("AES");
                   SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
                   sr.setSeed(seed);
               kgen.init(128, sr); // 192 and 256 bits may not be available
               SecretKey skey = kgen.generateKey();
               byte[] raw = skey.getEncoded();
               return raw;
           }
    
           
           private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
               SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                   Cipher cipher = Cipher.getInstance("AES");
               cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
               byte[] encrypted = cipher.doFinal(clear);
                   return encrypted;
           }
    
           private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
               SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
                   Cipher cipher = Cipher.getInstance("AES");
               cipher.init(Cipher.DECRYPT_MODE, skeySpec);
               byte[] decrypted = cipher.doFinal(encrypted);
                   return decrypted;
           }
    
           public static String toHex(String txt) {
                   return toHex(txt.getBytes());
           }
           public static String fromHex(String hex) {
                   return new String(toByte(hex));
           }
           
           public static byte[] toByte(String hexString) {
                   int len = hexString.length()/2;
                   byte[] result = new byte[len];
                   for (int i = 0; i < len; i++)
                           result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
                   return result;
           }
    
           public static String toHex(byte[] buf) {
                   if (buf == null)
                           return "";
                   StringBuffer result = new StringBuffer(2*buf.length);
                   for (int i = 0; i < buf.length; i++) {
                           appendHex(result, buf[i]);
                   }
                   return result.toString();
           }
           private final static String HEX = "0123456789ABCDEF";
           private static void appendHex(StringBuffer sb, byte b) {
                   sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
           }
           
    
    0 讨论(0)
  • 2021-01-01 08:12

    As the name says, "PBEWITHSHA256AND256BITAES-CBC-BC" will use SHA256 as HMAC, instead if using SHA1. Because this is a different algorithm, it will generate a different Key for the chosen password.

    If you en/decrypt only on android, this should be fine.

    0 讨论(0)
提交回复
热议问题