如何加密AES 256 CBC在iOS Swift 3中像larvel encrypt()方法 [英] How to encryption AES 256 CBC in iOS Swift 3 like larvel encrypt() method

查看:274
本文介绍了如何加密AES 256 CBC在iOS Swift 3中像larvel encrypt()方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在 iOS Swift 3 中制作 Laravel 加密

  Crypt :: encrypt('123456'); 

我尝试过这样的东西,但它不起作用。我觉得这段代码有问题:

  func generateRandomBytes() - >串? {

var keyData = Data(count:10)
let result = keyData.withUnsafeMutableBytes {
(mutableBytes:UnsafeMutablePointer< UInt8>) - > Int32 in
SecRandomCopyBytes(kSecRandomDefault,keyData.count,mutableBytes)
}
如果result == errSecSuccess {
return keyData.base64EncodedString()
} else {
print(生成随机字节的问题)
return nil
}
}

覆盖func viewDidLoad(){
super.viewDidLoad()
让ivString:String = generateRandomBytes()!
let ivDecodedData:Data = ivString.data(using:.utf8)!
print(iv:,ivString,ivString.characters.count)
let purePasswordString:String =123456
let serialString = String(format:s:%lu:\ %@ \;,purePasswordString.characters.count,purePasswordString)

let keyString =u6KuXJLIUwEUl7noY8J8H1ffDRwLC / 5gjaWW1qTQ3hE =
let encryptedStrKEYData = NSData(base64Encoded:keyString,options:。 init(rawValue:0))!
let encryptedStrKEYDataString:String = NSString(data:encryptedStrKEYData as Data,encoding:String.Encoding.ascii.rawValue)! as String
let keyData:Data = Data(base64Encoded:keyString)!
let message = serialString
let data:NSData! =(message as NSString).data(using:String.Encoding.ascii.rawValue)as NSData!
let cryptData = NSMutableData(length:Int(data.length)+ kCCBlockSizeAES128)!

let keyLength = size_t(kCCKeySizeAES256)
let操作:CCOperation = UInt32(kCCEncrypt)
让算法:CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options:CCOptions = UInt32(kCCOptionPKCS7Padding)
var numBytesEncrypted:size_t = 0

let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyData.bytes,
keyLength,
ivDecodedData.bytes,
data.bytes,
data.length,
cryptData.mutableBytes,
cryptData.length,
& ; numBytesEncrypted)

如果UInt32(cryptStatus)== UInt32(kCCSuccess){
cryptData.length = int(numBytesEncrypted)
print(cryptLength = \(numBytesEncrypted),cryptData = \(cryptData))
let base64cryptString = cryptData.base64EncodedString(options:[.lineLength64Characters])

let mix:String = String(format:%@%@,ivString,base64cryptString)
let cKey = encryptedStrKEYDataString.cString(using:String.Encoding.utf8)
let cData = mix.cString(using:String.Encoding.utf8)
let algorithm = CCHmacAlgorithm(kCCHmacAlgSHA256)
let size = Int(CC_SHA256_DIGEST_LENGTH)
var result = [CUnsignedChar](重复:0, count:size)
CCHmac(algorithm,cKey !, Int(strlen(cKey!)),cData !, Int(strlen(cData!)),& result)
let hmacData:NSData = NSData (bytes:result,length:size)
let hmacBase64 = hmacData.base64EncodedString(options:[])

let dict:Dictionary = [iv:ivString,value:base64cryptString ,mac:hmacBase64]
do {
let jsonData = try JSONSerialization.data(withJSONObject:dict,options:.init(rawValue:0))
let j:String = jsonData.base64EncodedString()

print(done:,j,j.characters.count)
} catch {
print(error.localizedDescription)
}
} else {
print 错误:\(cryptStatus))
}
}

看到这个可以帮助你:

https:/ /github.com/reza-khalafi/LaravelCrypt/blob/master/laravelEncrypt.php



这是我最后一次尝试:

  import UIKit 

