Swift中的异步加密 [英] Asynchronous encryption in Swift

查看:93
本文介绍了Swift中的异步加密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试加密一个字符串,使用Public / Private Key系统。我需要传递一个字符串到服务器,PHP脚本可以解密它。我有一个工作的JavaScript到PHP脚本系统,但是,我想让PHP脚本也可以接受iOS应用程序的数据。任何人都可以指向正确的方向,或者甚至可以介绍一下可以达到类似结果的系统。我正在寻找可以使用PHP解密的任何类型的加密。先谢谢你。

解决方案

PHP和iOS都支持AES加密。



Common Crypto支持非对称(RSA)和对称(AES)加密。如果PKI(公共密钥基础设施)不需要强制需要使用AES。



唯一的问题是PHP使用非标准填充(null)而不是PKCS#7,因此您必须在iOS大小上进行自己的填充才能匹配PHP使用或在PHP端的Bozo方案来匹配标准PKCS#7。请注意,如果数据的最后一个字节为0,PHP填充将失败。



这是一个包含在一个函数中的实现示例:iv:



Swift 2.0


添加 Security.framework 到项目。




  #import< CommonCrypto / CommonCrypto.h 

func testCrypt(data:NSData,keyData:NSData,ivData:NSData,operation:CCOperation) - > NSData的? {
let keyBytes = UnsafePointer< UInt8>(keyData.bytes)
print(keyLength = \(keyData.length),keyData = \(keyData))

let ivBytes = UnsafePointer< UInt8>(ivData.bytes)
print(ivLength = \(ivData.length),ivData = \(ivData))

let dataLength = int(data.length)
let dataBytes = UnsafePointer< UInt8>(data.bytes)
print(dataLength = \(dataLength),data = \(data))

让cryptData:NSMutableData! = NSMutableData(length:Int(dataLength)+ kCCBlockSizeAES128)
let cryptPointer = UnsafeMutablePointer< UInt8>(cryptData.mutableBytes)
let cryptLength = size_t(cryptData.length)

let keyLength = size_t(kCCKeySizeAES128)
letgoritm:CCAlgorithm = UInt32(kCCAlgorithmAES128)
let选项:CCOptions = UInt32(kCCOptionPKCS7Padding)

var numBytesEncrypted:size_t = 0

let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes,keyLength,
ivBytes,
dataBytes,dataLength,
cryptPointer ,cryptLength,
& numBytesEncrypted)

如果UInt32(cryptStatus)== UInt32(kCCSuccess){
cryptData.length = Int(numBytesEncrypted)
print cryptLength = \(numBytesEncrypted),cryptData = \(cryptData))

} else {
print(Error:\(cryptStatus))
}

return cryptData;
}

//测试代码:

  let keyString =!使用数据键! 
let keyData =(keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding)as NSData!

让ivString =使用随机的iv!
let ivData =(keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding)as NSData!

let message =不要尝试阅读这个文本顶级秘密
让data =(消息为NSString).dataUsingEncoding(NSUTF8StringEncoding)为NSData!

print(data:\(data))
如果let encryptedData = testCrypt(data,keyData:keyData,ivData:ivData,operation:UInt32(kCCEncrypt)){
print(encryptedData:\(encryptedData))
如果let decryptptedData = testCrypt(encryptedData,keyData:keyData,ivData:ivData,operation:UInt32(kCCDecrypt)){
print(decryptptedData :\(decryptptedData))
}
}

输出: / p>

 
数据:446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
keyLength = 16,keyData = 21557365 20612064 61746120 6b657921
ivLength = 16,ivData = 21557365 20612064 61746120 6b657921
dataLength = 46,data = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
cryptLength = 48,cryptData = c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d 6675
encryptedData:c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675
keyLength = 16,keyData = 21557365 20612064 61746120 6b657921
ivLength = 16,ivData = 21557365 20612064 61746120 6b657921
DATALENGTH = 48,数据= c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675
cryptLength = 46,cryptData = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
decryptedData:446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666

此处还有其他SOVER加密示例。



ECB示例 SO答复包裹在一个函数中,但您应该真正使用CBC模式。 / p>

CBC示例 SO答案代码。


