- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 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/
查看release notes Bounty CaSTLe 的版本,我没有看到任何日期或任何提及它符合 PGP 版本的内容。也许我的想法是错误的。 最佳答案 “PGP”代表产品和公司名称,是一个商标。
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
有没有办法转换(二进制).key文件到 ASCII 装甲 .asc文件? 之前有一篇帖子似乎暗示文件扩展名无关紧要,文件内容相同:What is the difference b/w .pkr and
我已使用 Bouncy Castle API 加密了一个文件。我已使用相同的 API 成功解密该文件。 但是我无法使用 PGP command line 解密该文件 没有显示错误消息,但未生成解密文件
我正在写一些 needs to do electronic signatures . 有些用户会像我一样是极客,并且已经拥有自己的 PGP key 。大多数人不会,也不想安装或维护它。 作为变通解决方
PGPKeyRingGenerator 构造函数采用密码短语来加密私钥。它用于执行此操作的算法是什么?它有一个名为 encAlgorithm 的字段,但我找不到任何解释这些算法是什么的文档。 最佳答案
我正在开发一个简单的 Java 代码,该代码使用 BouncyCaSTLe v1.51 打开 PGP 公钥并验证其中包含的签名。 目前,我能够加载公钥并迭代所有签名。但是,即使我使用与生成签名的私钥相
我正在使用 Bouncy CaSTLes 来压缩和加密一些数据。压缩方法因空引用异常而失败。以下方法执行压缩: private byte[] Compress(byte[] data)
我真的很苦恼,我需要在 C# 中使用 BouncyCaSTLe 加密和解密字符串。我确实确实尝试过自己做这件事。我确实设法创建了自己的 key (私钥和公钥)。 请记住,我刚从大学毕业。 最佳答案 我
我有一个应用程序使用 gpg key 并提示输入密码才能读取它。这是我这样做的方式(基于我在其他地方找到的示例: func Decrypt(publicKeyring string, secretKe
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我想在脚本中将 PGP 公钥导入我的钥匙串(keychain),但我不希望它将内容写入文件。现在我的脚本是这样做的: curl http://example.com/pgp-public-key -o
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 8年前关闭。 Improve this que
我需要检查文件是否是有效的 pgp 加密文件。我们得到的一些 pgp 文件具有 pgp 的扩展名,而有些则没有。我需要检查哪些文件是 pgp 加密文件,哪些不是。请让我知道是否有办法告诉。 最佳答案
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 8年前关闭。 Improve this que
修订控制 PGP 加密文本文件的好方法是什么? 目标是 仅将 PGP 加密(最好使用 ASCII 装甲)文本文件存储在本地存储库(工作副本)和远程存储库(逻辑上的“中央”存储库)中。 在存储修订历史记
我正在尝试使用 BouncyCaSTLe 来调试和扩展现有的 Java 代码,以解密和验证安全附件。 我已经查看了 BouncyCaSTLe 示例,但从中提取 PGP 安全附件的模型比较困难。从代码和
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
有谁知道Java中的充气城堡中的以下命令(GnuPG 2.17.2)相当于什么? gpg -e -r "recipient" --output output.gpg input.zip 最佳答案 创建
我正在使用公钥使用 openpgp 创建我的 java 产品的许可证。产品附带私钥,用于读取许可证文件。这是正确的方法吗?私钥可以用来生成公钥吗? 谢谢 最佳答案 没有。私钥应保密。 使用签名机制。使
我是一名优秀的程序员,十分优秀!