class Enc2ViewController:UIViewController {


func generateRandomBytes() >串? {

var keyData = Data(count:10)
let result = keyData.withUnsafeMutableBytes {
(mutableBytes:UnsafeMutablePointer< UInt8>) - > Int32 in
SecRandomCopyBytes(kSecRandomDefault,keyData.count,mutableBytes)
}
如果result == errSecSuccess {
return keyData.base64EncodedString()
} else {
print(生成随机字节的问题)
return nil
}
}



覆盖func viewDidLoad(){
super.viewDidLoad()

let iv = generateRandomBytes()! //固定16个字符
print(iv String:\(iv))
let cryptoKeyString =u6KuXJLIUwEUl7noY8J8H1ffDRwLC / 5gjaWW1qTQ3hE =
let pureMessageString:String =123456
let originalString = String (格式:s:%lu:\%@ \;,pureMessageString.characters.count,pureMessageString)
print(Original String:\(originalString))

let key:String = cryptoKeyString

如果let keyData = key.data(using:String.Encoding.utf8),
let data = originalString.data(using:String.Encoding .utf8),
let cryptData = NSMutableData(length:Int((data.count))+ kCCBlockSizeAES128){


let keyLength = size_t(kCCKeySizeAES256)
让操作:CCOperation = UInt32(kCCEncrypt)
让算法:CCAlgorithm = UInt32(kCCAlgorithmAES128)
let选项:CCOptions = UInt32(kCCOptionPKCS7Padding)



var numBytesEncrypted:size_t = 0

let base64cryptStringOut = keyData.withUnsafeBytes {(keyBytes:UnsafePointer< CChar>) - > String? in
return data.withUnsafeBytes {(dataBytes:UnsafePointer< CChar>) - > String? in

let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes,keyLength,
iv,
dataBytes,data。 count,
cryptData.mutableBytes,cryptData.length,
& numBytesEncrypted)

如果UInt32(cryptStatus)== UInt32(kCCSuccess){
cryptData.length = int(numBytesEncrypted)
let base64cryptString = cryptData.base64EncodedString(options:.lineLength64Characters)
return base64cryptString


}
else {
return nil
}
}
}

print(base64cryptStringOut:\(String(describe:base64cryptStringOut)))

let bIv:String = Data (iv.utf8).base64EncodedString()
print(bIv,bIv,bIv.characters.count)

let mixStr:String = String(format:%@%@ ,bIv,base64cryptStringOut!)
print(mix:,mixStr,mixStr.characters.count)






var result:[CUnsignedChar]
如果让cKey = key.cString(using:String.Encoding.utf8),
let cData = mixStr.cString(using:String.Encoding.utf8)
{
let algo = CCHmacAlgorithm(kCCHmacAlgSHA256)
result = Array(repeated:0,count:Int(CC_SHA256_DIGEST_LENGTH))

CCHmac(algo,cKey,cKey。 count,cData,cData.count,& result)
}
else {

fatalError(以UTF8处理输入字符串时返回)
}



var hexString =
用于结果{
hexString + = String(格式:%2hhx,UInt8(byte))
}





print hmac-string:\(hexString)\(hexString.characters.count))


让dict:Dictionary = [iv:bIv,value:base64cryptStringOut ,mac:hexString]
do {
let jsonData = try JSONSerialization.data(withJSONObject:dict,options:.init(rawValue:0))
//这里jsonData是以JSON数据编码的字典
print(jsonData)


let j:String = jsonData.base64EncodedString()

print(done: ,j,j.characters.count)

} catch {
print(error.localizedDescription)
}



}




} //执行负载

解决方案

已解决

br>
最后,我们经过太多时间研究关于 Laravel 加密后的决定,决定自己创建。 LaraCrypt 解决了问题。尝试这样:

  pod'LaraCrypt'

使用Swift语言进行Laravel加密



享受。


I wanna make Laravel encryption in iOS Swift 3.

Crypt::encrypt('123456'); 

i tried something like this but it does not work for. I think something is wrong in this code:

func generateRandomBytes() -> String? {

        var keyData = Data(count: 10)
        let result = keyData.withUnsafeMutableBytes {
            (mutableBytes: UnsafeMutablePointer<UInt8>) -> Int32 in
            SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes)
        }
        if result == errSecSuccess {
            return keyData.base64EncodedString()
        } else {
            print("Problem generating random bytes")
            return nil
        }
    }

override func viewDidLoad() {
        super.viewDidLoad()
let ivString:String = generateRandomBytes()!
let ivDecodedData : Data = ivString.data(using: .utf8)!
        print("iv : ",ivString ,ivString.characters.count)
let purePasswordString:String = "123456"
        let serialString = String(format:"s:%lu:\"%@\";",purePasswordString.characters.count,purePasswordString)

let keyString        = "u6KuXJLIUwEUl7noY8J8H1ffDRwLC/5gjaWW1qTQ3hE="
        let encryptedStrKEYData = NSData(base64Encoded: keyString, options: .init(rawValue: 0))!
        let encryptedStrKEYDataString:String = NSString(data: encryptedStrKEYData as Data, encoding: String.Encoding.ascii.rawValue)! as String
let keyData: Data = Data(base64Encoded: keyString)!
let message       = serialString
        let data: NSData! = (message as NSString).data(using: String.Encoding.ascii.rawValue) as NSData!
let cryptData    = NSMutableData(length: Int(data.length) + kCCBlockSizeAES128)!

let keyLength              = size_t(kCCKeySizeAES256)
        let operation: CCOperation = UInt32(kCCEncrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
        let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)
var numBytesEncrypted :size_t = 0

let cryptStatus = CCCrypt(operation,
                                  algoritm,
                                  options,
                                  keyData.bytes,
                                  keyLength,
                                  ivDecodedData.bytes,
                                  data.bytes,
                                  data.length,
                                  cryptData.mutableBytes,
                                  cryptData.length,
                                  &numBytesEncrypted)

        if UInt32(cryptStatus) == UInt32(kCCSuccess) {
            cryptData.length = Int(numBytesEncrypted)
            print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")
let base64cryptString = cryptData.base64EncodedString(options: [.lineLength64Characters])

let mix:String =  String(format:"%@%@",ivString,base64cryptString)
let cKey = encryptedStrKEYDataString.cString(using: String.Encoding.utf8)
            let cData = mix.cString(using: String.Encoding.utf8)
            let algorithm = CCHmacAlgorithm(kCCHmacAlgSHA256)
            let size = Int(CC_SHA256_DIGEST_LENGTH)
            var result = [CUnsignedChar](repeating: 0, count: size )
            CCHmac(algorithm, cKey!, Int(strlen(cKey!)), cData!, Int(strlen(cData!)), &result)
            let hmacData:NSData = NSData(bytes: result, length: size)
            let hmacBase64 = hmacData.base64EncodedString(options: [])

let dict:Dictionary = ["iv":ivString,"value":base64cryptString,"mac":hmacBase64]
            do {
                let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .init(rawValue: 0))
let j:String = jsonData.base64EncodedString()

                print("done: ", j , j.characters.count)
} catch {
                print(error.localizedDescription)
            }
} else {
            print("Error: \(cryptStatus)")
        }
}  

