2014-09-26 3 views
1

EDIT ::: Код в вопросе работает, но для возврата к активности после съемки изображения требуется около 10 секунд. Я отказался от этого подхода и использовал библиотеку Facebook для скрытия и шифрования изображений. Ссылка на решение Facebook,: Facebook Conceal - Image Encryption and DecryptionПравильный способ шифрования и дешифрования изображения с использованием AES


Я посмотрел на много примеров, но все еще не мог придумать способ, чтобы получить шифрование и дешифрование право. Я думал, что правильно понял, когда использовал какой-то случайный код в Интернете, но при декодировании я получаю исключение BadPadding.

Итак, я пытаюсь это исправить. Я следую приведенному ниже вопросу, как это было предложено большинством людей на SO (но этот код показывает, как зашифровать строку). Может ли кто-нибудь помочь мне в шифровании и расшифровке изображения? Будет ли код в вопросе работать для изображений?

Ссылка на вопрос: Java 256-bit AES Password-Based Encryption

Вот что я сделал до сих пор:

// Глобальный ArrayList для хранения IV и шифра

static ArrayList<byte[]> ivandcipher = new ArrayList<byte[]>(); 

// Генерация ключа

public static SecretKey generateKey() throws NoSuchAlgorithmException { 

    char[] password = { 'a', 'b', 'c', 'd', 'e' }; 
    byte[] salt = { 1, 2, 3, 4, 5 }; 

    SecretKeyFactory factory = SecretKeyFactory 
      .getInstance("PBKDF2WithHmacSHA1"); 
    KeySpec spec = new PBEKeySpec(password, salt, 65536, 256); 
    SecretKey tmp = null; 
    try { 
     tmp = factory.generateSecret(spec); 
    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 

    yourKey = new SecretKeySpec(tmp.getEncoded(), "AES"); 

    return yourKey; 
} 

// Кодирующий файл

// байт [] FileData, содержит растровое изображение (изображение) преобразуется в байт []

public static ArrayList<byte[]> encodeFile(SecretKey yourKey, byte[] fileData) 
     throws Exception { 

    byte[] encrypted = null; 

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, yourKey); 
    AlgorithmParameters params = cipher.getParameters(); 
    byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
    encrypted = cipher.doFinal(fileData); 

    ivandcipher.clear(); 
    ivandcipher.add(iv); 
    ivandcipher.add(encrypted); 

    return ivandcipher; 
} 

Почему я и добавление IV зашифрованное байт [] S в ivandcipher. Потому что, как показывает ответ в ссылке, я должен использовать один и тот же iv при расшифровке.

// Decode файл

// Я называю перегруженный метод decodeFile внутри этого метода .. обратите внимание

