Расшифровка PGP на iOS

Я пытаюсь реализовать расшифровку файла 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∆:(–%', что для меня означает, что я сделал что-то не так ИЛИ нужно что-то делать дальше с кодировкой.


person wickets    schedule 20.09.2011    source источник


Ответы (2)


Прочтите RFC 4880. Этот файл представляет собой набор пакетов PGP в формате ASCII. Существует 1 или более пакетов, содержащих симметричный ключ, необходимый для расшифровки фактического сообщения, каждый из пакетов симметричного ключа шифруется открытым ключом получателя. Только люди, обладающие правильным закрытым ключом, могут расшифровать пакет симметричного ключа, а затем использовать этот симметричный ключ для расшифровки остальной части сообщения.

person Wyllys    schedule 28.09.2013

Ключ AES действительно отличается. Он выбирается случайным образом и шифруется с помощью системы открытого ключа (обычно RSA). Публичный ключ имеет стоимость и ограничения, которые делают его непривлекательным для массового использования.

Возможно, вы захотите взглянуть на NetPGP, который является кодом C под лицензией BSD, что означает, что вы можете включить его или изменить, не обременяя свое приложение и не расстраивая Apple каким-либо образом. (Конечно, проект приветствует пожертвования в виде исходного кода или денег. Я с ними не связан.)

Стандарт OpenPGP требует большой работы для реализации. Даже когда реализация работает, существует бесчисленное множество способов, которыми она может быть небезопасной.

person A R    schedule 08.06.2012
comment
Вы можете проверить UNNetPGP для iOS - person Marcin; 19.04.2014