I am having trouble decrypting an mp3 file in JAVA which I encrypted using IOS. Below is the code used for encrypting the file in IOS:
- (NSData *)AES256EncryptWithKey:(NSData *) audioData: (NSString *)key{ // 'key' should be 32 bytes for AES256, will be null-padded otherwise char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused) bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding) // fetch key data [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding]; NSUInteger dataLength = [audioData length]; //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc( bufferSize ); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [audioData bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted ); if( cryptStatus == kCCSuccess ) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free( buffer ); //free the buffer return nil; }
And below is the code I am using to decrypt the file in JAVA, I call this function to decrypt:
private static final byte[] SALT = { (byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x35, (byte) 0xE3, (byte) 0x03 }; private static final int ITERATION_COUNT = 65536; private static final int KEY_LENGTH = 256; public static void encryptOrDecrypt(String key, byte[] is, OutputStream os) throws Throwable { SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(key.toCharArray(), SALT, ITERATION_COUNT, KEY_LENGTH); SecretKey tmp = factory.generateSecret(spec); SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; IvParameterSpec ivspec = new IvParameterSpec(iv); ecipher.init(Cipher.DECRYPT_MODE, secret, ivspec); byte[] encrypted = ecipher.doFinal(is); os.write(encrypted); os.close(); }
Also here is the key I am using across both:
"3STI5F2F41608581SO3D8UN346D2E81009THEC7E220RAD9F9C29BPY738956BBE"
When I run the java application I get this error:
javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..).... Any help would be greatly appreciated.
Thanks Michael