加密:
private static String secretKey = "boooooooooom!!!!";
private static String salt = "ssshhhhhhhhhhh!!!!";
public static String encrypt(String strToEncrypt, String secret)
{
try
{
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
return Base64.getEncoder().encodeToString(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
解密:
private static String secretKey = "boooooooooom!!!!";
private static String salt = "ssshhhhhhhhhhh!!!!";
public static String decrypt(String strToDecrypt, String secret) {
try
{
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
IvParameterSpec ivspec = new IvParameterSpec(iv);
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(secretKey.toCharArray(), salt.getBytes(), 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKeySpec secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
return new String(cipher.doFinal(Base64.getDecoder().decode(strToDecrypt)));
}
catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
我对此进行了很多搜索。我在堆栈溢出时遇到了这些问题
Difference in key lengths between crypto.pbkdf2 (node.js) and PBEKeySpec,AES/CBC/PKCS5PADDING IV - Decryption in NodeJs (Encrypted in Java),我都尝试过,但都没有一个解决我的查询。
到目前为止,我尝试过的是
function encrypt(plainText, secretKey,randomeString) {
const key = crypto.pbkdf2Sync(secretKey, salt, 65536, 16, digest);
const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(plainText, 'utf8', 'base64')
encrypted += cipher.final('base64');
return encrypted;
};
function decrypt(strToDecrypt, secretKey, randomeString) {
const key = crypto.pbkdf2Sync(secretKey, salt, 65536, 16, digest);
const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(strToDecrypt, 'base64');
decrypted += decipher.final();
return decrypted;
}
答案 0 :(得分:1)
此Node.js代码应产生与Java代码相同的结果。我还使secretKey变量成为加密/解密功能的参数。
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const salt = "ssshhhhhhhhhhh!!!!";
const digest = 'sha256';
function encrypt(plainText, secretKey) {
const key = crypto.pbkdf2Sync(secretKey, salt, 65536, 32, digest);
const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(plainText, 'utf8', 'base64')
encrypted += cipher.final('base64');
return encrypted;
};
function decrypt(strToDecrypt, secretKey) {
const key = crypto.pbkdf2Sync(secretKey, salt, 65536, 32, digest);
const iv = Buffer.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]);
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(strToDecrypt, 'base64');
decrypted += decipher.final();
return decrypted;
}
const key = "boooooooooom!!!!";
const cipherText = encrypt("test", key);
console.log("Ciphertext:", cipherText);
const plainText = decrypt(cipherText, key);
console.log("Plaintext:", plainText);