gpt4 book ai didi

javascript - 使用 Crypto JS 在 Java 中加密和在 JavaScript 中解密不起作用

转载 作者:行者123 更新时间:2023-12-02 13:14:10 29 4
gpt4 key购买 nike

我是Java和JS方面的新手,并尝试在java中加密密码,这应该由我现有的JS代码解密。 (不想改变我的 JS!)

我认为这与KEY和IV有关,我完全不知道。

** JAVA 程序 **

public class Helper {

public Cipher dcipher, ecipher;

// Responsible for setting, initializing this object's encrypter and
// decrypter Chipher instances
public Helper(String passPhrase) {

// 8-bytes Salt
byte[] salt = {(byte) 0xA9, (byte) 0x9B, (byte) 0xC8, (byte) 0x32, (byte) 0x56, (byte) 0x34, (byte) 0xE3, (byte) 0x03};

// Iteration count
int iterationCount = 19;

try {
// Generate a temporary key. In practice, you would save this key
// Encrypting with DES Using a Pass Phrase
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount);
SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);

ecipher = Cipher.getInstance(key.getAlgorithm());

// Prepare the parameters to the cipthers
AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

} catch (InvalidAlgorithmParameterException e) {
System.out.println("EXCEPTION: InvalidAlgorithmParameterException");
} catch (InvalidKeySpecException e) {
System.out.println("EXCEPTION: InvalidKeySpecException");
} catch (NoSuchPaddingException e) {
System.out.println("EXCEPTION: NoSuchPaddingException");
} catch (NoSuchAlgorithmException e) {
System.out.println("EXCEPTION: NoSuchAlgorithmException");
} catch (InvalidKeyException e) {
System.out.println("EXCEPTION: InvalidKeyException");
}
}

// Encrpt Password
@SuppressWarnings("unused")
public String encrypt(String str) {
try {
// Encode the string into bytes using utf-8
byte[] utf8 = str.getBytes("UTF8");
System.out.println("\n UTF8 : " + utf8);
// Encrypt
byte[] enc = ecipher.doFinal(utf8);
System.out.println("\n enc: " + enc);
// Encode bytes to base64 to get a string
return new sun.misc.BASE64Encoder().encode(enc);

} catch (BadPaddingException e) {
} catch (IllegalBlockSizeException e) {
} catch (UnsupportedEncodingException e) {
}
return null;
}


public static void main(String[] args) {
try {

Helper encrypter = new Helper("");

System.out.print("Enter a password : ");
String password = input.nextLine();

String encrypted = encrypter.encrypt(password);
System.out.println("encrypted String:" + encrypted);
} catch (Exception e) {
}

}

}

上面的程序应该加密 key - 将通过以下 JS 解密:

var encryptedpassword=this.bodyParams.password;

var bytes = CryptoJS.AES.decrypt(encryptedpassword.toString(), accKey);
var newpassword = bytes.toString(CryptoJS.enc.Utf8);

WHERE accKey = "Nqnzu3RhCJ1h8ql5fdKOaKUAbsuURze*********_

最佳答案

您的问题是您使用 DES 加密并使用 AES 解密。

此外,您还可以根据 Java 代码上的密码生成 key ,但直接在 JavaScript 代码上使用它。

您在 Java 端使用了 salt,但似乎没有在消息中包含 salt。有了盐+密码,您就可以恢复 key 和iv。

您将需要寻找另一组在两端使用 AES 的示例,它们以相同的方式生成 key ,并使用相同的填充。

类似的事情:

// Generate a temporary key. In practice, you would save this key
// Encrypting with AES Using a Pass Phrase
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), saltBytes, 100, 128);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
SecretKey aesKey = keyFactory.generateSecret(keySpec);
ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

// Prepare the parameters to the cipthers
IvParameterSpec ivParameterSpec = new IvParameterSpec(aesKey.getEncoded());
ecipher.init(Cipher.ENCRYPT_MODE, aesKey, ivParameterSpec);

正如评论中提到的,您还需要考虑使用 TLS 进行通信,因为在 JS 端保护对称加密 key /密码相当困难。

关于javascript - 使用 Crypto JS 在 Java 中加密和在 JavaScript 中解密不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43839593/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com