我嘗試解密最初使用Java中的Objective-C加密的數據。解密使用Objective-C與Java進行AES加密的數據
還有其他問題提到這一點,但他們真的很混亂,他們中的許多都還沒有解決,因此我會張貼自己的。
這是對數據加密的代碼:
- (int) encryptWithKey: (NSString *) key
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char * keyPtr[kCCKeySizeAES128+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];
// encrypts in-place, since this is a mutable data object
size_t numBytesEncrypted = 0;
CCCryptorStatus result = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
NULL /* initialization vector (optional) */,
[self mutableBytes], [self length], /* input */
[self mutableBytes], [self length]+32, /* output */
&numBytesEncrypted);
return numBytesEncrypted;
}
我執行此功能,並將所得數據刻錄到光盤,此代碼寫:
NSString* strTest = @"Hallo Welt!";
NSLog(@"strTest = %@", strTest);
NSMutableData *protectedData = [NSMutableData dataWithData:[strTest dataUsingEncoding:NSUTF8StringEncoding]];
int laenge = [protectedData encryptWithKey:@"keykeykeykeykeykeykeykey"];
NSData* dataOutput = [[NSData alloc] initWithBytes:[protectedData bytes] length:laenge];
[dataOutput writeToFile:@"/encryptedFileObjC" atomically:YES];
在Java中我使用此代碼試圖達到相同的行爲:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String keyString = "keykeykeykeykeykeykeykey";
byte[] keyBytes = keyString.getBytes("UTF-8");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, "AES"),
new IvParameterSpec(new byte[16]));
byte[] resultBytes = cipher.doFinal("Hallo Welt!".getBytes("UTF8"));
FileOutputStream out =
new FileOutputStream(new File("encryptedFileJava"));
out.write(resultBytes);
out.close();
如果我現在嘗試解密文件是e通過Objective-C加密我得到了一個不好的填充異常。如果我用加密的內容打開這兩個文件,它們是不同的:
Hallo Welt!用Java加密:96 C5 CB 51 39 B5 27 FB B3 93 BF 92 18 BB 16 9B
Hallo Welt!使用ObjC加密:A3 61 32 8E A5 E6 66 E0 41 64 89 25 62 D3 21 16
文件內容不應該相同嗎?我想我沒有在兩種語言中得到相同算法的所有參數。
我需要修改Java代碼以獲得與Objective-C代碼相同的結果,以便能夠解密用Objective-C加密的一些數據。
我很驚訝Java代碼可以運行,因爲keyBytes數組只有長度15,而不是有效的AES密鑰長度。 – 2010-06-22 11:07:35
密鑰長度爲什麼是15?我假設長度是24字節,我對加密非常陌生,所以如果我有一個基本的誤解,請糾正我。 – Janusz 2010-06-22 12:10:23
@Janusz你可以幫我拿這個加密/解密的示例代碼,我的電子郵件ID是 - [email protected]。我面臨同樣的問題。謝謝。 – 2013-06-28 08:15:08