NiftyRSA

Swift 中的公钥 RSA 加密。

SwiftyRSA 的重命名分支 (https://github.com/TakeScoop/SwiftyRSA),该项目用于 Scoop iOS 应用,用于在通过 Checkr 的 API 提交驾驶执照号码之前对其进行加密。

快速开始

使用公钥加密

do {
    let publicKey = try NiftyRSAPublicKey(pemNamed: "public")

    let str = "Clear String"
    let clear = try ClearMessage(string: str)
    let encrypted = try clear.encrypted(with: publicKey)

    let data = encrypted.data
    print(data)
    
    let base64String = encrypted.base64String
    print(base64String)
} catch {
    print(error)
}

使用私钥解密

let privateKey = try NiftyRSAPrivateKey(pemNamed: "private")
let encrypted = try EncryptedMessage(base64Encoded: "AAA===")
let clear = try encrypted.decrypted(with: privateKey)

// Then you can use:
let data = clear.data
let base64String = clear.base64String
let string = clear.string(using: .utf8)

高级用法

创建公钥/私钥表示

使用 DER 文件

let publicKey = try NiftyRSAPublicKey(derNamed: "public")
let privateKey = try NiftyRSAPrivateKey(derNamed: "private")

使用 PEM 文件

let publicKey = try NiftyRSAPublicKey(pemNamed: "public")
let privateKey = try NiftyRSAPrivateKey(pemNamed: "private")

使用 PEM 字符串

let publicKey = try NiftyRSAPublicKey(pemEncoded: str)
let privateKey = try NiftyRSAPrivateKey(pemEncoded: str)

使用 Base64 字符串

let publicKey = try NiftyRSAPublicKey(base64Encoded: base64String)
let privateKey = try NiftyRSAPrivateKey(base64Encoded: base64String)

使用数据

let publicKey = try NiftyRSAPublicKey(data: data)
let privateKey = try NiftyRSAPrivateKey(data: data)

使用 SecKey

let publicKey = try NiftyRSAPublicKey(reference: secKey)
let privateKey = try NiftyRSAPrivateKey(reference: secKey)

使用公钥加密

let str = "Clear Text"
let clear = try ClearMessage(string: str, using: .utf8)
let encrypted = try clear.encrypted(with: publicKey)

let data = encrypted.data
let base64String = encrypted.base64Encoded

使用私钥解密

let encrypted = try EncryptedMessage(base64Encoded: base64String)
let clear = try encrypted.decrypted(with: privateKey)

let data = clear.data
let base64String = clear.base64Encoded
let string = try clear.string(using: .utf8)

使用私钥签名

NiftyRSA 可以使用私钥对数据进行签名。 NiftyRSA 将计算提供的 String/Data 的 SHA 摘要,并使用它来生成数字签名。

let clear = try ClearMessage(string: "Clear Text")
let signature = clear.signed(with: privateKey, digestType: .sha1)

let data = signature.data
let base64String = signature.base64String

使用公钥验证

NiftyRSA 可以使用公钥验证数字签名。 NiftyRSA 将计算提供的 String/Data 的摘要,并使用它来验证数字签名。

let signature = try Signature(base64Encoded: "AAA===")
let isSuccessful = try clear.verify(with: publicKey, signature: signature, digestType: .sha1)

创建公钥/私钥 RSA 密钥对

let keyPair = NiftyRSA.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

使用 X.509 证书

NiftyRSA 支持公钥的 X.509 证书。 NiftyRSA 可以将 X.509 标头添加到无标头的公钥,或者相反,剥离它以获得没有标头的密钥。

将 X.509 标头添加到公钥

let publicKey = NiftyRSAPublicKey(data: data)
let publicKeyData = try publicKey.data()
let publicKey_with_X509_header = try NiftyRSA.prependX509KeyHeader(keyData: publicKeyData)

从公钥中剥离 X.509 标头

let publicKey_headerLess: Data = try NiftyRSA.stripKeyHeader(keyData: publicKey_with_X509_header)

警告 : 存储(使用 NiftyRSA 的方法)或创建 NiftyRSAPublicKey 实例将自动剥离密钥中的标头。 有关更多信息,请参见上面的幕后花絮

创建公钥和私钥 RSA 密钥

使用 ssh-keygen 生成 PEM 公钥和 PEM 私钥。 NiftyRSA 还支持 DER 公钥。

$ ssh-keygen -t rsa -m PEM -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 密钥,NiftyRSA 使用了一些技术,例如 X.509 标头剥离,以便密钥链接受它们。

点击此处获取更多详细信息

使用公钥加密时

使用私钥解密时

灵感来自

许可证

本项目受 MIT 许可证保护。 完整的许可证可以在这里找到: https://github.com/unibas-medfak/NiftyRSA/blob/master/LICENSE