你好其他程序员,
关于ios(Swift3)加密/解密: 我是一个非常迅速的初学者。我按照https://www.funboxpower.com/php_android_ios_aes的教程完成了Android和PHP之间的加密/解密。
现在我想在iOS(Swift3)上做同样的事情,作者提到ios(object-c)方法为Wanted Compatible AES code Encrypt/Decrypt for Iphone, Android, Windows/XP
所以我找到CryptoSwift,它帮助我加密我的字符串。但结果与Android和PHP不同。我如何使用带有CryptoSwift的iOS(Swift3)加密/解密教程(Android / PHP)?
以下是Swift加密的代码:
import CryptoSwift
class LoginViewController: UIViewController {
@IBAction func loginAction(sender: AnyObject) {
let account = self.accountTextField.text
let password = self.passwordTextField.text
let key = "itakeylengthtotalis32keykeykey00"
let iv = "0000000000000000"
let encryptedAccount = try! account?.aesEncrypt(key:key, iv: iv)
let encryptedPassword = try! password?.aesEncrypt(key:key, iv: iv)
//result here ------------------------------
print( "encryptedAccount: " + encryptedAccount! )
print( "encryptedPassword: " + encryptedPassword! )
}
}
extension String {
func aesEncrypt(key: String, iv: String) -> String? {
var result: String?
do {
// 用UTF8的编碼方式將字串轉成Data / use Data func for a UT8 string
let data: Data = self.data(using: String.Encoding.utf8, allowLossyConversion: true)!
// 用AES的方式將Data加密 / use AES to encrypt Data
let aecEnc: AES = try AES(key: key, iv: iv, blockMode: .CBC, padding:PKCS7())
let enc = try aecEnc.encrypt(data.bytes)
// 使用Base64編碼方式將Data轉回字串 / use Base64 to encode string
let encData: Data = Data(bytes: enc, count: enc.count)
result = encData.base64EncodedString()
} catch {
print("\(error.localizedDescription)")
}
return result
}
答案 0 :(得分:0)
测试提示:使用相同的(iv)调查向量&所有三个平台上的密钥都从一个平台加密,并尝试解密其他使用带有编码的加密解密文本。
答案 1 :(得分:0)
使用开放SSL的php和iOS(swift 3)完整解决方案
php部分:
func encryptString(str : String, enc_key : String, enc_iv : String) -> String
{
let message = str
let key = enc_key.sha256()
var ivString = kAppDelegate.kObjUser.iv.sha256()
ivString = String(ivString.prefix(16))
let encrypted = message.aesEncrypt(key: key, iv: ivString)
return encrypted?.encodeToBase64() ?? ""
}
func decryptString(ciphertext : String, enc_key : String, enc_iv : String) -> String
{
let message = ciphertext.decodeBase64()
let key = enc_key.sha256()
var ivString = enc_iv.sha256()
ivString = String(ivString.prefix(16))
let decrypted = message.aesDecrypt(key: key, iv: ivString)
return decrypted ?? ""
}
快速3部分:
public extension String {
public func decodeBase64() -> String {
return String.decodeBase64(self)
}
public static func decodeBase64(_ string: String) -> String {
let data: Data = Data(base64Encoded: string as String, options: NSData.Base64DecodingOptions(rawValue: 0))!
return NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String
}
public func encodeToBase64() -> String {
return String.encodeToBase64(self)
}
public static func encodeToBase64(_ string: String) -> String {
let data: Data = string.data(using: String.Encoding.utf8)!
return data.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
}
}
extension String {
func sha256() -> String{
if let stringData = self.data(using: String.Encoding.utf8) {
return hexStringFromData(input: digest(input: stringData as NSData))
}
return ""
}
private func digest(input : NSData) -> NSData {
let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
var hash = [UInt8](repeating: 0, count: digestLength)
CC_SHA256(input.bytes, UInt32(input.length), &hash)
return NSData(bytes: hash, length: digestLength)
}
private func hexStringFromData(input: NSData) -> String {
var bytes = [UInt8](repeating: 0, count: input.length)
input.getBytes(&bytes, length: input.length)
var hexString = ""
for byte in bytes {
hexString += String(format:"%02x", UInt8(byte))
}
return hexString
}
}
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(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES)
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(kCCKeySizeAES256)
let operation: CCOperation = UInt32(kCCDecrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES)
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
}
}
快速助手扩展
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
document.addEventListener("backbutton", function(e) {
e.preventDefault();
navigator.notification.confirm("Press again to exit from the app", onConfirmExit, "Yes", "No");
}, false);
}
function onConfirmExit(button) {
if (button == 1) {
navigator.app.exitApp();
} else {
}
}