gpt4 book ai didi

java - Swift AES 实现

转载 作者:搜寻专家 更新时间:2023-11-01 05:57:03 26 4
gpt4 key购买 nike

您好,我正在构建一个与 Restful 服务器通信的 iOS 应用程序。这需要我的 java AES 代码和 Swift AES 代码产生与我当前使用 CryptoSwift 相同的结果,使用此处的教程 (AES Encrypt and Decrypt)。然而,与我的 Java 代码相比,这给了我不同的结果。

这是我的java代码:

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("AES");
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("AES");
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}

public static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, "AES");
return key;
}

public static void main(String[] args) {
try {
System.out.println(AES.encrypt("test"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

这段代码给我 xGdooY+6V8q1cze7mR9TjQ==

这是我的swift代码

import Foundation
import CryptoSwift

extension String {
func aesEncrypt(key: String, iv: String) throws -> String{
let data = self.dataUsingEncoding(NSUTF8StringEncoding)
let enc = try AES(key: key, iv: iv, blockMode:.CBC).encrypt(data!.arrayOfBytes())
let encData = NSData(bytes: enc, length: Int(enc.count))
let base64String: String = encData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0));
let result = String(base64String)
return result
}

func aesDecrypt(key: String, iv: String) throws -> String {
let data = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0))
let dec = try AES(key: key, iv: iv, blockMode:.CBC).decrypt(data!.arrayOfBytes())
let decData = NSData(bytes: dec, length: Int(dec.count))
let result = NSString(data: decData, encoding: NSUTF8StringEncoding)
return String(result!)
}
}

let key = "TheBestSecretKey" // length == 32
let iv = "gqLOHUioQ0QjhuvI" // length == 16
let s = "test"
let enc = try! s.aesEncrypt(key, iv: iv)
let dec = try! enc.aesDecrypt(key, iv: iv)
print(s)
print("enc:\(enc)")
print("dec:\(dec)")
print("\(s == dec)")

这段代码给我 LQu3c4HaOQf7W0CfnMMy1w==

如您所见,它们确实独立工作,但我需要它们兼容

最佳答案

您正在进行两种不同类型的加密。
您的 Java 代码使用的是 AES 密码,更准确地说是 AES/ECB/PKCS5Padding 而您的 swift 代码正在执行与 AES/CBC/PKCS5Padding 相同的操作code> 并且正在使用 IV。
换句话说,您的 swift 代码正在执行密码 block 链接并使用初始化 vector 。当您的 Java 代码在没有 IV 的情况下执行 ECB 模式时。
如果您不知道自己在做什么,则不应该实现加密方案,但至少,您应该始终使用随机 IV 和密码 block 链接。
你真的不应该使用 ECB 模式。
如果您使用随机 IV,那么每次加密时结果都会不同。
与其检查密文是否相同,不如测试是否可以在每个组件之间加密/解密消息。

关于java - Swift AES 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38037454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com