gpt4 book ai didi

ios - iOS 上的 PGP 解密

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:25:36 29 4
gpt4 key购买 nike

我正在尝试在 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 用于加密文件的随机一次性 key 。我知道要做到这一点,我需要将 SecKeyDecrypt 与私钥一起使用,以获得一次性 AES key 。获得该 key 后,我就可以解密其余数据。

我遇到问题的部分是将数据的哪一部分输入到 SecKeyDecrypt 中。 PGP 文件设置如何 - 前 128 个字符是 AES key 吗?除非我的理解有误,否则我需要将其与数据分开。

如果我通过 SecKeyDecrypt 函数将前 128 个字符作为空值运行:(在剥离 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];

然后我尝试将该 key 传递给 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 文件中获取 key 。

任何人都可以向我解释 PGP 文件设置吗?如果它实际上与数据完全分开,那么哪一部分是“关键”?它总是相同的长度/相同的位置吗?如果它不是分开的,那么我根本不知道我怎么能捕获它。我认为其余的都可以正常工作。我没有收到任何错误或崩溃,这不是我为 AES 解密传递的正确 key 和/或数据,我怀疑可能是字符串编码错误的组合,并且没有为 AES key /正确组合获取正确的数量.

注意-

我创建了 3 个不同的文本文件并通过 PGP 过程运行它们。检查它们,它们都以相同的 24 个字符 (qANQR1DBwEwDraQm2Kxa5GkB) 开头。即使我通过解密传递了这 24 个,它也不起作用,而且我的印象是 PGP 使用的 AES key 对于每个文档都是不同的。我是不是听错了?

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

编辑添加:

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

最佳答案

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

关于ios - iOS 上的 PGP 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480425/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com