1

我进行扩展以生成使用 AES 加密和解密的函数,如下所示:

import cryptoswift

extension String {
func aesEncrypt(key: String, iv: String) throws -> String{
    let data = self.dataUsingEncoding(NSUTF8StringEncoding)
    let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes(), padding: PKCS7())
    let encData = NSData(bytes: enc, length: Int(enc.count))
    let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));
    let result = String(base64String)
    return result
}

func aesDecrypt(key: String, iv: String) throws -> String {
    let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0))
    let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes(), padding: PKCS7())
    let decData = NSData(bytes: dec, length: Int(dec.count))
    let result = NSString(data: decData, encoding: NSUTF8StringEncoding)
    return String(result!)
}
}

但 aesEncrypt 和 aesDecrypt 在这些行的调用中都有错误额外参数“填充”:

let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes(), padding: PKCS7())

let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes(), padding: PKCS7())

如何修复这些错误?

更新:我正在使用新方法来获取 aes 加密:

let langinput = "us"
let aes = try AES(key: key, iv: iv) // aes128
let langencrypted = try aes.encrypt(langinput.utf8.map({$0}))
let encData = NSData(bytes: langencrypted, length: Int(langencrypted.count))
let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));
let aes_encrypt_result = String(base64String)
4

1 回答 1

0

AES 是一种块密码,这意味着数据必须是块大小(AES 16 字节)的倍数,因此需要在加密期间添加填充字节,并在解密期间删除填充字节。

使用RNCryptor,它使用了经过 FIPS 140 认证的 Apple Common Crypto,并使用了硬件加密引擎。它提供了经过身份验证的 AES 加密,并在需要时提供密码派生。它经过了很好的审查。除此之外,SO 上有几个 Swift AES 实现。

RNCryptor 会为您处理 iv,并将其与其他信息一起添加到加密数据中。请参阅RNCryptor-Spec。如果您需要与另一个实现进行互操作,这不是一个好的选择。

于 2016-06-28T03:42:32.783 回答