AESencryption和解密

我用swift编写应用程序,我需要AESencryption和解密function,我从另一个.Net解决scheme接收到encryption的数据,但是我找不到要做的事情。

这是我的.netencryption:

public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) { byte[] encryptedBytes = null; byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; using (MemoryStream ms = new MemoryStream()) { using (RijndaelManaged AES = new RijndaelManaged()) { AES.KeySize = 256; AES.BlockSize = 128; var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); AES.Key = key.GetBytes(AES.KeySize / 8); AES.IV = key.GetBytes(AES.BlockSize / 8); AES.Mode = CipherMode.CBC; using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length); cs.Close(); } encryptedBytes = ms.ToArray(); } } return encryptedBytes; } 

我需要迅速解密函数。

CryptoSwift 示例

更新到Swift 2

 import Foundation 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!) } } 

用法:

 let key = "bbC2H19lkVbQDfakxcrtNMQdd0FloLyw" // length == 32 let iv = "gqLOHUioQ0QjhuvI" // length == 16 let s = "string to encrypt" let enc = try! s.aesEncrypt(key, iv: iv) let dec = try! enc.aesDecrypt(key, iv: iv) print(s) // string to encrypt print("enc:\(enc)") // 2r0+KirTTegQfF4wI8rws0LuV8h82rHyyYz7xBpXIpM= print("dec:\(dec)") // string to encrypt print("\(s == dec)") // true 

确保你有正确的长度iv(16)和键(32),那么你不会打“块大小和初始化向量必须是相同的长度! 错误。

CryptoSwift 示例

更新到Swift 3

 func aesEncrypt(key: String, iv: String) throws -> String { let data = self.data(using: .utf8)! let encrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).encrypt([UInt8](data)) let encryptedData = Data(encrypted) return encryptedData.base64EncodedString() } func aesDecrypt(key: String, iv: String) throws -> String { let data = Data(base64Encoded: self)! let decrypted = try! AES(key: key.bytes, blockMode: .CBC(iv: iv.bytes), padding: .pkcs7).decrypt([UInt8](data)) let decryptedData = Data(decrypted) return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt" } 

有一个有趣的“纯粹的”开源库:

  • CryptoSwift: https : //github.com/krzyzanowskim/CryptoSwift

    它支持:AES-128,AES-192,AES-256,ChaCha20

AES解密示例(从项目README.md文件获取):

 import CryptoSwift let setup = (key: keyData, iv: ivData) let decryptedAES = Cipher.AES(setup).decrypt(encryptedData) 

CryptoSwift是非常有趣的项目,但现在它有一些AES速度限制。 要小心,如果你需要做一些严重的encryption – 这可能是值得经过桥实施CommonCrypto的痛苦。

BigUps到Marcin的pureSwift实现

我使用CommonCrypto通过MihaelIsaev / HMAC.swift的代码生成Hash,从易于使用的Swift实现CommonCrypto HMAC 。 此实现不使用Bridging-Header,创buildModule文件。

现在要使用AESEncrypt和Decrypt,我直接在HAMC.swift中的“extension String {”中join了函数。

 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 } 

这些function是从RNCryptor中获取的 。 这是散列函数和一个单独的文件“HMAC.swift”中的一个简单的补充,没有使用桥接头。 我希望这对于需要散列和AESencryption/解密的开发人员来说非常有用。

在下面使用AESDecrypt的例子。

  let iv = "AA-salt-BBCCDD--" // should be of 16 characters. //here we are convert nsdata to String let encryptedString = String(data: dataFromURL, encoding: NSUTF8StringEncoding) //now we are decrypting if let decryptedString = encryptedString?.aesDecrypt("12345678901234567890123456789012", iv: iv) // 32 char pass key { // Your decryptedString } 

这是一个使用新的WebCrypto API的库。

不需要桥头,它比CryptoSwift更快。

https://github.com/etienne-martin/WebCrypto.swift

基于密码的encryption

encryption

 let crypto = WebCrypto() let input = Data("This is a string".utf8) let password = "password123" crypto.encrypt(data: input, password: password, callback: {(encrypted: Data?, error: Error?) in print(encrypted!) }) 

解密

 crypto.decrypt(data: encrypted, password: password, callback: {(decrypted: Data?, error: Error?) in print(String(data: decrypted!, encoding: .utf8)!) }) 

基于密钥的encryption

encryption

 let crypto = WebCrypto() let input = Data("This is a string".utf8) let key = "6f0f1c6f0e56afd327ff07b7b63a2d8ae91ab0a2f0c8cd6889c0fc1d624ac1b8" let iv = "92c9d2c07a9f2e0a0d20710270047ea2" crypto.encrypt(data: input, key: key, iv: iv, callback: {(encrypted: Data?, error: Error?) in print(encrypted!) }) 

解密

 crypto.decrypt(data: encrypted, key: key, iv: iv, callback: {(encrypted: Data?, error: Error?) in print(String(data: decrypted!, encoding: .utf8)!) }) 

免责声明:我写了这个库。

SHS提供的代码对我来说不起作用,但是显然这样做了(我使用了桥接头: #import <CommonCrypto/CommonCrypto.h> ):

 extension String { func aesEncrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.data(using: String.Encoding.utf8), let data = self.data(using: String.Encoding.utf8), let cryptData = NSMutableData(length: Int((data.count)) + 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 as NSData).bytes, keyLength, iv, (data as NSData).bytes, 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 } } return nil } func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? { if let keyData = key.data(using: String.Encoding.utf8), let data = NSData(base64Encoded: self, options: .ignoreUnknownCharacters), let 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 as NSData).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 as Data, encoding:String.Encoding.utf8) return unencryptedMessage } else { return nil } } return nil } } 

从我的ViewController

  let encoded = message.aesEncrypt(key: keyString, iv: iv) let unencode = encoded?.aesDecrypt(key: keyString, iv: iv) 

我find了解决办法,这是一个很好的图书馆。

跨平台的256位AESencryption/解密。

该项目包含可在所有平台(C#,iOS,Android)上运行的256位AESencryption的实现。 其中一个关键目标就是让AES在所有平台上工作,实现起来非常简单。

支持的平台:iOS,Android,Windows(C#)。

https://github.com/Pakhee/Cross-platform-AES-encryption