【问题标题】:Equivalent encryption in java and ios using CryptoSwift使用 CryptoSwift 在 java 和 ios 中进行等效加密
【发布时间】:2017-07-11 09:16:48
【问题描述】:
 public static String encryptStringToBase64(String messageString) { 
        byte[] messageBytes = messageString.getBytes("UTF-8"); 
        byte[] encrypted = convert(1, messageBytes); 
        return Base64.encodeBytes(encrypted); 
    } 

private static byte[] convert(int mode, byte[] messageBytes) { 

    MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 
    sha256.update("abcdefgh".getBytes("UTF-8")); 
    byte[] keyBytes = sha256.digest(); 
    byte[] hash = Arrays.copyOfRange(keyBytes, 0, 16); 

    SecretKeySpec keySpec = new SecretKeySpec(hash, "AES"); 
    byte[] ivBytes = new byte[16]; 
    IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    cipher.init(mode, keySpec, ivSpec); 
    return cipher.doFinal(messageBytes); 
}

上面是java中用于加密的逻辑,下面是加密技术 https://gist.github.com/m1entus/f70d4d1465b90d9ee024 https://github.com/krzyzanowskim/CryptoSwift 但我无法在 java 和 iOS 中生成相同的加密字符串。有什么方法可以在 iOS 中重现相同的数据。

Swift 3.0 代码

import CryptoSwift

let ram = "aaaa"
let pas = "abbbb"

let usernameutf8data = ram.data(using: String.Encoding.utf8)
let passwordutf8data = pas.data(using: String.Encoding.utf8)

let copyRight = "abcdefgh"
let copyRightUtf8 = copyRight.data(using: .utf8)

let hash =  copyRightUtf8?.sha256()
let key: Array<UInt8> = Array(hash!.bytes[0..<16])

let iv: Array<UInt8> = [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]//AES.randomIV(AES.blockSize)

let encrypted = try AES(key:key , iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt(usernameutf8data!)

let encryptedpas = try AES(key:key , iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt(passwordutf8data!)

【问题讨论】:

  • 显示你的 Swift 代码并指定什么不起作用

标签: ios swift swift3 cryptoswift


【解决方案1】:

Base64EncodedString:

 func encryptStringToBaseSixtyFour(value : String) -> String {
       let data = value.data(using: .utf8)
       return data?.base64EncodedString()
 }

AES 加密字符串

func aesEncrypt(value: String, key: String, iv: String) throws -> String {
    let data = value.data(using: .utf8)!
    let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
    let encryptedData = Data(encrypted)
    return encryptedData.base64EncodedString()
}

AES 解密值

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

【讨论】:

  • 在java中为iv值byte[] ivBytes = new byte[16]; IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); swift 中 iv 的等价物。
  • 让 ivByte = [UInt8](repeatElement(0, count: 16)) 让 ivParameterSpec = IvParameterSpec(ivByte) 解释https://stackoverflow.com/questions/36459726/create-a-16-byte-array-of-zeros-in-swift
  • 这个 MessageDigest sha256 = MessageDigest.getInstance("SHA-256"); 怎么样sha256.update("abcdefgh".getBytes("UTF-8"));字节[] keyBytes = sha256.digest(); byte[] hash = Arrays.copyOfRange(keyBytes, 0, 16); SecretKeySpec keySpec = new SecretKeySpec(hash, "AES");
  • 你在使用 AES 加密吗?
  • 是的,我们正在使用 AES 加密......尝试 AES(key:Array , iv: Array, blockMode: .CBC, padding: PKCS7()).encrypt(usernameutf8data !)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 2014-01-14
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多