2

我正在尝试在 iPad 上实现 PGP 文件的解密。我设置了一些测试 .txt 文件,然后通过 PGP 桌面对其进行加密。

我已经导入了用于加密文档的证书的私钥,使用 SecPKCS12Import,然后从生成的 SecIdentityRef 中使用 SecIdentityCopyPrivateKey()。

如果我使用证书的公钥和私钥在 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 密钥吗?除非我的理解是错误的,否则我需要将其与数据分开。

如果我通过 SecKeyDecrypt 函数将前 128 个字符作为 void 运行:(在剥离 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≤(fò(*•Aa

我不知道这是什么编码,但试图将它从 outputBuf 转换为字符串永远不会 100% 有效。无论我通过什么编码,它似乎都会被修改。如果我先将它传递给 NSData,我可以取回原始字符串。

NSData *keyData = [NSData dataWithBytesNoCopy:outputBuf length:outputLength];
NSString *keyFromData = [[NSString alloc] initWithBytes:[keyData bytes] length:[keyData length] encoding:NSASCIIStringEncoding]; 

然后我尝试将该密钥传递给 AES256DecryptWithKey 类,在前 128 个字符之后为其提供 PGP 文件中的剩余数据。

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 都不同。我弄错了吗?

感谢您朝着正确方向迈出的任何一步!

编辑添加:

只是部分注意到我的错误 - 128 的 AES 需要 16 位,所以无论哪种方式,我都使用 128 个字符来取错数量,愚蠢的错误,认为我一直在看这个太久......换掉它并没有工作。我所做的任何解密都会导致 '⁄Ĉ¢ï¡0M¶È2Cˆ¿©gUú¨6iîΩ`&<%Jœv£¯nRbΔ:(–%' 类型结果,这对我来说意味着我做错了什么或需要对编码做进一步的事情。

4

2 回答 2

2

阅读 RFC 4880。该文件是 PGP 数据包的 ASCII 装甲集合。有 1 个或多个数据包包含解密实际消息所需的对称密钥,每个对称密钥数据包都使用接收者的公钥加密。只有拥有正确私钥的人才能解密对称密钥包,然后使用该对称密钥解密消息的其余部分。

于 2013-09-28T13:49:11.563 回答
0

AES 密钥确实不同。它是随机选择的,并使用公钥系统(通常为 RSA)加密。Pub key 的成本和限制使其无法批量使用。

您可能想查看 NetPGP,它是 BSD 许可下的 C 代码,这意味着您可以合并或修改它,而不会妨碍您的应用程序或以任何方式惹恼 Apple。(当然,项目会感谢源代码或金钱的贡献。我不隶属于他们。)

OpenPGP 标准需要大量的工作来实现。即使实现工作成功,也有无数种不安全的方式。

于 2012-06-08T23:40:39.017 回答