【发布时间】:2020-11-06 16:56:31
【问题描述】:
我有一个 java 代码,可以在提供数据和密钥时解密数据。 java类和函数如下,
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
public class AES {
private static SecretKeySpec secretKey;
private static byte[] key;
public static String decrptyBySyymetricKey(String encryptedSek, byte[] appKey) {
Key aesKey = new SecretKeySpec(appKey, "AES"); // converts bytes(32 byte random generated) to key
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // encryption type = AES with padding PKCS5
cipher.init(Cipher.DECRYPT_MODE, aesKey); // initiate decryption type with the key
byte[] encryptedSekBytes = Base64.getDecoder().decode(encryptedSek); // decode the base64 encryptedSek to bytes
byte[] decryptedSekBytes = cipher.doFinal(encryptedSekBytes); // decrypt the encryptedSek with the initialized cipher containing the key(Results in bytes)
String decryptedSek = Base64.getEncoder().encodeToString(decryptedSekBytes); // convert the decryptedSek(bytes) to Base64 StriNG
return decryptedSek; // return results in base64 string
}catch(Exception e) {
return "Exception; "+e;
}
}
public static void main(String[] args){
final String secretKey = "r16glPt7vyO6g22KH4JcpzUIdnUXIy5p";
String custom = AES.decrptyBySyymetricKey("ul1tu6I0tLcfOYAW3Yug0HNP9sKo7O2AUuMLQjs62TOE5g0v9VTzB21EKdSAvlSM", "r16glPt7vyO6g22KH4JcpzUIdnUXIy5p".getBytes());
}
}
现在我需要使用 vanilla JS 和 Crypto-js 库来复制上述内容。但是我无法这样做。我无法弄清楚我哪里出错了。
const encryptedsek = 'ul1tu6I0tLcfOYAW3Yug0HNP9sKo7O2AUuMLQjs62TOE5g0v9VTzB21EKdSAvlSM';
const password = 'r16glPt7vyO6g22KH4JcpzUIdnUXIy5p';
var parsedBase64Key = CryptoJS.enc.Base64.parse(password);
var d = CryptoJS.AES.decrypt(encryptedsek, parsedBase64Key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString( CryptoJS.enc.Utf8 );
我认为是我使用密码的方式导致了问题。它不产生任何输出。 任何指针都会有所帮助。我还尝试了与密码不同的crypto-js解码器,但它不起作用。
提前致谢。
【问题讨论】:
-
在 Java 端,密码不用作 Base64 字符串,而是转换为 32 字节长的字节数组(以十六进制字符串表示形式)。在 JS 端,您尝试使用“var parsedBase64Key = CryptoJS.enc.Base64.parse(password);”来解码密码。只需将密码(或其十六进制字符串表示)提供给您的解密方法。
-
请记住:使用 AES ECB 模式可能不安全,在大多数情况下应避免使用。
-
@MichaelFehr 它没有用。我尝试直接传递字符串,也尝试通过转换为十六进制来尝试。它似乎不起作用。
标签: javascript java encryption aes cryptojs