ObjectivePGP 是 iOS 和 macOS 上 OpenPGP 协议的实现。OpenPGP 是最广泛使用的电子邮件加密标准。它是由互联网工程任务组(IETF)的 OpenPGP 协作组定义的。
以下是博客文章的故事。
如何参与其中?
您想帮助,太好了!请前往我们的仓库进行分支操作,做出您的更改并向我们发送拉取请求。
贡献
欢迎您进行贡献。请参阅CONTRIBUTING.md
请创建 拉取请求。
许可证
ObjectivePGP采用双重许可证
-
免费供非商业用途,受BSD许可证变体保护。这意味着您必须提及Marcin Krzyżanowski为该代码的原始作者,并在您的应用程序中复现LICENSE文本。
-
商业用途许可证,用于商业产品。请注意,一些免费产品仍然是商业产品。有关详情,请通过电子邮件联系我。
不确定如何选择?请查看常见问题解答
安装
Swift Package Manager
dependencies: [
.package(url: "https://github.com/krzyzanowskim/ObjectivePGP.git", .upToNextMinor(from: "0.99.4"))
]
CocoaPods
pod 'ObjectivePGP'
框架
ObjectivePGP 包含了最新发布版的 框架,您可以将它们复制并嵌入到您的项目中
使用方法
Objective-C
#import <ObjectivePGP/ObjectivePGP.h>
Swift
import ObjectivePGP
读取密钥(私钥或公钥)
NSArray<PGPKey *> *keys = [ObjectivePGP readKeysFromPath:@"/path/to/key.asc" error:nil];
let keys = try ObjectivePGP.readKeys(fromPath: "/path/to/key.asc")
密钥环
密钥环是一个存储(在内存或磁盘上)所有种类的PGP密钥的地方。
PGPKeyring *keyring = ObjectivePGP.defaultKeyring;
PGPKeyring *keyring = [[PGPKeyring alloc] init];
NSArray<PGPKey *> *allKeys = keyring.keys;
[keyring importKeys:@[key]];
[keyring deleteKeys:@[key]];
[keyring importKey:@"979E4B03DFFE30C6" fromPath:@"/path/to/secring.gpg"];
PGPKey *key = [keyring findKeyWithIdentifier:@"979E4B03DFFE30C6"];
NSArray<PGPKey *> keys = [pgp findKeysForUserID:@"Name <[email protected]>"];
let keyring = ObjectivePGP.defaultKeyring
let keyring = Keyring()
let allKeys = keyring.keys
keyring.import(keys: [key])
keyring.delete(keys: [key])
keyring.import(keyIdentifier:"979E4B03DFFE30C6", fromPath:"/path/to/secring.gpg")
if let key = keyring.findKey("979E4B03DFFE30C6") {
// key found in keyring
}
keyring.findKeys("Name <[email protected]>").forEach(key) {
// process key
}
导出密钥(私钥或公钥)
// Write keyring to file
[[keyring export:error] writeToURL:[NSURL fileURLWithString:@"keyring.gpg"]];
// Public keys data
NSData *publicKeys = [keyring exportKeysOfType:PGPKeyTypePublic error:nil];
// Write keyring to file
try keyring.export().write(to: URL(fileURLWithPath: "keyring.gpg"))
// Public keys (Data)
let publicKeys = keyring.exportKeys(of: .public)
签名 & 验证数据(或文件)
使用密钥签名数据
NSData *signature = [ObjectivePGP sign:fileContent detached:YES usingKeys:@[key] passphraseForKey:nil error:nil];
[ObjectivePGP verify:fileContent withSignature:signature usingKeys:@[key] passphraseForKey:nil error:nil];
let signature = try ObjectivePGP.sign(encryptedBin, detached:true, using: [key1])
try ObjectivePGP.verify(encryptedBin, withSignature: signature, using: [key1])
加密 & 解密
NSData *encrypted = [ObjectivePGP encrypt:fileContent addSignature:YES usingKeys:@[key] passphraseForKey:nil error:nil];
[ObjectivePGP decrypt:encrypted andVerifySignature:YES usingKeys:@[key] passphraseForKey:nil error:nil];
let encrypted = try ObjectivePGP.encrypt(fileContent), addSignature: true, using: [key1, key2])
let decrypted = try ObjectivePGP.decrypt(encrypted, andVerifySignature: true, using: [key1])
生成新密钥对
PGPKeyGenerator *generator = [[PGPKeyGenerator alloc] init];
PGPKey *key = [generator generateFor:@"Marcin <[email protected]>" passphrase:nil];
NSData *publicKeyData = [key export:PGPKeyTypePublic error:nil];
NSData *secretKeyData = [key export:PGPKeyTypeSecret error:nil];
let key = KeyGenerator().generate(for: "[email protected]", passphrase: "password")
let publicKey = try key.export(keyType: .public)
let secretKey = try key.export(keyType: .secret)
ASCII Armor
ASCII armor是一种二进制到文本的编码转换器。ASCII armor通过将加密消息封装在ASCII中,以便它们可以以标准消息格式(如电子邮件)发送。
示例
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: For more info see https://www.objectivepgp.org
[...]
-----END PGP PUBLIC KEY BLOCK-----
类PGPArmor
可用于将二进制格式转换为ASCII格式
NSString *armoredKey = [PGPArmor armoredData:encrypted as:PGPArmorPublicKey];
let armoredKey = Armor.armored(Data(), as: .publicKey)
手动转换时,使用正确的PGPArmorType
值定义头信息非常重要。这可能是一部分繁琐的工作,所以这里有一个速查表
数据类型 | PGPArmorType | 示例 |
---|---|---|
加密的 | PGPArmorMessage |
Armor.armored(ObjectivePGP.encrypt(...), as: .message) |
解密的 | PGPArmorMessage |
Armor.armored(ObjectivePGP.decrypt(...), as: .message) |
公钥 | PGPArmorTypePublic |
Armor.armored(key.export(), as: .publicKey) |
私钥 | PGPArmorTypeSecret |
Armor.armored(key.export(), as: .secretKey) |
任何加密的结果类型都是PGPArmorMessage
更改日志
查看 CHANGELOG
已知限制
- 明文签名。
安全审计
截至目前,ObjectivePGP 代码库已经通过了 Cure53 的全面安全审计。
致谢
本产品使用 OpenSSL 项目开发的软件在 OpenSSL 工具包中使用。(http://www.openssl.org/)