I have been trying to decrypt a file in android, encrypted from python, Here is python code i used in decrypting.
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 = '0123456789abcdef'
encrypt_file(key, filename1, filename2)
print("done")
if __name__ == '__main__':
main()
and here is my android function trying to decrypt with
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();
}
this gives while using AES/CBC/NoPadding
java.io.IOException: data not block size aligned
and when AES/CBC/PKCS5Padding is used, it gives
java.io.IOException: last block incomplete in decryption