-1

我正在尝试以swift与我在 java 中的代码等效的方式实现。基本上是一个AES带有GCM填充的实现,我为此使用了一个密钥派生。在swift我使用CryptoSwift图书馆。

我的问题是我无法在swift. 经过很长时间的研究,我找不到任何解决问题的方法,我什至看到了CryptoSwift库存储库的测试代码以获得任何想法,但没有运气

这是我的java代码:

GCMParameterSpec ivParameterSpec = new GCMParameterSpec(128, "ivVector".getBytes());
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec("myPassword".toCharArray(), "salt".getBytes(), 1000, 256);
SecretKey tmp = secretKeyFactory.generateSecret(keySpec);
key = new SecretKeySpec(tmp.getEncoded(), "AES");
encryptCipher = Cipher.getInstance("AES/GCM/NoPadding");

encryptCipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec);
            byte[] encryptedWord = Base64.encode(encryptCipher.doFinal("example".getBytes("UTF-8")));

这是我的快速代码:

do{
    keyDerivation = try PKCS5.PBKDF2(password: "myPassword".bytes, salt: "salt".bytes, iterations: 1000, keyLength: 32, variant: .sha1).calculate()
    let gcm = GCM(iv: keyDerivation, mode: .combined)
    let aes = try AES(key: keyDerivation, blockMode: gcm, padding: .noPadding)
    let encryptedText = try aes.encrypt("example".bytes)

}catch{
    print(error)
}

任何帮助,将不胜感激。

4

1 回答 1

1

您的 IV 在这两种情况下都不匹配。在 Java 中使用字符串,而在 Swift 中使用keyDerivation.

此外,您应该确保使用相同的字符编码。对于这两种语言,我都不会使用getBytes或类似。明确指定 UTF-8 可能是最好的。

请注意,JavaPBKDF2WithHmacSHA1可能会以一种相当特殊的方式处理密码编码,因此可能需要对密码进行某种输入验证。

不用说,每次加密调用的盐应该是随机的,而不是静态的。我认为这只是测试代码。

于 2020-05-13T12:52:53.947 回答