cifrado AES encriptación java descifrado

Tengo más de 1000 imágenes y videos que necesitan ser encriptados. Nada por encima simplemente algo simple, estaba pensando en usar AES pero lo que no puedo entender es cómo cifrar en mi computadora y luego descifrar el elemento en el dispositivo.

Estaré encriptando todos los elementos en mi computadora probablemente usando python. Luego, de manera a pedido, descifrarás el artículo con java (aplicación de Android)

Cualquier explicación simple hará pseudo código también está bien.

El principal problema que tengo es cómo usar la misma clave para cifrar y descifrar. He estado generando la clave y no puedo conectarlo al otro dispositivo para descifrarlo.

Gracias

Código Python. Trabajos encriptados y descifrados.

from Crypto.Cipher import AES import os, random, struct key = '0123456789abcdef' mode = AES.MODE_CBC chunksize = 64*1024 iv = ''.join(chr(random.randint(0,0xFF)) for i in range(16)) encryptor = AES.new(key,mode,iv) filesize = os.path.getsize('sample.jpg') with open('sample.jpg','rb') as infile: with open('sample.enc','wb') as outfile: outfile.write(struct.pack('<Q',filesize)) outfile.write(iv) while True: chunk = infile.read(chunksize) if len(chunk) == 0: break elif len(chunk) % 16 != 0: chunk += ' ' * (16 - len(chunk) % 16) outfile.write(encryptor.encrypt(chunk)) ## decrypt with open('sample.enc', 'rb') as infile: origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0] iv = infile.read(16) decryptor = AES.new(key, AES.MODE_CBC, iv) with open('sample2.jpg', 'wb') as outfile: while True: chunk = infile.read(chunksize) if len(chunk) == 0: break outfile.write(decryptor.decrypt(chunk)) outfile.truncate(origsize) 

¿Cómo haría la parte de descifrado en Java? Aquí está mi código java descuidado rápido que no funciona. Creo que es el relleno que lo está arruinando.

  public void decryptFile(){ String inFile = "sample.enc"; String outFile = "sample.jpg"; String dir = Environment.getExternalStorageDirectory() +"/Android/data/HOT/"; InputStream is ; byte[] iv = new byte[16]; try { is = new FileInputStream(dir+inFile); is.read(iv); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block Log.d("D1","no file found"); } catch (IOException e) { // TODO Auto-generated catch block Log.d("D-2","no file found"); e.printStackTrace(); } byte[] k = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; Key key = new SecretKeySpec(k,"AES"); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv)); OutputStream outs = new FileOutputStream(dir+outFile); is = new FileInputStream(dir+inFile); while(true){ byte[] chunk = new byte[64*1024]; is.read(chunk); if(chunk.length == 0){ break; } outs.write(cipher.doFinal(chunk)); } } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block Log.d("D","1"); e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block Log.d("D","2"); e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Auto-generated catch block Log.d("D","3"); e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { // TODO Auto-generated catch block Log.d("D","4"); e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Log.d("D","5"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block Log.d("D","6"); e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Auto-generated catch block Log.d("D","7"); e.printStackTrace(); } catch (BadPaddingException e) { // TODO Auto-generated catch block Log.d("D","8"); e.printStackTrace(); } ImageView im = (ImageView)findViewById(R.id.imageView2); Bitmap mainBitmap = BitmapFactory.decodeFile(dir+outFile); im.setImageBitmap(mainBitmap); } 

En la versión de Java, parece que no estás leyendo el tamaño del archivo antes de leer el IV, a diferencia de la versión de Python.

También abre un segundo FileInputStream y luego no omite el tamaño del archivo y el IV antes de leer los fragmentos para el Cipher .

Otra cosa que hay que verificar es que las claves se interpretan de la misma manera en Java y Python, es decir, la cadena en Python da como resultado la misma secuencia de bytes que la matriz de bytes en Java.