代码之家  ›  专栏  ›  技术社区  ›  Sina Hajian

在swift中加密和解密超过132个字符

  •  -1
  • Sina Hajian  · 技术社区  · 6 年前

    我有这个rsa-swift代码,它很好地工作,加密或递减数据,但是当string.count超过132个字符时,错误递减和加密数据,我如何对超过132个字符的数据进行递减和加密? 我的RSA课程是,我不想分开我的数据

    class RSAWrapper {
        private var publicKey : SecKey?
        private var privateKey : SecKey?
    
        func generateKeyPair(keySize: UInt, privateTag: String, publicTag: String) -> Bool {
    
            self.publicKey = nil
            self.privateKey = nil
    
            if (keySize != 512 && keySize != 1024 && keySize != 2048) {
                // Failed
                print("kelid kharab ast")
                return false
            }
    
            let publicKeyParameters: [NSString: AnyObject] = [
                kSecAttrIsPermanent: true as AnyObject,
                kSecAttrApplicationTag: publicTag as AnyObject
            ]
            let privateKeyParameters: [NSString: AnyObject] = [
                kSecAttrIsPermanent: true as AnyObject,
                kSecAttrApplicationTag: publicTag as AnyObject
            ]
            let parameters: [String: AnyObject] = [
                kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
                kSecAttrKeySizeInBits as String: keySize as AnyObject,
                kSecPrivateKeyAttrs as String: privateKeyParameters as AnyObject,
                kSecPublicKeyAttrs as String: publicKeyParameters as AnyObject
            ];
    
            let status : OSStatus = SecKeyGeneratePair(parameters as CFDictionary, &(self.publicKey), &(self.privateKey))
    
            return (status == errSecSuccess && self.publicKey != nil && self.privateKey != nil)
        }
    
        func encrypt(text: String) -> [UInt8] {
            let plainBuffer = [UInt8](text.utf8)
            var cipherBufferSize : Int = Int(SecKeyGetBlockSize((self.publicKey)!))
            var cipherBuffer = [UInt8](repeating:0, count:Int(cipherBufferSize))
    
            // Encrypto  should less than key length
            let status = SecKeyEncrypt((self.publicKey)!, SecPadding.PKCS1, plainBuffer, plainBuffer.count, &cipherBuffer, &cipherBufferSize)
            if (status != errSecSuccess) {
                print("Failed Encryption")
            }
            return cipherBuffer
        }
    
        func decprypt(encrpted: [UInt8]) -> String? {
            var plaintextBufferSize = Int(SecKeyGetBlockSize((self.privateKey)!))
            var plaintextBuffer = [UInt8](repeating:0, count:Int(plaintextBufferSize))
    
            let status = SecKeyDecrypt((self.privateKey)!, SecPadding.PKCS1, encrpted, plaintextBufferSize, &plaintextBuffer, &plaintextBufferSize)
    
            if (status != errSecSuccess) {
                print("Failed Decrypt")
                return nil
            }
            return NSString(bytes: &plaintextBuffer, length: plaintextBufferSize, encoding: String.Encoding.utf8.rawValue)! as String
        }
    
    
        func encryptBase64(text: String) -> String {
            let plainBuffer = [UInt8](text.utf8)
            var cipherBufferSize : Int = Int(SecKeyGetBlockSize((self.publicKey)!))
            var cipherBuffer = [UInt8](repeating:0, count:Int(cipherBufferSize))
    
            // Encrypto  should less than key length
            let status = SecKeyEncrypt((self.publicKey)!, SecPadding.PKCS1, plainBuffer, plainBuffer.count, &cipherBuffer, &cipherBufferSize)
            if (status != errSecSuccess) {
                print("Failed Encryption")
            }
    
            let mudata = NSData(bytes: &cipherBuffer, length: cipherBufferSize)
            return mudata.base64EncodedString(options: NSData.Base64EncodingOptions.lineLength64Characters)
        }
    
        func decpryptBase64(encrpted: String) -> String? {
    
            let data : NSData = NSData(base64Encoded: encrpted, options: .ignoreUnknownCharacters)!
            let count = data.length / MemoryLayout<UInt8>.size
            var array = [UInt8](repeating: 0, count: count)
            data.getBytes(&array, length:count * MemoryLayout<UInt8>.size)
    
            var plaintextBufferSize = Int(SecKeyGetBlockSize((self.privateKey)!))
            var plaintextBuffer = [UInt8](repeating:0, count:Int(plaintextBufferSize))
    
            let status = SecKeyDecrypt((self.privateKey)!, SecPadding.PKCS1, array, plaintextBufferSize, &plaintextBuffer, &plaintextBufferSize)
    
            if (status != errSecSuccess) {
                print("Failed Decrypt")
                return nil
            }
            return NSString(bytes: &plaintextBuffer, length: plaintextBufferSize, encoding: String.Encoding.utf8.rawValue)! as String
        }
    
    
        func getPublicKey() -> SecKey? {
            return self.publicKey
        }
    
        func getPrivateKey() -> SecKey? {
            return self.privateKey
        }
    

    我试图更改uint8,但当我执行该错误时,我必须做什么?

    2 回复  |  直到 6 年前
        1
  •  2
  •   zaph    6 年前

    对于加密数据,使用对称加密(如AES),它速度快且没有大小限制。

    如果您确实需要使用RSA(非对称)密钥对,请使用混合加密,其中数据使用对称加密进行加密,对称使用非对称加密进行加密,这称为混合加密。

    但正如卢克所说,只需使用https加密传输中的数据。

        2
  •  -1
  •   Sina Hajian    6 年前

    唯一的办法就是把绳子分开 这门课是分班的。

    extension String {
        func splitByLength(_ length: Int) -> [String] {
            var result = [String]()
            var collectedCharacters = [Character]()
            collectedCharacters.reserveCapacity(length)
            var count = 0
    
            for character in self.characters {
                collectedCharacters.append(character)
                count += 1
                if (count == length) {
                    // Reached the desired length
                    count = 0
                    result.append(String(collectedCharacters))
                    collectedCharacters.removeAll(keepingCapacity: true)
                }
            }
    
            // Append the remainder
            if !collectedCharacters.isEmpty {
                result.append(String(collectedCharacters))
            }
    
            return result
        }
    }
    

    然后

     let rsa : RSAWrapper? = RSAWrapper()
            let success : Bool = (rsa?.generateKeyPair(keySize: 2048, privateTag: "com.atarmkplant", publicTag: "com.atarmkplant"))!
            if (!success) {
                print("Failed")
                return
            }
    
    
    
            let test : String = "string more than 132 char "
    
            let test2=test.splitByLength(132)
            let tedadarrray = test2.count
    
    
            var i = 0
            var encryptionstring = ""
            repeat {
                let test3 = test2[i]
                let encryption = rsa?.encryptBase64(text: test3)
                encryptionstring =  encryptionstring + encryption!
                i = i + 1
            } while i < tedadarrray
    
    
    
    
           let decripArray = encryptionstring.splitByLength(349)
            let tedadarrray2 = decripArray.count
    
    
    
    
    
    
    
    
            var i2 = 0
            var decripttionstring = ""
            repeat {
                print(i2 as Any)
                let test3 : String = decripArray[i2]
                let  decription = rsa?.decpryptBase64(encrpted: test3)
                decripttionstring =  decripttionstring + decription!
                i2 = i2 + 1
            } while i2 < tedadarrray2