Расшифровка AES не работает - PullRequest
0 голосов
/ 08 марта 2012

В моем проекте я работаю над шифрованием AES и расшифровкой. Я использовал этот алгоритм для шифрования и дешифрования строки и сохранения строки в базе данных sq-lite. Теперь я получаю этот зашифрованный ключ из базы данных и пытаюсь расшифровать егоно он показывает исключение (блок блока поврежден). Я преобразую зашифрованную строку в байты с помощью

 public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));}
    return data;
}

и получаю правильные байты, но при преобразовании в строку он показывает «блок блока поврежден».Заранее спасибо. Очень признателен, если найдете ответ.мой код

dh=new data_helper(Resy.this);
        mac_db=dh.getData();

//        getdata=mac_db.toString();

        KeyGenerator kgen;
        try {
            kgen = KeyGenerator.getInstance("AES");

             kgen.init(128); // 192 and 256 bits may not be available

  // Generate the secret key specs.
                SecretKey skey = kgen.generateKey();
                byte[] raw = skey.getEncoded();

                SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


                // Instantiate the cipher

                Cipher cipher = Cipher.getInstance("AES");
                         getdata=mac_db.toString();
//              byte g1[]=getdata.getBytes();
//              System.out.println(g1);

        byte b[]=hexStringToByteArray(getdata);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] m1=cipher.doFinal(b);   // here pad block corrupt exception came.
                String originalString_mac = new String(original_macadress);
                Toast.makeText(getApplicationContext(),"Original : " +originalString_mac + " " + asHex(original_macadress) , Toast.LENGTH_LONG).show();

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Сначала убедитесь, что ваши данные имеют правильную длину и нет ошибок в вашем шестнадцатеричном преобразовании.Далее вам нужно использовать тот же ключ для шифрования и дешифрования.Из приведенного выше кода похоже, что вы каждый раз генерируете новый ключ.Это не сработает: даже если расшифровка завершится успешно, вы получите что-то очень отличное от оригинального простого текста.Тогда Cipher cipher = Cipher.getInstance("AES"); может создать шифр с использованием случайного IV, который вам нужно будет расшифровать.Лучше указать явную строку преобразования, например, так:

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

Короче, найдите рабочий образец и начните с него.Что-то вроде это .

1 голос
/ 08 марта 2012

Вы должны выполнить его кодирование Base64, чтобы получить правильное шифрование / дешифрование AES.

Сделайте это следующим образом.

Для шифрования: Original String -> Aes encryption> base64кодировать ---> (зашифрованная строка)

Для дешифрования: зашифрованная строка ---> декодирование base64> дешифрование aes ---> Исходная строка

...