2015-07-07 2 views
1

Я пытался расшифровать файл в android, зашифрованный с помощью python, Вот код python, который я использовал в расшифровке.file encrypt in python decrypt in android

import os, random, struct 
from Crypto.Cipher import AES 
import sys 
import hashlib 

print("trying") 

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024): 
    """ Encrypts a file using AES (CBC mode) with the 
     given key. 

     key: 
      The encryption key - a string that must be 
      either 16, 24 or 32 bytes long. Longer keys 
      are more secure. 

     in_filename: 
      Name of the input file 

     out_filename: 
      If None, '<in_filename>.enc' will be used. 

     chunksize: 
      Sets the size of the chunk which the function 
      uses to read and encrypt the file. Larger chunk 
      sizes can be faster for some files and machines. 
      chunksize must be divisible by 16. 
    """ 
    if not out_filename: 
     out_filename = in_filename + '.mjt' 

    iv = 16 * '\x00' 
    encryptor = AES.new(key, AES.MODE_CBC, iv) 
    filesize = os.path.getsize(in_filename) 

    with open(in_filename, 'rb') as infile: 
     with open(out_filename, 'wb') as outfile: 
      outfile.write(struct.pack('<Q', filesize)) 
      # outfile.write(iv) 
      outfile.write(bytes(iv, 'UTF-8')) 

      while True: 
       chunk = infile.read(chunksize) 
       if len(chunk) == 0: 
        break 
       elif len(chunk) % 16 != 0: 
        chunk += b' ' * (16 - len(chunk) % 16) 

       outfile.write(encryptor.encrypt(chunk)) 
       # outfile.write(bytes(encryptor.encrypt(chunk), 'UTF-8')) 


def main(): 
    filename1 = sys.argv[-2] 
    filename2 = sys.argv[-1] 
    key = 'abcdef' 
    encrypt_file(key, filename1, filename2) 
    print("done") 


if __name__ == '__main__': 
    main() 

и вот мой андроид функция пытается расшифровать с

private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

public static void decrypt(String inputFile, String outputFile, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { 
     FileInputStream fis = new FileInputStream(inputFile); 

     FileOutputStream fos = new FileOutputStream(outputFile); 

     IvParameterSpec iv = new IvParameterSpec(ivBytes); 
     SecretKeySpec sks = new SecretKeySpec(password.getBytes(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     cipher.init(Cipher.DECRYPT_MODE, sks, iv); 
     CipherInputStream cis = new CipherInputStream(fis, cipher); 

     int b; 
     byte[] d = new byte[1024]; 
     while((b = cis.read(d)) != -1) { 
      fos.write(d, 0, b); 
     } 
     fos.flush(); 
     fos.close(); 
     cis.close(); 
    } 

это дает при использовании AES/CBC/NoPadding java.io.IOException: data not block size aligned и при использовании AES/CBC/PKCS5Padding, он дает java.io.IOException: last block incomplete in decryption

ответ

1

AES - это блок-шифр, поэтому сообщения должны быть заполнены до кратного размера блока, как при шифровании, так и при расшифровке. Ваше шифрование в порядке. Он считывает файлы, записывает первые 8 байтов вашего файла, затем записывает 16 байтов IV и, наконец, содержимое фрагмента файла блоком, обеспечивающим заполнение. Тем не менее, ваше дешифрование не соответствует той же схеме для расшифровки. AES - это 128-битный блочный шифр, поэтому вам не нужно много беспокоиться о том, чтобы указать PKCS5Padding, просто нужно следовать той же самой процедуре в обратном порядке, как и ваше шифрование. В вашем коде также была ошибка, связанная с iv.

Попробуйте сделать следующее и она должна работать:

private static byte[] filesize = new byte[8]; 
private static byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

public static void decrypt(String inputFile, String outputFile, String password) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { 
    FileInputStream fis = new FileInputStream(inputFile); 
    FileOutputStream fos = new FileOutputStream(outputFile); 
    fis.read(filesize, 0, 8); 
    System.out.println(new String(filesize)); 
    fis.mark(9); 
    fis.read(ivBytes, 0, 16); 
    System.out.println(new String(ivBytes)); 
    fis.mark(25); 
    IvParameterSpec iv = new IvParameterSpec(ivBytes); 
    SecretKeySpec sks = new SecretKeySpec(password.getBytes(), "AES"); 
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    cipher.init(Cipher.DECRYPT_MODE, sks, iv); 
    File file = new File(inputFile); 
    int byteLength = (int) file.length() - 24; 
    System.out.println(Integer.toString(byteLength)); 
    byte[] bytes = new byte[byteLength]; 
    byteLength = fis.read(bytes); 
    System.out.println(Integer.toString(byteLength)); 
    System.out.println(new String(bytes)); 
    InputStream bytesStream = new ByteArrayInputStream(bytes); 
    CipherInputStream cis = new CipherInputStream(bytesStream, cipher); 

    int b; 
    byte[] d = new byte[1024]; 
    while((b = cis.read(d)) != -1) { 
     fos.write(d, 0, b); 
    } 
    fos.flush(); 
    fos.close(); 
    cis.close(); 
} 
+0

работал Thankx :) –