Я пытаюсь расшифровать данные, которые были изначально зашифрованы с помощью Objective-C в Java.
Есть другие вопросы, упоминающие об этом, но они действительно загромождены, и многие из них еще не решены, поэтому я опубликую свои собственные.
Это код, который шифрует данные:
- (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();
Если я сейчас попытаюсь расшифровать файл, который был зашифрован с помощью Objective C, я получу исключение для плохого заполнения. Если я открою два файла с зашифрованным содержимым, они будут разными:
Hallo Welt! зашифровано с помощью Java: 96 C5 CB 51 39 B5 27 FB B3 93 BF 92 18 BB 16 9B
Привет привет! зашифровано с помощью ObjC: A3 61 32 8E A5 E6 66 E0 41 64 89 25 62 D3 21 16
Разве содержимое файла не должно быть одинаковым? Я думаю, что не все параметры алгоритма одинаковы на двух языках.
Мне нужно изменить код Java, чтобы получить тот же результат, что и код Objective-C, чтобы иметь возможность расшифровывать некоторые данные, которые были зашифрованы с помощью Objective-C.