Не удается расшифровать AES на Android? - PullRequest
2 голосов
/ 22 июля 2011

Я новичок в android dev, сейчас я внедрил AES на Android, и он мог зашифровывать строки с помощью пользовательских паролей.Шифрование кажется нормальным, и в нем могут отсутствовать строки в кодировке Base64 / Hex.

Но когда я пытаюсь его расшифровать, возникает проблема: при дешифровании упущение всегда показывает мне кучу грязных символов.

Чтобы избавиться от него, я попытался отладить его, определив набор символов (например, UTF-8) при приведении строки к байту [], но без попадания, а также попытался закодировать пропуск с помощью base 64.или Hex, но оба они потерпели неудачу.

Я также пытался определить AES / CBC / PKCS5Padding или просто AES при использовании метода cipher.getInstance, но по-прежнему не подходит.

Это довольно раздражает, не могли бы вы, ребята, помочь мне, пожалуйста?

Забыл упомянуть, что я однажды задал похожий вопрос https://stackoverflow.com/questions/6727255/aes-decryption-on-android-not-correct, проблема с грамматикой там была исправлена.

А вот код:

ДляШифрование

public String AESEncrypt(String sKey, String PlainMsg)
                throws Exception {
            //Try use some Android based alert dialog to catch this exception.
            if (sKey == null) {
                Log.e("SecureChat", "IllegalArgumentException Catched");
                throw new IllegalArgumentException ("NULL Secret NOT ALLOWED!");
            }           
            /*Old Method
            //byte[] rawKey = getRawKey(sKey.getBytes("UTF-8"));
            byte[] rawKey = getRawKey(sKey.getBytes());
            //Encrypt start
            SecretKeySpec keySpec = new SecretKeySpec(rawKey, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            //byte[] cipherText = cipher.doFinal(PlainMsg.getBytes("UTF-8"));
            byte[] cipherText = cipher.doFinal(PlainMsg.getBytes());
            return Base64Encoded(cipherText);
            */
            //New Method
            byte[] salt = getSalt();
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
            KeySpec spec = new PBEKeySpec(sKey.toCharArray(), salt, 1024, 256); 
            SecretKey tmp = factory.generateSecret(spec);
            SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
            //Encryption Process
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secret);
            byte[] cipherText = cipher.doFinal(PlainMsg.getBytes());
            //return Base64Encoded(cipherText);
            //Hex
            return toHex(cipherText);
        }

Для расшифровки

public String AESDecrypt(String sKey, String EncryptMsg)
                throws Exception {          
            /*Old Method
            //byte[] rawKey = getRawKey(sKey.getBytes("UTF-8"));
            byte[] rawKey = getRawKey(sKey.getBytes());
            SecretKeySpec keySpec = new SecretKeySpec(rawKey, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
            //byte[] plainText = Base64Decoded(EncryptMsg.getBytes("UTF-8"));
            byte[] plainText = Base64Decoded(EncryptMsg);           
            cipher.doFinal(plainText);
            return new String(plainText, "UTF-8");
            */
            //New Method
            byte[] salt = getSalt();
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
            KeySpec spec = new PBEKeySpec(sKey.toCharArray(), salt, 1024, 256); 
            SecretKey tmp = factory.generateSecret(spec);
            SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
            //byte[] bCipherText = Base64Decoded(EncryptMsg);
            //Hex
            byte[] bCipherText = toByte(EncryptMsg);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secret);
            cipher.doFinal(bCipherText);
            return new String(bCipherText);
        }

        private byte[] getSalt() throws NoSuchAlgorithmException {
            /*Mark for old key method
            //Initialize the KeyGenerator
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
            //Init for 256bit AES key
            kgen.init(Constants.AES_KEY_SIZE, sr);;
            SecretKey secret = kgen.generateKey();
            //Get secret raw key
            byte[] rawKey = secret.getEncoded();
            return rawKey;
            */

            //New key method with some salt
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            byte[] ransalt = new byte[20];
            random.nextBytes(ransalt);
            return ransalt;
        }

        @Override
        public byte[] getRawKey(byte[] seed) throws Exception {
            /*Old Method
            //Initialize the KeyGenerator
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
            //Init for 256bit AES key
            kgen.init(Constants.AES_KEY_SIZE, sr);
            SecretKey secret = kgen.generateKey();
            //Get secret raw key
            byte[] rawKey = secret.getEncoded();
            return rawKey;
            */
            return null;
        }
/**
 * 
 * @param toBeDecoded
 * @return
 */
        public byte[] Base64Decoded(String toBeDecoded) {
            byte[] decoded = Base64.decode(toBeDecoded, 0);
            return decoded;
        }

        //Hex Mode
        public String toHex(String txt) {
            return toHex(txt.getBytes());
        }
        public String fromHex(String hex) {
            return new String(toByte(hex));
        }

        public 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 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 String HEX = "0123456789ABCDEF";
        private void appendHex(StringBuffer sb, byte b) {
            sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
        }


    }

Я ссылался / сравнивал с этим кодом в Stackoverflow: Неисправен блок панели шифрования Android aes и неверноРасшифровка с использованием AES / CBC / PKCS5Padding в Android

Кажется, что моя проблема заключается в кодировке кодировки, но я не могу выяснить, где проблема.

Любые комментарии / ответы оченьоценили!Спасибо за помощь!

1 Ответ

0 голосов
/ 30 июля 2011

Этот код, который я написал, работает безупречно.Посмотрите на эту ссылку ниже:

http://pocket -for-android.1047292.n5.nabble.com / Метод шифрования и чтение-Dropbox-backup-td4344194.html # a4454327

Не слишком внимательно изучая ваш код, я бы посоветовал вам указать здесь кодировку, хотя я не уверен, является ли это причиной ваших проблем:

byte[] cipherText = cipher.doFinal(PlainMsg.getBytes());

издесь:

return new String(bCipherText);
...