我试图在 Java
中获取以下代码段的相同字节数。我正在使用已知 key
对加密
字符串进行解密
。但是,我无法在 Java
中重现这两行代码。
let usrKey: NSData! = (usrKey as NSString).data(using: String.Encoding.utf8.rawValue) as NSData!
let keyBytes = UnsafeMutableRawPointer(mutating: usrData!.bytes)
- 如何在
Java
中获得相同的keyBytes
? - 在
Java
语言中,上面的等价表达式是什么? 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)
问题是找到正确的方法来获取用户 key (可以很短,所以填充)并在 Swift
之间创建类似的 32 字节
(解密算法需要) > 和 Java
代码。
最佳答案
Java 行
byte [] keyBytes = userKey.getBytes("UTF-8");
应该与 Swift 的两条线具有相同的效果。问题可能出在您在问题中显示的代码之外。您可能希望同时调试 Swift 和 Java 代码以确保 usrKey
匹配 userKey
并且生成的 keyBytes
在 Swift 和Java.
请参阅 https://developer.apple.com/documentation/swift/unsafemutablerawpointer/2427850-init 上的 Apple 文档mutating
的含义。另请参阅 Apple 文档以了解任何其他与 API 相关的问题。
关于java - 我怎样才能在 Java 中获得与过时的 Swift 代码相同的字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51973323/