I am trying to encrypt a string, using Public/Private Key system. I need to pass a string to the server, where a PHP script can decrypt it. I have a working JavaScript to PHP script system, however, I'd like to make it possible for the PHP script to also accept data from the iOS app. Can anyone point me in the right direction, or perhaps even introduce me to a system which could achieve a similar result. I am looking for any type of encryption that I could use to decrypt with PHP. Thank you in advance.

解决方案

PHP and iOS both support AES encryption.

On iOS Common Crypto supports both asymmetric (RSA) and symmetric (AES) encryption. If there is not a compelling need for PKI (Public key infrastructure) use AES.

The only issue is that PHP uses non-standard padding (null) instead of PKCS#7 so you will have to do your own padding either on the iOS size to match the Bozo scheme PHP uses or on the PHP side to match the standard PKCS#7. Note the PHP padding fails if the last byte of the data is 0.

Here is an implementation example wrapped in a function with an iv:

Swift 2.0

Add the Security.framework to the project.

#import <CommonCrypto/CommonCrypto.h

func testCrypt(data:NSData, keyData:NSData, ivData:NSData, operation:CCOperation) -> NSData? {
    let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
    print("keyLength   = \(keyData.length), keyData   = \(keyData)")

    let ivBytes = UnsafePointer<UInt8>(ivData.bytes)
    print("ivLength    = \(ivData.length), ivData    = \(ivData)")

    let dataLength = Int(data.length)
    let dataBytes  = UnsafePointer<UInt8>(data.bytes)
    print("dataLength  = \(dataLength), data      = \(data)")

    let cryptData: NSMutableData! = NSMutableData(length: Int(dataLength) + kCCBlockSizeAES128)
    let cryptPointer = UnsafeMutablePointer<UInt8>(cryptData.mutableBytes)
    let cryptLength  = size_t(cryptData.length)

    let keyLength              = size_t(kCCKeySizeAES128)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
    let options:   CCOptions   = UInt32(kCCOptionPKCS7Padding)

    var numBytesEncrypted :size_t = 0

    let cryptStatus = CCCrypt(operation,
        algoritm,
        options,
        keyBytes, keyLength,
        ivBytes,
        dataBytes, dataLength,
        cryptPointer, cryptLength,
        &numBytesEncrypted)

    if UInt32(cryptStatus) == UInt32(kCCSuccess) {
        cryptData.length = Int(numBytesEncrypted)
        print("cryptLength = \(numBytesEncrypted), cryptData = \(cryptData)")

    } else {
        print("Error: \(cryptStatus)")
    }

    return cryptData;
}

// Test code:

let keyString = "!Use a data key!"
let keyData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

let ivString = "Use a random iv!"
let ivData = (keyString as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

let message = "Don´t try to read this text. Top Secret Stuff"
let data = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!

print("data: \(data)")
if let encryptedData = testCrypt(data, keyData:keyData, ivData:ivData, operation:UInt32(kCCEncrypt)) {
    print("encryptedData: \(encryptedData)")
    if let decryptedData = testCrypt(encryptedData, keyData:keyData, ivData:ivData, operation:UInt32(kCCDecrypt)) {
        print("decryptedData: \(decryptedData)")
    }
}

Output:

data: 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
keyLength   = 16, keyData   = 21557365 20612064 61746120 6b657921
ivLength    = 16, ivData    = 21557365 20612064 61746120 6b657921
dataLength  = 46, data      = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
cryptLength = 48, cryptData = c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675
encryptedData: c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675
keyLength   = 16, keyData   = 21557365 20612064 61746120 6b657921
ivLength    = 16, ivData    = 21557365 20612064 61746120 6b657921
dataLength  = 48, data      = c184cb8b 3d24b56f 1e2896c4 a933a824 d5f8820b 9e7549c6 4188594c 8c1e5941 67adbc80 420bc362 0d851d4f f88d6675
cryptLength = 46, cryptData = 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666
decryptedData: 446f6ec2 b4742074 72792074 6f207265 61642074 68697320 74657874 2e20546f 70205365 63726574 20537475 6666

There are other examples of Swift AES encryption here on SO.

ECB example SO answer wrapped in a function, but you should really use CBC mode.

CBC example SO answer code.

这篇关于Swift中的异步加密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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