CommonCrypto生成16个字符长

时间:2016-02-25 22:40:44

标签: swift encryption commoncrypto

这是我第一次尝试使用加密,因此我不确定使用以下代码是否可以实现所需。

我的问题 - 我需要它来生成一个包含16个字符的编码字符串,而不是当前正在生成的64个字符。

我倾向于使用本机swift库而不是外部框架。因此,如何使用CommonCrypto无法找到更多。不确定它是否也是正确的方法。

我得到的例子

http://sketchytech.blogspot.co.nz/2016/02/resurrecting-commoncrypto-in-swift-for.html

我的用法

let keyString = "1234567812345678"
    let message = "12345678123456781234567812345678"
    let iv = "iv-salt-string--" // string of 16 characters in length

    let encoded = message.aesEncrypt(keyString, iv: iv)!
    print("encoded -> \(encoded)")

    let unencode = encoded.aesDecrypt(keyString, iv: iv)!
    print("unencode -> \(unencode)")

输出

encoded -> S81qV6F31xO8mUA1+HhsF7pHOMeE0f6Bbcmj3Zzk3EFLhQTCmfYlouorrUkYKL6K
unencode -> 12345678123456781234567812345678

扩展

extension String {

    func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
        if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
            data = self.dataUsingEncoding(NSUTF8StringEncoding),
            cryptData    = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {


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



                var numBytesEncrypted :size_t = 0

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

                if UInt32(cryptStatus) == UInt32(kCCSuccess) {
                    cryptData.length = Int(numBytesEncrypted)
                    let base64cryptString = cryptData.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
                    return base64cryptString


                }
                else {
                    return nil
                }
        }
        return nil
    }

    func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {
        if let keyData = key.dataUsingEncoding(NSUTF8StringEncoding),
            data = NSData(base64EncodedString: self, options: .IgnoreUnknownCharacters),
            cryptData    = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128) {

                let keyLength              = size_t(kCCKeySizeAES128)
                let operation: CCOperation = UInt32(kCCDecrypt)
                let algoritm:  CCAlgorithm = UInt32(kCCAlgorithmAES128)
                let options:   CCOptions   = UInt32(options)

                var numBytesEncrypted :size_t = 0

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

                if UInt32(cryptStatus) == UInt32(kCCSuccess) {
                    cryptData.length = Int(numBytesEncrypted)
                    let unencryptedMessage = String(data: cryptData, encoding:NSUTF8StringEncoding)
                    return unencryptedMessage
                }
                else {
                    return nil
                }
        }
        return nil
    }
}

2 个答案:

答案 0 :(得分:0)

从hex转换为数据后,您有16个字节的输入。您指定PKCS#7 padding kCCOptionPKCS7Padding。如果数据是块大小的精确倍数PKCS#7填充必须将整个填充块添加到要加密的数据中,从而产生32字节的数据。 (这是因为必须总是添加一些填充,如果没有部分块,唯一的方法是添加一个填充块。)在解密时,将删除16字节的填充,这样你将获得16字节的数据

请参阅:PKCS#7 padding

如果输入数据总是是块大小的倍数(16字节),那么您不需要添加填充,因此您不需要提供kCCOptionPKCS7Padding一个选项。

答案 1 :(得分:0)

popViewController

这是16位长度