Android-шифрование - PullRequest
       15

Android-шифрование

0 голосов
/ 27 января 2011

Я хочу зашифровать / расшифровать некоторые пароли в базе данных SQLite моего приложения.Для этого я искал в интернете и нашел алгоритм AES.У меня есть этот код:

public String encript(String dataToEncrypt)
        throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
    // I'm using AES encription

    if(!dataToEncrypt.equals("")){
        String key = "FMVWf8d_sm#fz";

        Cipher c = Cipher.getInstance("AES");
        SecretKeySpec k;
        try {
            k = new SecretKeySpec(key.getBytes(), "AES");
            c.init(Cipher.ENCRYPT_MODE, k);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }


        return new String(c.doFinal(Base64.decode(dataToEncrypt)));
    }
    return "";
}

public String decript(String encryptedData)
        throws NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidKeyException, IllegalBlockSizeException, BadPaddingException {

    if(!encryptedData.equals("")){
        String key = "FMVWf8d_sm#fz";

        Cipher c = Cipher.getInstance("AES");
        SecretKeySpec k = new SecretKeySpec(Base64.decode(key), "AES");
        c.init(Cipher.DECRYPT_MODE, k);
        return new String(c.doFinal(Base64.decode(encryptedData)));
    }
    return "";
}

После выполнения этого я получаю эту ошибку при методе шифрования:

01-27 14: 50: 51.698: ОШИБКА / АКТИВНОСТЬ (782):java.security.InvalidKeyException: длина ключа не 128/192/256 битов.

Я видел некоторые другие случаи здесь на stackoverflow, но я хочу дать ключ AES, чтобы не генерировать его ...

Может ли кто-нибудь помочь мне с этим?Если есть другой способ шифрования, но без использования других jar-файлов или внешних классов, и позвольте мне дать ключ.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Сообщение об ошибке совершенно ясно: ваш ключ шифрования должен иметь определенный размер: 128, 192 или 256 бит.И твой ключ 104 бит.Обратите внимание: поскольку вы хотите использовать в ключе только печатаемые символы, длина ключа должна составлять 192 или более битов, поскольку ваш алфавит (набор символов, который вы используете) делает шифрование более слабым.

1 голос
/ 27 января 2011

Обычная практика такова:

  1. Получить пароль (в вашем случае String key = "FMVWf8d_sm#fz";)
  2. Генерация с использованием некоторой хэш-функции с длиной 128, 192 или 256
  3. Поместите его в алгоритм шифрования
  4. Получайте удовольствие

Итак, вам не хватает этапа генерации ключа.Делать что-то вроде:

       // Get the KeyGenerator

       KeyGenerator 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");

       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

       byte[] encrypted =
         cipher.doFinal((args.length == 0 ?
          "This is just an example" : args[0]).getBytes());
       System.out.println("encrypted string: " + asHex(encrypted));

       cipher.init(Cipher.DECRYPT_MODE, skeySpec);
       byte[] original =
         cipher.doFinal(encrypted);
       String originalString = new String(original);
       System.out.println("Original string: " +
         originalString + " " + asHex(original));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...