crypto-js来加密文本。它使用简单。
var CryptoJS = require("crypto-js");
// Encrypt
var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123');
// Decrypt
var bytes = CryptoJS.AES.decrypt(ciphertext.toString(), 'secret key 123');
var plaintext = bytes.toString(CryptoJS.enc.Utf8);
console.log(plaintext);
在此示例中, encrypt 函数只接受两个参数messageToEncrypt和salt。其余配置将在其定义范围内。我不是一个javascript人,所以很难找到并理解加密定义。
我想使用java实现相同的AES
加密。对于相同的输入参数,例如messageToEncrypt和salt我应该使用crypto-js库和Java实现获得相同的加密文本。
我通过浏览谷歌上的一些链接尝试了javax.crypto
。
String plainText = "messageToEncrypt";
String key = "mySalt";
SecretKey secKey = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
byte[] x = aesCipher.doFinal(plainText.getBytes());
System.out.println(x);
但这对我不起作用,因为我不知道像keySize和iterationCount这样的确切参数。
我也尝试使用https://github.com/mpetersen/aes-example/blob/master/src/main/java/org/cloudme/sample/aes/AesUtil.java但我又不确定keySize和iterationCount。
如何在java中创建crypto-js AES加密的简单精确实现?
答案 0 :(得分:-1)
经过一番打击和试用后,我开始用Java实现。
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class TestAES {
static String encrypt(String textToEncrypt, String myOwnSalt) throws Exception {
final byte[] pass = textToEncrypt.getBytes(StandardCharsets.UTF_8);
final byte[] salt = (new SecureRandom()).generateSeed(8);
final byte[] inBytes = myOwnSalt.getBytes(StandardCharsets.UTF_8);
final byte[] passAndSalt = array_concat(pass, salt);
byte[] hash = new byte[0];
byte[] keyAndIv = new byte[0];
for (int i = 0; i < 3 && keyAndIv.length < 48; i++) {
final byte[] hashData = array_concat(hash, passAndSalt);
final MessageDigest md = MessageDigest.getInstance("MD5");
hash = md.digest(hashData);
keyAndIv = array_concat(keyAndIv, hash);
}
final byte[] keyValue = Arrays.copyOfRange(keyAndIv, 0, 32);
final byte[] iv = Arrays.copyOfRange(keyAndIv, 32, 48);
final SecretKeySpec key = new SecretKeySpec(keyValue, "AES");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
byte[] data = cipher.doFinal(inBytes);
data = array_concat(array_concat("Salted__".getBytes(StandardCharsets.UTF_8), salt), data);
return Base64.getEncoder().encodeToString( data );
}
private static byte[] array_concat(final byte[] a, final byte[] b) {
final byte[] c = new byte[a.length + b.length];
System.arraycopy(a, 0, c, 0, a.length);
System.arraycopy(b, 0, c, a.length, b.length);
return c;
}
public static void main(String[] args) throws Exception {
String s = encrypt("myPassword", "2ErFG");
System.out.println(s);
}
}