Swift 生成RSA公钥/私钥对

Swift 生成RSA公钥/私钥对,swift,swift2,Swift,Swift2,我正在寻找在swift中生成RSA公钥/私钥对的最简单方法,我看到了很多关于iOS如何不支持OpenSSL的讨论 我只需要生成密钥对并将公钥发送到我的服务器,服务器将使用密钥加密一些数据,然后将其发送回我的私钥,以解密。这是一次性交易,之后我不再需要钥匙了 最简单、最轻的解决方案是什么?此Github repo-将帮助您生成密钥和加密数据 用法示例: 使用自己的公钥加密数据: Utils提供的可以帮助您使用自己的公钥加密数据。它的使用非常简单 如何使用: 首先,将RSAUtils.swift文件

我正在寻找在
swift
中生成
RSA
公钥/私钥对的最简单方法,我看到了很多关于
iOS
如何不支持
OpenSSL
的讨论

我只需要生成密钥对并将公钥发送到我的服务器,服务器将
使用密钥加密
一些数据,然后将其发送回我的私钥,以
解密
。这是一次性交易,之后我不再需要钥匙了


最简单、最轻的解决方案是什么?

此Github repo-将帮助您生成密钥和加密数据

用法示例: 使用自己的公钥加密数据: Utils提供的可以帮助您使用自己的公钥加密数据。它的使用非常简单

如何使用: 首先,将
RSAUtils.swift
文件拖放到项目中

就这样

加密基本字符串: 此打印:

ML5S87dfDB6l1uHFcACm2IdkGHpDGPUaYoSNTO+83qcWYxTEddFeKhETIcqF5n67nRDL0lKi5XV9uEI7hGTyKA==

这是使用
SecKeyGeneratePair
在Swift中生成RSA密钥对的最简单方法:

        var statusCode: OSStatus
        var publicKey: SecKey?
        var privateKey: SecKey?

        let publicKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true, kSecAttrApplicationTag:"publicTag".dataUsingEncoding(NSUTF8StringEncoding)!]
        let privateKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true, kSecAttrApplicationTag:"privateTag".dataUsingEncoding(NSUTF8StringEncoding)!]

        var keyPairAttr = [NSObject: NSObject]()
        keyPairAttr[kSecAttrKeyType] = kSecAttrKeyTypeRSA
        keyPairAttr[kSecAttrKeySizeInBits] = 512
        keyPairAttr[kSecPublicKeyAttrs] = publicKeyAttr
        keyPairAttr[kSecPrivateKeyAttrs] = privateKeyAttr

        statusCode = SecKeyGeneratePair(keyPairAttr, &publicKey, &privateKey)

        if statusCode == noErr && publicKey != nil && privateKey != nil {
            printMessage = "Key pair generated OK"
            print("Public Key: \(publicKey!)")
            print("Private Key: \(privateKey!)")
        } else {
            printMessage = "Error generating key pair: \(statusCode)"
        }

如果传输仅在您的客户端和服务器之间进行,为什么不使用HTTPS?@blobbfuesch我们使用HTTPS,但我的雇主担心它不够安全,因此我们正在尝试在HTTPS下实现另一个级别。如果AES不够安全,RSA也不安全。在比较密钥强度时,RSA-1024的安全性不如AES-128。(来源:)@blobbfuesch计划在以后的事务中使用AES,但我们将使用RSA将密码密钥从服务器发送到客户端。你有更好的建议吗?我会使用HTTPS进行加密,使用4096位RSA实现完美的前向保密。即使服务器密钥被盗,也只能对活动会话进行解密(使用来自客户端的公钥加密数据在这里没有帮助)。以前的所有流量都是安全的。我以前看过这个回购协议,但是我没有看到任何生成密钥的例子?你能提供一个吗?如果可以插入我自己的公钥进行加密,你有什么想法吗?可能没有,因为那也是不安全的。总是生成一个新的密钥对。我能问一下为什么它会不安全吗?我的服务器通过它的公钥发送数据,然后我用它加密我的数据,并将其发送回服务器以用它的私钥解密。比方说,你硬编码你的私钥,然后使用你自己的公钥与该密钥一起工作,然后有人可以通过反向工程(反编译)获得私钥。而且钥匙不会变。如果每次启动应用程序或每次安装时都生成一对新密钥,则很难让密钥被盗。如何将公钥和私钥转换为字符串?请注意,kSecAttrKeySizeInBits=512不再安全。例如,苹果公司似乎建议使用SecKeyCreateRandomKey代替SecKeyGeneratePair,后者是一种“传统的iOS密钥操作”。
ML5S87dfDB6l1uHFcACm2IdkGHpDGPUaYoSNTO+83qcWYxTEddFeKhETIcqF5n67nRDL0lKi5XV9uEI7hGTyKA==
        var statusCode: OSStatus
        var publicKey: SecKey?
        var privateKey: SecKey?

        let publicKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true, kSecAttrApplicationTag:"publicTag".dataUsingEncoding(NSUTF8StringEncoding)!]
        let privateKeyAttr: [NSObject: NSObject] = [kSecAttrIsPermanent:true, kSecAttrApplicationTag:"privateTag".dataUsingEncoding(NSUTF8StringEncoding)!]

        var keyPairAttr = [NSObject: NSObject]()
        keyPairAttr[kSecAttrKeyType] = kSecAttrKeyTypeRSA
        keyPairAttr[kSecAttrKeySizeInBits] = 512
        keyPairAttr[kSecPublicKeyAttrs] = publicKeyAttr
        keyPairAttr[kSecPrivateKeyAttrs] = privateKeyAttr

        statusCode = SecKeyGeneratePair(keyPairAttr, &publicKey, &privateKey)

        if statusCode == noErr && publicKey != nil && privateKey != nil {
            printMessage = "Key pair generated OK"
            print("Public Key: \(publicKey!)")
            print("Private Key: \(privateKey!)")
        } else {
            printMessage = "Error generating key pair: \(statusCode)"
        }