Tôi đang cố gắng triển khai mã hóa AES128 trên Android. Tôi đã có một giải pháp làm việc trên iPhone với Objective C nhưng gặp sự cố khi chuyển nó sang Android. Tôi đã tìm kiếm stackoverflow cho một giải pháp, nhưng tôi dường như đang làm điều gì đó sai trái. Tôi khá mới với Java vì vậy tôi nghĩ rằng tôi đang thiếu một cái gì đó để làm với dữ liệu, chuyển đổi chuỗi.Mã hóa AES 128 của Android
Đây là mã hóa iPhone của tôi:
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];
Đây là Java của tôi:
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"));
Sử dụng cùng quan trọng và rõ trong iPhone và Java cho kết quả khác nhau. Kết quả iPhone của tôi hoạt động theo cách tôi cần nó vì vậy tôi đang cố gắng để có được java để cho tôi kết quả iPhone. Tôi đang thiếu một cái gì đó trong Java chắc chắn, chỉ cần không chắc chắn nó là gì.
chỉnh sửa
dựa trên gợi ý dưới đây tôi sửa đổi Java của tôi để này
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"));
nhưng tôi vẫn nhận được kết quả khác nhau giữa Android và iPhone
mã hóa của bạn là khác nhau đối với các văn bản gốc. Android đang sử dụng UTF8, iPhone đang sử dụng ASCII. – vcsjones
Là một lưu ý phụ, tôi sẽ không khuyến khích sử dụng ECB cho chế độ mã hóa của bạn (trừ khi bạn đang cố gắng duy trì tính tương thích với một hệ thống đã sử dụng nó). Nó làm cho nó khá dễ dàng để phân biệt các mẫu trong dữ liệu được mã hóa. – vcsjones
Cảm ơn vcsjones, tôi đã cập nhật mã của mình thành plainText.getBytes ("ASCII") nhưng kết quả vẫn khác nhau – Pabs