【问题标题】:PGP decryption on iOSiOS 上的 PGP 解密
【发布时间】:2011-11-20 18:42:55
【问题描述】:

我正在尝试在 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

我不知道这是什么编码,但尝试将其从 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îΩ`&

【问题讨论】:

    标签: ios ipad encryption pgp pgp-desktop


    【解决方案1】:

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

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

    OpenPGP 标准需要大量的工作来实现。 即使一个实施工作,也有无数 它可能不安全的方式。

    【讨论】:

    • 您可能需要检查适用于 iOS 的 UNNetPGP
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 2019-02-12
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2021-11-04
      • 2012-06-21
      相关资源
      最近更新 更多