2013-08-22 179 views
0

我無法解密使用IOS加密的JAVA中的mp3文件。下面是用於IOS文件加密代碼:IOS中的AES加密解密爲JAVA

- (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; 

}

而下面是我使用解密在Java文件中的代碼,我調用這個函數來解密:

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(); 

}

而且,這裏是我使用在這兩個關鍵:

「3STI 5F2F41608581SO3D8UN346D2E81009THEC7E220RAD9F9C29BPY738956BBE」

當我運行Java應用程序我得到這個錯誤:

javax.crypto.BadPaddingException: Given final block not properly padded 
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..).... 

任何幫助將不勝感激。

感謝 邁克爾

+0

至少如果你關心你的代碼的安全性,它會由加密領域的專家審查,這就是我所做的,我一直在做密碼多年。否則,不要試圖使用加密。 – zaph

回答

1

簡答

你的Java代碼使用PBKDF2改變你的鑰匙,它看起來像你的OBJ-C代碼不是(雖然你還沒有給予足夠的代碼對我們來說是肯定的)。所以關鍵是不同的,這就是爲什麼你的解密不起作用。

主動提供免費諮詢

看起來你只是切割和來自不同地方粘貼代碼並沒有真正理解它。如果你想使用加密,你需要明白你在做什麼,或者你可以把事情弄糟(即使他們似乎在工作)。如果你不知道密碼和密鑰之間的區別,或者PBKDF2是什麼以及何時使用它,那麼你需要做一些基礎研究。

+0

感謝您的迴應,沒有問題我會做更多的研究,您需要確認哪些額外的代碼?我可以粘貼這個以供您查看。 –

+0

您需要在Obj-C代碼中顯示您的密鑰。正如我所說的,在使用它之前,Java代碼會使用PBKDF2轉換密鑰。它看起來像Obj-C沒有。所以要麼在Obj-C代碼中使用PBKDF2,要麼將其從Java代碼中取出。 – zindorsky

+0

或者更簡潔地說,請確保'AES256EncryptWithKey' Obj-C函數中的'key'參數與''encryptOrDecrypt' Java函數中'secret'變量的字節序列相同。 – zindorsky