And see this to help you :
https://github.com/reza-khalafi/LaravelCrypt/blob/master/laravelEncrypt.php

And this is my last try:

import UIKit

class Enc2ViewController: UIViewController {


    func generateRandomBytes() -> String? {

        var keyData = Data(count: 10)
        let result = keyData.withUnsafeMutableBytes {
            (mutableBytes: UnsafeMutablePointer<UInt8>) -> Int32 in
            SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes)
        }
        if result == errSecSuccess {
            return keyData.base64EncodedString()
        } else {
            print("Problem generating random bytes")
            return nil
        }
    }



    override func viewDidLoad() {
        super.viewDidLoad()

        let iv = generateRandomBytes()! // fixed 16 chars.
        print("iv String: \(iv)")
        let cryptoKeyString = "u6KuXJLIUwEUl7noY8J8H1ffDRwLC/5gjaWW1qTQ3hE="
        let pureMessageString:String = "123456"
        let originalString = String(format:"s:%lu:\"%@\";",pureMessageString.characters.count,pureMessageString)
        print("Original String: \(originalString)")

        let key:String = cryptoKeyString

        if let keyData = key.data(using: String.Encoding.utf8),
            let data = originalString.data(using: String.Encoding.utf8),
            let cryptData    = NSMutableData(length: Int((data.count)) + kCCBlockSizeAES128) {


            let keyLength              = size_t(kCCKeySizeAES256)
            let operation: CCOperation = UInt32(kCCEncrypt)
            let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
            let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)



            var numBytesEncrypted :size_t = 0

            let base64cryptStringOut = keyData.withUnsafeBytes {(keyBytes: UnsafePointer<CChar>)->String? in
                return data.withUnsafeBytes {(dataBytes: UnsafePointer<CChar>)->String? in

                    let cryptStatus = CCCrypt(operation,
                                              algoritm,
                                              options,
                                              keyBytes, keyLength,
                                              iv,
                                              dataBytes, data.count,
                                              cryptData.mutableBytes, cryptData.length,
                                              &numBytesEncrypted)

                    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
                        cryptData.length = Int(numBytesEncrypted)
                        let base64cryptString = cryptData.base64EncodedString(options: .lineLength64Characters)
                        return base64cryptString


                    }
                    else {
                        return nil
                    }
                }
            }

            print("base64cryptStringOut: \(String(describing: base64cryptStringOut)) ")

            let bIv:String = Data(iv.utf8).base64EncodedString()
            print("bIv",bIv,bIv.characters.count)

            let mixStr:String =  String(format:"%@%@",bIv,base64cryptStringOut!)
            print("mix: ",mixStr,mixStr.characters.count)






            var result: [CUnsignedChar]
            if let cKey = key.cString(using: String.Encoding.utf8),
                let cData = mixStr.cString(using: String.Encoding.utf8)
            {
                let algo  = CCHmacAlgorithm(kCCHmacAlgSHA256)
                result = Array(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))

                CCHmac(algo, cKey, cKey.count, cData, cData.count, &result)
            }
            else {

                fatalError("Nil returned when processing input strings as UTF8")
            }



            var hexString = ""
            for byte in result {
                hexString += String(format:"%2hhx", UInt8(byte))
            }





            print("hmac-string: \(hexString) \(hexString.characters.count)")


            let dict:Dictionary = ["iv":bIv,"value":base64cryptStringOut,"mac":hexString]
            do {
                let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .init(rawValue: 0))
                // here "jsonData" is the dictionary encoded in JSON data
                print(jsonData)


                let j:String = jsonData.base64EncodedString()

                print("done: ", j , j.characters.count)

            } catch {
                print(error.localizedDescription)
            }



        }




    }//didload

}

解决方案

Solved:
Finally we make it after too much time research about Laravel encryption, Decided to create by own. LaraCrypt solved the problem. try this:

pod 'LaraCrypt'

Laravel Encryption with Swift language

Enjoy.

这篇关于如何加密AES 256 CBC在iOS Swift 3中像larvel encrypt()方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