do {
let JSONObject:[String:String] =
[
"username" : "username",
"password" : "Password",
"domain": "domain"
]
let my64data:NSData = NSData(base64EncodedString:Credentials.SecretKey, options: NSDataBase64DecodingOptions(rawValue: UInt(0)))!
let jsonData = try NSJSONSerialization.dataWithJSONObject(JSONObject, options: NSJSONWritingOptions.PrettyPrinted)
let myString = String(data: jsonData, encoding: NSUTF8StringEncoding)
// let jsonString = AES1.encrypt(myString!, secretKey: Credentials.SecretKey, options:["iv":my64data])
// print(" My Encrypted Json = \(jsonString)")
//
// let Decrypt = AES1.decrypt(jsonString, secretKey: Credentials.SecretKey, options: ["iv":my64data])
//print(" My Decrypted Json = \(Decrypt)")
let iv: Array<UInt8> = AES.randomIV(128/8)
let salt: Array<UInt8> = AES.randomIV(128/8)
let value = try! PKCS5.PBKDF2(password: Credentials.SecretKey.utf8.map({$0}), salt: salt, iterations: 1000, variant: .sha256).calculate()
value.toHexString()
_ = CryptoJS.mode.ECB()
_ = CryptoJS.pad.Iso97971()
_ = CryptoJS.pad.AnsiX923()
_ = CryptoJS.pad.Iso10126()
_ = CryptoJS.pad.ZeroPadding()
let encrypted : Array<UInt8>
encrypted = try AES(key: value, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt((myString?.utf8.map({$0}))!)
let decrypted = try AES(key: value, iv: iv, blockMode: .CBC, padding: PKCS7()).decrypt(encrypted)
// let jsonString = AES1.encrypt(myString!, secretKey: String(value), options:["iv":iv.toHexString(),"mode":CryptoJS.mode().ECB,"padding":CryptoJS.pad().ZeroPadding])
print(" My Encrypted Json = \(encrypted.toHexString())")
//
// let pkcs = PKCS7()
//
// let Decrypt = AES1.decrypt(jsonString, secretKey: String(value), options: ["iv":iv.toHexString(),"mode":CryptoJS.mode().ECB,"padding":pkcs])
print(" My Decrypted Json = \(decrypted.toHexString())")
let myInputIV : String = String(iv.toHexString())
let myInputSalt :String = String(salt.toHexString())
let finalJSONObject:[String:String] = [
"ciphertext" : "\(encrypted.toHexString())",
"iv" : "\(myInputIV)",
"salt": "\(myInputSalt)"
]
print("Final Json Object = \(finalJSONObject)")
let requestURL: NSURL = NSURL(string:"<myURL>")!
print(requestURL)
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
urlRequest.HTTPMethod = "POST"
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.HTTPBody = try!NSJSONSerialization.dataWithJSONObject(finalJSONObject, options:.PrettyPrinted)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest, completionHandler:{
data, response, error -> Void in
// Asynchronously call...
if (data != nil) {
print("Dataaa = \(data!)")
self.loginServiceResponse(data!)
}else{
Singleton.SharedInstance.myAlert(alertTitle:Constants.SERVER_ERROR_TITLE, alertMessage: Constants.SERVER_ERROR_MESSAGE, alertButtonTitle:Constants.OK)
self.activityIndicator.stopAnimating()
}
})
task.resume()
} catch {
print(error)
}我发现了一个错误:
使用Json错误Domain=NSCocoaErrorDomain Code=3840出错“字符0周围的无效值”。UserInfo={字符0周围的NSDebugDescription=Invalid值。}
发布于 2016-10-28 12:05:57
使用Swift中的通用密码
#import <CommonCrypto/CommonCrypto.h>添加到标头。该示例使用CBC模式,并以IV作为加密数据的前缀,IV是通常用于处理IV的一种方法。
示例来自弃用的文档部分:
带有随机IV的CBC模式AES加密(SWIFT3.0)
该iv以加密数据为前缀。
aesCBC128Encrypt将创建一个随机IV并以加密代码为前缀。
aesCBC128Decrypt将在解密过程中使用前缀IV。
输入是数据,键是数据对象。如果编码形式(如Base64 )(如果需要)在调用方法中转换为和(或)从。
键的长度应该是128位(16字节)、192位(24字节)或256位(32字节).如果使用另一个键大小,则会引发错误。
默认情况下设置PKCS#7填充。
此示例需要通用密码
有必要为项目设置一个桥接头:
#import <CommonCrypto/CommonCrypto.h>
将Security.framework添加到项目中。
这是一个例子,而不是生产代码。
enum AESError: Error {
case KeyError((String, Int))
case IVError((String, Int))
case CryptorError((String, Int))
}
// The iv is prefixed to the encrypted data
func aesCBCEncrypt(data:Data, keyData:Data) throws -> Data {
let keyLength = keyData.count
let validKeyLengths = [kCCKeySizeAES128, kCCKeySizeAES192, kCCKeySizeAES256]
if (validKeyLengths.contains(keyLength) == false) {
throw AESError.KeyError(("Invalid key length", keyLength))
}
let ivSize = kCCBlockSizeAES128;
let cryptLength = size_t(ivSize + data.count + kCCBlockSizeAES128)
var cryptData = Data(count:cryptLength)
let status = cryptData.withUnsafeMutableBytes {ivBytes in
SecRandomCopyBytes(kSecRandomDefault, kCCBlockSizeAES128, ivBytes)
}
if (status != 0) {
throw AESError.IVError(("IV generation failed", Int(status)))
}
var numBytesEncrypted :size_t = 0
let options = CCOptions(kCCOptionPKCS7Padding)
let cryptStatus = cryptData.withUnsafeMutableBytes {cryptBytes in
data.withUnsafeBytes {dataBytes in
keyData.withUnsafeBytes {keyBytes in
CCCrypt(CCOperation(kCCEncrypt),
CCAlgorithm(kCCAlgorithmAES),
options,
keyBytes, keyLength,
cryptBytes,
dataBytes, data.count,
cryptBytes+kCCBlockSizeAES128, cryptLength,
&numBytesEncrypted)
}
}
}
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
cryptData.count = numBytesEncrypted + ivSize
}
else {
throw AESError.CryptorError(("Encryption failed", Int(cryptStatus)))
}
return cryptData;
}
// The iv is prefixed to the encrypted data
func aesCBCDecrypt(data:Data, keyData:Data) throws -> Data? {
let keyLength = keyData.count
let validKeyLengths = [kCCKeySizeAES128, kCCKeySizeAES192, kCCKeySizeAES256]
if (validKeyLengths.contains(keyLength) == false) {
throw AESError.KeyError(("Invalid key length", keyLength))
}
let ivSize = kCCBlockSizeAES128;
let clearLength = size_t(data.count - ivSize)
var clearData = Data(count:clearLength)
var numBytesDecrypted :size_t = 0
let options = CCOptions(kCCOptionPKCS7Padding)
let cryptStatus = clearData.withUnsafeMutableBytes {cryptBytes in
data.withUnsafeBytes {dataBytes in
keyData.withUnsafeBytes {keyBytes in
CCCrypt(CCOperation(kCCDecrypt),
CCAlgorithm(kCCAlgorithmAES128),
options,
keyBytes, keyLength,
dataBytes,
dataBytes+kCCBlockSizeAES128, clearLength,
cryptBytes, clearLength,
&numBytesDecrypted)
}
}
}
if UInt32(cryptStatus) == UInt32(kCCSuccess) {
clearData.count = numBytesDecrypted
}
else {
throw AESError.CryptorError(("Decryption failed", Int(cryptStatus)))
}
return clearData;
}示例用法:
let clearData = "clearData0123456".data(using:String.Encoding.utf8)!
let keyData = "keyData890123456".data(using:String.Encoding.utf8)!
print("clearData: \(clearData as NSData)")
print("keyData: \(keyData as NSData)")
var cryptData :Data?
do {
cryptData = try aesCBCEncrypt(data:clearData, keyData:keyData)
print("cryptData: \(cryptData! as NSData)")
}
catch (let status) {
print("Error aesCBCEncrypt: \(status)")
}
let decryptData :Data?
do {
let decryptData = try aesCBCDecrypt(data:cryptData!, keyData:keyData)
print("decryptData: \(decryptData! as NSData)")
}
catch (let status) {
print("Error aesCBCDecrypt: \(status)")
}示例输出:
clearData: <636c6561 72446174 61303132 33343536>
keyData: <6b657944 61746138 39303132 33343536>
cryptData: <92c57393 f454d959 5a4d158f 6e1cd3e7 77986ee9 b2970f49 2bafcf1a 8ee9d51a bde49c31 d7780256 71837a61 60fa4be0>
decryptData: <636c6561 72446174 61303132 33343536>备注:
CBC模式示例代码的一个典型问题是,它将随机IV的创建和共享留给用户。此示例包括IV的生成、加密数据的前缀以及在解密期间使用前缀IV。这使普通用户从CBC模式所需的细节中解脱出来。
为了安全性,加密的数据也应该具有身份验证,此示例代码不提供为了更小,并允许其他平台更好的互操作性。
此外,还缺少从密码中导出密钥的密钥,建议使用PBKDF2是文本密码作为密钥的材料。
要获得健壮的生产准备多平台加密代码,请参阅RNCryptor。
https://stackoverflow.com/questions/40232017
复制相似问题