我正試圖在Android上實現AES128加密。我有一個解決方案,使用Objective C工作在iPhone上,但無法將其移植到Android。我已經搜索了一個解決方案的stackoverflow,但我似乎做錯了什麼。我對Java相當陌生,所以我想我錯過了一些與數據,字符串轉換有關的事情。Android AES 128加密
這裏是我的iPhone加密:
char keyPtr[kCCKeySizeAES128+1];
[keyString getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSASCIIStringEncoding];
// CString for the plain text
char plainBytes[[plainString length]+1];
[plainString getCString:plainBytes
maxLength:sizeof(plainBytes)
encoding:NSASCIIStringEncoding];
size_t bytesEncrypted = 0;
// Allocate the space for encrypted data
NSUInteger dataLength = [plainString length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
// Encrypt
CCCryptorStatus ret = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
kCCKeySizeAES128,
NULL,
plainBytes, sizeof(plainBytes),
buffer, bufferSize,
&bytesEncrypted);
if (ret != kCCSuccess) {
free(buffer);
}
encryptedData = [NSData dataWithBytes:buffer length:bytesEncrypted];
這裏是我的Java:
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
使用相同的密鑰和明文的iPhone和Java給出不同的結果。我的iPhone結果以我需要的方式工作,所以我試圖讓java給我iPhone結果。我在Java中遺漏了一些東西,只是不確定它是什麼。
編輯
基於下面的建議我修改我的Java這個
byte[] keyBytes = plainTextKey.getBytes("US-ASCII");
SecretKeySpec skeySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("US-ASCII"));
但我仍然除了編碼獲得Android和iPhone
你的編碼是明文不同。 Android使用UTF8,iPhone使用ASCII。 – vcsjones 2013-03-13 16:08:21
作爲一個方面說明,我會勸阻你的密碼模式使用ECB(除非你試圖保持與已經使用它的系統的兼容性)。它使得識別加密數據中的模式變得相當容易。 – vcsjones 2013-03-13 16:10:49
感謝vcsjones,我已將代碼更新爲plainText.getBytes(「ASCII」),但結果仍然不同 – Pabs 2013-03-13 16:37:58