AES GCM 密钥派生 swift
AES GCM key derivation swift
我正在尝试在 swift
中实现与我在 java 中的代码等效的代码。基本上是一个带有 GCM
填充的 AES
实现,我正在为此使用密钥派生。在 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")));
这是我的 swift 代码:
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)
}
如有任何帮助,我们将不胜感激。
您的 IV 在这两种情况下都不匹配。在 Java 中使用字符串,在 Swift 中使用 keyDerivation
.
中的派生密钥
此外,您应该确保使用相同的字符编码。对于任何一种语言,我都不会使用 getBytes
或类似的语言。明确指定 UTF-8 可能是最好的。
请注意,Java PBKDF2WithHmacSHA1
可能会以一种相当特殊的方式处理密码编码,因此可能需要对密码进行某种输入验证。
不用说,每次调用加密时盐应该是随机的,而不是静态的。我认为这只是测试代码。
我正在尝试在 swift
中实现与我在 java 中的代码等效的代码。基本上是一个带有 GCM
填充的 AES
实现,我正在为此使用密钥派生。在 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")));
这是我的 swift 代码:
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)
}
如有任何帮助,我们将不胜感激。
您的 IV 在这两种情况下都不匹配。在 Java 中使用字符串,在 Swift 中使用 keyDerivation
.
此外,您应该确保使用相同的字符编码。对于任何一种语言,我都不会使用 getBytes
或类似的语言。明确指定 UTF-8 可能是最好的。
请注意,Java PBKDF2WithHmacSHA1
可能会以一种相当特殊的方式处理密码编码,因此可能需要对密码进行某种输入验证。
不用说,每次调用加密时盐应该是随机的,而不是静态的。我认为这只是测试代码。