首页 > 解决方案 > 我怎样才能在 Java 和有点过时的 Swift 代码中获得相同数量的字节?

问题描述

我试图在Java. 我正在使用已知decryptionencrypted字符串key。但是,我无法在Java.

let usrKey: NSData! = (usrKey as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
let keyBytes = UnsafeMutableRawPointer(mutating: usrData!.bytes)
  1. 我怎样才能得到同样keyBytes的东西Java
  2. 上述在Java语言中的等价表达会是什么?
  3. 的行为是mutating什么?

我尝试使用的 Java 代码以及下面的错误。

byte [] keyBytes = userKey.getBytes("UTF-8");
SecretKeySpec secret = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, newIvParameterSpec(ivBytes));
byte[] outputBytes = cipher.doFinal(inputBytes);

input 16 bytes
iv 16 bytes
key 32 bytes
ALGORITHM - AES128/CBC/PKCS5Padding

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)

问题是找到正确的方法来获取用户密钥(可能很短,因此可以填充)并在代码之间创建类似的(32 bytes解密算法需要) 。SwiftJava

标签: javaswift

解决方案


Java 线

byte [] keyBytes = userKey.getBytes("UTF-8");

应该与两条 Swift 行具有相同的效果。问题可能不在您在问题中显示的代码范围内。您可能需要调试 Swift 和 Java 代码以确保usrKey匹配userKey和结果keyBytes在 Swift 和 Java 中是相同的。

有关. _ _ mutating有关任何其他 API 相关问题,请参阅 Apple 文档。


推荐阅读