Я пытаюсь реализовать расшифровку файла 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£t*˝ã=ŒA¢Òt'ŸY±éÿAÃîâG Îfi≠$b≈tâç`yxk=uHªqu-,–dïn^™È\›5±tb.‡€Kñ⁄≤sΩw–ïʃkafS ˘À*Æô竡rAyv)fi]wOrµKz^ªq“à∑öΓı*r‹+l˝Äo∑›g≠¶/÷eÔ&€PÒRåêM¶С|Q$á6În^võ¬∏·h(ƒß• R≤(flò(*•Aa
Я не знаю, что это за кодировка, но попытка получить ее из 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]);
Проблема:
Результирующие данные «обычные» печатаются как ‹>, т.е. пустые. Моя проблема в том, что я даже не думаю, что знаю, как получить ключ из файла PGP.
Может ли кто-нибудь объяснить мне настройку файла PGP? Какая часть является «ключом», если она вообще отделена от данных? Это всегда одна и та же длина / одно и то же положение? Если это НЕ отдельно, то я не знаю, как я вообще смогу его схватить. Я думаю, что остальные будут работать нормально. Я не получаю никаких ошибок или сбоев, это просто НЕ правильный ключ и/или данные, которые я передаю для расшифровки AES, я подозреваю, что, вероятно, это комбинация ошибки кодирования строки и неправильное получение нужной суммы для ключа AES/правильной комбинации. .
Примечание -
Я создал 3 разных текстовых файла и прогнал их через процесс PGP. Проверяя их, все они начинались с одних и тех же 24 символов (qANQR1DBwEwDraQm2Kxa5GkB). Даже если я передам эти 24 файла через расшифровку, это не сработает, и у меня сложилось впечатление, что ключ AES, используемый PGP, был разным для каждого отдельного документа. Я понял это неправильно?
Спасибо за любой шаг в правильном направлении!
Отредактировано, чтобы добавить:
Только что частично заметил мою ошибку - для AES 128 требуется 16 бит, так что в любом случае я беру неправильную сумму, используя 128 символов, глупая ошибка, думаю, я слишком долго смотрел на это... Поменял и не сделал Работа. Любая расшифровка, которую я делаю, приводит к результату типа '⁄Ĉ¢ï¡0M¶ÈÈ2Cˆ¿©gUú¨6iîΩ`&‹%Jœv£¯nRb∆:(–%', что для меня означает, что я сделал что-то не так ИЛИ нужно что-то делать дальше с кодировкой.