SwiftyRSA
维护者: @starback
Swift 中的公钥 RSA 加密。
SwiftyRSA 用于 Scoop iOS 应用 中,在将车牌号提交到 Checkr 通过我们的 API 之前对其进行加密。
安装
Swift 5.0+
SwiftyRSA 使用 Swift 5.0 并需要 Xcode 10.2+.
使用 Cocoapods
pod 'SwiftyRSA'
使用 Carthage
github "TakeScoop/SwiftyRSA"
Objective-C
pod 'SwiftyRSA/ObjC'
快速入门
使用公钥加密
let publicKey = try PublicKey(pemNamed: "public")
let clear = try ClearMessage(string: "Clear Text", using: .utf8)
let encrypted = try clear.encrypted(with: publicKey, padding: .PKCS1)
// Then you can use:
let data = encrypted.data
let base64String = encrypted.base64String
使用私钥解密
let privateKey = try PrivateKey(pemNamed: "private")
let encrypted = try EncryptedMessage(base64Encoded: "AAA===")
let clear = try encrypted.decrypted(with: privateKey, padding: .PKCS1)
// Then you can use:
let data = clear.data
let base64String = clear.base64String
let string = clear.string(using: .utf8)
高级使用
创建公钥/私钥表示
使用DER文件
let publicKey = try PublicKey(derNamed: "public")
let privateKey = try PrivateKey(derNamed: "private")
使用PEM文件
let publicKey = try PublicKey(pemNamed: "public")
let privateKey = try PrivateKey(pemNamed: "private")
使用PEM字符串
let publicKey = try PublicKey(pemEncoded: str)
let privateKey = try PrivateKey(pemEncoded: str)
使用Base64字符串
let publicKey = try PublicKey(base64Encoded: base64String)
let privateKey = try PrivateKey(base64Encoded: base64String)
使用数据
let publicKey = try PublicKey(data: data)
let privateKey = try PrivateKey(data: data)
使用SecKey
let publicKey = try PublicKey(reference: secKey)
let privateKey = try PrivateKey(reference: secKey)
使用公钥加密
let str = "Clear Text"
let clear = try ClearMessage(string: str, using: .utf8)
let encrypted = try clear.encrypted(with: publicKey, padding: .PKCS1)
let data = encrypted.data
let base64String = encrypted.base64Encoded
使用私钥解密
let encrypted = try EncryptedMessage(base64Encoded: base64String)
let clear = try encrypted.decrypted(with: privateKey, padding: .PKCS1)
let data = clear.data
let base64String = clear.base64Encoded
let string = try clear.string(using: .utf8)
使用私钥签名
SwiftyRSA可以使用私钥对数据进行签名。SwiftyRSA将计算所提供的String
或Data
的SHA摘要,并使用该摘要生成数字签名。
let clear = try ClearMessage(string: "Clear Text", using: .utf8)
let signature = clear.signed(with: privateKey, digestType: .sha1)
let data = signature.data
let base64String = signature.base64String
使用公钥验证
SwiftyRSA可以使用公钥验证数字签名。SwiftyRSA将计算所提供的String
或Data
的摘要,并使用该摘要验证数字签名。
let signature = try Signature(base64Encoded: "AAA===")
let isSuccessful = try clear.verify(with: publicKey, signature: signature, digestType: .sha1)
创建公钥/私钥RSA密钥对
let keyPair = SwiftyRSA.generateRSAKeyPair(sizeInBits: 2048)
let privateKey = keyPair.privateKey
let publicKey = keyPair.publicKey
导出密钥或访问其内容
let pem = try key.pemString()
let base64 = try key.base64String()
let data = try key.data()
let reference = key.reference
let originalData = key.originalData
创建公钥和私钥RSA密钥
使用ssh-keygen
生成PEM格式的公钥和私钥。SwiftyRSA也支持DER格式的公钥。
$ ssh-keygen -t rsa -f ~/mykey -N ''
$ cat ~/mykey > ~/private.pem
$ ssh-keygen -f ~/mykey.pub -e -m pem > ~/public.pem
您的密钥现在存储在~/public.pem
和~/private.pem
中。别忘了将~/mykey
和~/mykey.pub
移动到安全的地方。
内部机制
要启用iOS上的公钥/私钥RSA密钥使用,SwiftyRSA使用一些技术,如X.509头剥离,以便令牌链(keychain)可以接受它们。
点击此处了解更多详情
在加密时使用公钥
- 如果密钥是以PEM格式存储的,去除其元数据,并将其转换为Data
- 去除公钥的X.509头,否则令牌链将无法接受它
- 使用随机标签将公钥添加到令牌链
- 使用密钥标签获取密钥的引用
- 使用
SecKeyEncrypt
使用密钥引用和消息数据加密ClearMessage
。 - 将生成的加密数据存储到
EncryptedMessage
中。 - 当密钥被取消分配时,使用其标签从密钥链中删除公钥。
使用私钥解密时
- 移除PEM元数据并将其转换为数据。
- 使用随机标签将私钥添加到应用程序密钥链中。
- 使用密钥标签获取密钥的引用
- 使用
SecKeyDecrypt
使用密钥引用和解密消息数据解密EncryptedMessage
。 - 将生成的解密数据存储到
ClearMessage
中。 - 使用标签从密钥链中删除私钥。
启发于
- http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios/
- https://github.com/lancy/RSADemo
- https://github.com/btnguyen2k/swift-rsautils
许可证
本项目受MIT许可证保护。完整的许可证可以在以下链接找到: https://github.com/TakeScoop/SwiftyRSA/blob/master/LICENSE