iOS(swift3),Android和PHP之间的加密/解密

时间:2017-07-04 06:00:46

标签: ios swift encryption swift3

你好其他程序员,

关于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
}

2 个答案:

答案 0 :(得分:0)

  1. 在Android上使用Java 8.
  2. 在Android计算机上安装Java Cryptography Extension
  3. 检查您的Base64课程。
  4. 在此测试:http://aesencryption.net
  5. 检查哪些位兼容。
  6. 检查密钥大小。
  7. 测试提示:使用相同的(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 {
    
  }
}