Я пытаюсь реализовать дешифрование файла PGP на iPad. Я настроил несколько тестовых .txt файлов, которые затем зашифровал через рабочий стол PGP.
Я импортировал закрытый ключ сертификата, используемого для шифрования документа, используя SecPKCS12Import, а затем SecIdentityCopyPrivateKey () из полученного SecIdentityRef.
Если я тестирую шифрование и дешифрование простой строки в Objective C, используя открытый и закрытый ключи сертификата, это прекрасно работает.
Теперь, когда я испытываю фактическую расшифровку PGP, я немного озадачен ... Читая текст из файла .pgp, я получаю:
-----BEGIN PGP MESSAGE-----
Version: 10.1.1.10
qANQR1DBwEwDraQm2Kxa5GkBB/4yLebeLk10C2DVvHpQL20E0DThhgQlTasXo+YJ
pLp5Ig2hHu4Xx0m74D3vfyWpA2XQA02TMAHO9lhNfkE234c/ds05D1UyQkJEoqW+
joEcbRT5rlGN3qrMf1FXv8/01EHH0dgeD6mAkkDeDEorIirYHCF6+QVkedaphZLs
c63GmcikzkWZT/vv20ICL3Ys0DaC3P9zu0T1GtjkmQ062kaTab/VBJnQrsY/y1JU
ypmbW9bbFeZMcAqXHMqpjw49K5UluIJaDbRNAjIvHTFLNuOYWVJM6FcMs5p6xqvZ
ltizeKAjr1B1h4DvbQaqdO6/OAb+dGr7fJoIHEszDsJbW1cc0lUBitrxKHrPGovF
1uEW+3glA3SopveWB4GkKzcYlbqT5y1p/gQNwY8yuZr/6iF1hyF9mx/hU/+xjOMB
og3sGX4npcQegsAMw2y+zz9kJ9a6jlteNufi
=d2Fq
-----END PGP MESSAGE-----
Я знаю, что мне нужно получить случайный одноразовый ключ, который PGP использовал для шифрования файла, из данных в файле. Я знаю, что для этого мне нужно использовать SecKeyDecrypt с закрытым ключом, чтобы получить одноразовый ключ AES. Получив этот ключ, я могу расшифровать остальные данные.
Часть, с которой у меня проблемы, это какая часть данных подается в SecKeyDecrypt. Как происходит настройка файла PGP - первые 128 символов являются ключом AES? Если мое понимание неверно, мне нужно получить это отдельно от данных.
Если я запускаю, скажем, первые 128 символов как пустое место через функцию SecKeyDecrypt: (после удаления строк BEGIN PGP MESSAGE)
size_t dataLength = [theKey length];
size_t outputLength = MAX(128, SecKeyGetBlockSize(privateKeyRef));
void *outputBuf = malloc(outputLength);
OSStatus err;
err = SecKeyDecrypt(privateKeyRef, kSecPaddingNone,//PKCS1,
(uint8_t *)theKey, dataLength,
outputBuf, &outputLength);
if (err) {
NSLog(@"something went wrong...err = %ld", err);
}
Я получаю это:
MRªh6∞bJ˘e £ т * а = œa ¢ Òt'ŸY ± éÿAÃîâG
Î фи ≠ $ b≈tâç`yxk = uHªqu -, -. Din ^ ™ Э \> 5 ± ‡ Т.Б. € Kñ/≤sΩw-ïʃkafS˘À * Æôç «rAyv) фи] wOrμKz ^ ªq«àΣöÎ «ı * г <+ l˝ÄoΣ> г ≠ ¶ / ÷ EO & € PÒRåêM¶Ñ | Q $ á6În ^ võ¬Π · ч (ƒß • R≤ (фл ò (* • Аа
Я не знаю, что это за кодировка, но попытка получить ее из outputBuf в строку никогда не работает на 100%. Кажется, он изменяется независимо от того, какую кодировку я передаю. Если я сначала передам его NSData, я смогу вернуть исходную строку.
NSData *keyData = [NSData dataWithBytesNoCopy:outputBuf length:outputLength];
NSString *keyFromData = [[NSString alloc] initWithBytes:[keyData bytes] length:[keyData length] encoding:NSASCIIStringEncoding];
Затем я пытаюсь передать этот ключ в класс AES256DecryptWithKey, предоставив ему оставшиеся данные из файла PGP после первых 128 символов.
NSData *cipherText = [[NSData alloc]initWithData:[[bodyPart objectAtIndex:1] dataUsingEncoding:NSUTF8StringEncoding]];
NSData *plain = [[NSData alloc] initWithData:[cipherText AES256DecryptWithKey:keyFromData]];
NSLog(@"after decrypting = %@", [[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding]);
Проблема:
Результирующие данные 'plain' печатаются как <>, то есть пустые. Моя проблема в том, что я даже не думаю, что знаю, как извлечь ключ из файла PGP.
Может кто-нибудь объяснить мне настройку файла PGP? Какая часть является «ключом», если она вообще отделена от данных? Это всегда одна и та же длина / одна и та же позиция? Если это НЕ отдельно, тогда я не знаю, как я вообще смогу это схватить. Я думаю, что остальные будут работать нормально. Я не получаю никаких ошибок или сбоев, это просто НЕ правильный ключ и / или данные, которые я передаю для расшифровки AES, я подозреваю, вероятно, сочетание ошибки кодирования строки и не захватывает правильное количество для комбинации ключ / право AES .
Примечание -
Я создал 3 разных текстовых файла и провел их через процесс PGP. Осматривая их, они все начинали с одинаковых 24 символов (qANQR1DBwEwDraQm2Kxa5GkB). Даже если я пропущу эти 24 через расшифровку, это не сработает, и у меня сложилось впечатление, что ключ AES, используемый PGP, отличается для каждого отдельного документа. Я понял это неправильно?
Спасибо за любой шаг в правильном направлении!
Отредактировано, чтобы добавить:
Только частично заметил мою ошибку - AES из 128 требует 16 бит, так что в любом случае я беру неправильную сумму, используя 128 символов, глупая ошибка, думаю, я слишком долго смотрел на это ... не работал Любое дешифрование, которое я выполняю, приводит к типу результата '⁄Ĉ ¢¡0M¶È2Cˆ¿ © gUú¨6iîΩ` & <% Jœv £ ¯nRb∆: (-%), что, на мой взгляд, означает, что я сделал что-то неправильно ИЛИ нужно что то делать дальше с кодировкой. </p>