private Bitmap decodeFile(String filename) { 

    try { 
     yourKey = generateKey(); 
    } catch (NoSuchAlgorithmException e1) { 
     e1.printStackTrace(); 
    } 

    try { 
     byte[] decodedData = decodeFile(yourKey, readFile(filename)); 
     Bitmap bitmap = bytesToBitmap(decodedData); 

     return bitmap; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

// перегруженный метод decodeFile

public static byte[] decodeFile(SecretKey yourKey, byte[] fileData) 
     throws Exception { 

    byte[] decrypted = null; 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    cipher.init(Cipher.DECRYPT_MODE, yourKey, new IvParameterSpec(ivandcipher.get(0))); 
    decrypted = cipher.doFinal(fileData); 
    return decrypted; 
} 

Я думаю, проблема с fileData [], что я не могу зашифровать и дешифровать правильно. Для строк, как показано в ответе приведенной выше ссылке, т.е.

byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

, что должно быть дано в качестве параметра для cipher.doFinal()?

Сообщите мне, если вам нужен какой-либо другой код.

+0

любая причина для downvote? Я понимаю, что это было задано много раз, но я не мог получить правильное кодирование и дешифрование для моих изображений. –

+0

Причина в том, что вы скопировали «некоторый случайный код в Интернете», не получили его на работу, и теперь мы должны его исправить. – ntoskrnl

+0

@ntoskrnl, я не прошу никого исправить это. Я прошу вас помочь в понимании этого и заставить его работать. И, кстати, код, который я разместил в вопросе, не является случайным, его из ссылки, которую я разместил в вопросе. –

ответ

0

Код в вопросе работает, но требуется около 10 секунд для возврата к активности после того, как изображение будет снято с камеры. Я отказался от этого подхода и использовал библиотеку Facebook для скрытия и шифрования изображений. Ссылка на Facebook Решение: Facebook Conceal - Image Encryption and Decryption

+0

Я считаю, что ваша проблема заключается в том, что вы пытаетесь зашифровать и дешифровать в потоке пользовательского интерфейса, что может объяснить задержку в 10 секунд. –

1

Вы пытаетесь сделать слишком много сразу и теряетесь во всех деталях.

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

byte[] key = { 1, 2, 3, ... 14, 15, 16 }; 
byte[] IV = { 5, 5, 5, ... 5, 5, 5 }; 
String plaintext = "This is a secret message." 

Теперь сократить код для шифрования и дешифрования, что текст сообщения обратно в читаемую текстовой строку.

Если у вас есть эта маленькая программа, работающая правильно, добавьте другие осложнения по одному за раз. На каждом этапе проверьте еще раз, что ваш код может успешно шифровать и дешифровать. Я предлагаю вам начать с добавления части SecretKeyFactory и закончить чтение и запись файлов.

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

4

Изображения могут быть легко зашифрованы и дешифрованы с использованием библиотек Java. Я представляю вам два отдельных кода, используя два разных метода шифрования и дешифрования. Следующие коды также могут быть расширены для использования в pdf-файлах.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.security.Key; 
import java.security.NoSuchAlgorithmException; 

import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 

public class ImageEncDec { 

    public static byte[] getFile() { 

     File f = new File("/home/bridgeit/Desktop/Olympics.jpg"); 
     InputStream is = null; 
     try { 
      is = new FileInputStream(f); 
     } catch (FileNotFoundException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     byte[] content = null; 
     try { 
      content = new byte[is.available()]; 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try { 
      is.read(content); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return content; 
    } 

    public static byte[] encryptPdfFile(Key key, byte[] content) { 
     Cipher cipher; 
     byte[] encrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, key); 
      encrypted = cipher.doFinal(content); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return encrypted; 

    } 

    public static byte[] decryptPdfFile(Key key, byte[] textCryp) { 
     Cipher cipher; 
     byte[] decrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, key); 
      decrypted = cipher.doFinal(textCryp); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return decrypted; 
    } 

    public static void saveFile(byte[] bytes) throws IOException { 

     FileOutputStream fos = new FileOutputStream("/home/bridgeit/Desktop/Olympics-new.jpg"); 
     fos.write(bytes); 
     fos.close(); 

    } 

    public static void main(String args[]) 
      throws NoSuchAlgorithmException, InstantiationException, IllegalAccessException, IOException { 

     KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); 
     keyGenerator.init(128); 
     Key key = keyGenerator.generateKey(); 
     System.out.println(key); 

     byte[] content = getFile(); 
     System.out.println(content); 

     byte[] encrypted = encryptPdfFile(key, content); 
     System.out.println(encrypted); 

     byte[] decrypted = decryptPdfFile(key, encrypted); 
     System.out.println(decrypted); 

     saveFile(decrypted); 
     System.out.println("Done"); 

    } 

} 

` это второй код, который генерирует такой же вывод, но только за исключением генерации и тот же ключ снова и снова.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.Arrays; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.spec.SecretKeySpec; 

import org.apache.commons.codec.binary.Base64; 

public class Trial { 

    public static byte[] getFile() { 

     File f = new File("/home/bridgeit/Desktop/Olympics.jpg"); 
     InputStream is = null; 
     try { 
      is = new FileInputStream(f); 
     } catch (FileNotFoundException e2) { 
      // TODO Auto-generated catch block 
      e2.printStackTrace(); 
     } 
     byte[] content = null; 
     try { 
      content = new byte[is.available()]; 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     try { 
      is.read(content); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return content; 
    } 

    public static byte[] encryptPdfFile(SecretKey secretKey, byte[] content) { 
     Cipher cipher; 
     byte[] encrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 

      cipher.init(Cipher.ENCRYPT_MODE, secretKey); 

      encrypted = Base64.encodeBase64(cipher.doFinal(content)); 

     } catch (Exception e) { 

      System.out.println("Error while encrypting: " + e.toString()); 
     } 
     return encrypted; 

    } 

    public static byte[] decryptPdfFile(SecretKey secretKey, byte[] textCryp) { 
     Cipher cipher; 
     byte[] decrypted = null; 
     try { 
      cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); 

      cipher.init(Cipher.DECRYPT_MODE, secretKey); 
      decrypted = cipher.doFinal(Base64.decodeBase64(textCryp)); 

     } catch (Exception e) { 

      System.out.println("Error while decrypting: " + e.toString()); 
     } 
     return decrypted; 
    } 

    public static void saveFile(byte[] bytes) throws IOException { 

     FileOutputStream fos = new FileOutputStream("/home/bridgeit/Desktop/Olympics-new.jpg"); 
     fos.write(bytes); 
     fos.close(); 

    } 

    public static void main(String args[]) 
      throws NoSuchAlgorithmException, InstantiationException, IllegalAccessException, IOException { 

     SecretKeySpec secretKey; 
     byte[] key; 
     String myKey = "ThisIsAStrongPasswordForEncryptionAndDecryption"; 

     MessageDigest sha = null; 
     key = myKey.getBytes("UTF-8"); 
     System.out.println(key.length); 
     sha = MessageDigest.getInstance("SHA-1"); 
     key = sha.digest(key); 
     key = Arrays.copyOf(key, 16); // use only first 128 bit 
     System.out.println(key.length); 
     System.out.println(new String(key, "UTF-8")); 
     secretKey = new SecretKeySpec(key, "AES"); 

     byte[] content = getFile(); 
     System.out.println(content); 

     byte[] encrypted = encryptPdfFile(secretKey, content); 
     System.out.println(encrypted); 

     byte[] decrypted = decryptPdfFile(secretKey, encrypted); 
     System.out.println(decrypted); 

     saveFile(decrypted); 
     System.out.println("Done"); 

    } 

} 
Смежные вопросы