【发布时间】:2017-06-06 04:21:04
【问题描述】:
我最近被分配了一项任务,即加密我在 swift 中传入 dataTaskWithRequest 的链接和参数。主要令人头疼的是它应该产生与 Android 平台相同的输出。 android 团队已经创建了一个使用 spring 来解密数据的后端。 java代码是这样的
类 AESencrp {
private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[]{'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'}; public static String encrypt(String Data) throws Exception { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.ENCRYPT_MODE, key); byte[] encVal = c.doFinal(Data.getBytes()); String encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } public static String decrypt(String encryptedData) throws Exception { Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); byte[] decValue = c.doFinal(decordedValue); String decryptedValue = new String(decValue); return decryptedValue; } private static Key generateKey() throws Exception { Key key = new SecretKeySpec(keyValue, ALGO); return key; }} 我无法更改此处使用的方法并使用 swift 的内置加密方法。有没有办法在 swift 中进行 AES 加密,既高效又与 java 代码的输出相匹配
我试过了 - POD Cryptoswift
do { let encrypted: [UInt8] = try AES(key: key, iv: iv, blockMode: .ECB).encrypt(inputBytes) let encrypted2: [UInt8] = try AES(key: key, iv: iv, blockMode: .ECB, padding: PKCS5).encrypt(inputBytes) let encryptedNSData = NSData(bytes: encrypted, length: encrypted.count) encryptedBase64 = encryptedNSData.base64EncodedStringWithOptions([]) let encryptedNSData2 = NSData(bytes: encrypted2, length: encrypted2.count) encryPadded = encryptedNSData2.base64EncodedStringWithOptions([]) let decrypted: [UInt8] = try AES(key: key, iv: iv, blockMode: .ECB).decrypt(encrypted) let result = String(bytes: decrypted, encoding: NSUTF8StringEncoding)! print("result\t\(result )") } catch { // some error }
JAVA CODE OUTPUT = "eJvkXYGzEjJ6RbYSp4a3OQ=="
SWIFT CODE OUTPUT = "9UiyETvuHTsN7eIo0HfQ+w=="
如您所见,两种输出都存在差异。这是为什么呢?
【问题讨论】:
-
你有没有设法让它工作?我也在研究这个确切的问题。我的 java 代码虽然是服务器端的,但其他的都是一样的。
-
是的,我做到了..我将在下面发布答案
-
一个很好的跨平台解决方案也支持多种语言是RNCryptor。您还可以获得身份验证,如果需要,还可以获得密钥派生。
-
我刚刚在stackoverflow.com/questions/40421146/… 中发布了一个可以接受的答案。