快速AES实现



嗨,我正在构建一个与restful服务器通信的iOS应用程序。这需要我的java AES代码和Swift AES代码来产生相同的结果,目前我使用CryptoSwift,使用这里的教程(AES加密和解密)。然而,与我的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,并使用IV。
换句话说,你的swift代码正在做密码块链并使用初始化向量。当你的java代码做ECB模式没有IV.
如果你不知道你在做什么,你不应该实现加密方案,但至少,你应该总是使用随机IV和密码块链。你真的不应该使用ECB模式。
如果您使用随机IV,那么每次加密的结果都将不同。
而不是检查密文是否相同,您应该测试您可以加密/解密每个组件之间的消息。

最新更新