我正在尝试使用Javascript和CryptoJS复制Java应用程序中使用的加密。我不太确定应该如何复制SecretKeySpec,因为CryptoJS似乎需要一个字符串作为密钥。
下面是我需要在JS中复制的Java加密代码:
public byte[] encrypt(byte[] origin)
{
String key = "testkey";
SecretKeySpec sks = new SecretKeySpec(convertAESKey(key), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[16];
cipher.init(Cipher.ENCRYPT_MODE, sks, new IvParameterSpec(iv));
return cipher.doFinal(origin);
}
private byte[] convertAESKey(String key)
{
byte[] keyBytes;
keyBytes = key.getBytes("UTF-8");
byte[] keyBytes16 = new byte[16];
System.arraycopy(keyBytes, 0, keyBytes16, 0,
Math.min(keyBytes.length, 16));
return keyBytes16;
}
}
到目前为止,我的JS代码:
var iv = new Uint8Array(16);
var key = "testkey";
var encrypted = CryptoJS.AES.encrypt(
someByteArray,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC
}
);
此外,密码的最终输出是一个加密的字节数组。CryptoJS的最终输出似乎是一个带有密文的对象。有没有办法以字节数组的形式获取输出?
我现在唯一能想到的就是将加密响应转换为字符串,然后将其转换为字节数组,但这似乎与Java加密的输出不匹配。
默认情况下,CryptoJS不处理Uint8Array
,所以我不打算使用它,而是使用默认的WordArray
来表示二进制数据。
var iv = CryptoJS.lib.WordArray.create([0, 0, 0, 0]);
var key = "testkey";
key = CryptoJS.enc.Utf8.parse(key);
for (var i = key.words.length; i < 4; i++) {
key.words[i] = 0;
}
key.sigBytes = 16;
key.clamp();
var encrypted = CryptoJS.AES.encrypt(
someByteArray,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC
}
);
console.log(encrypted.ciphertext.toString(CryptoJS.enc.Hex));
这将产生一个十六进制字符串,可以很容易地与Java生成的密文进行比较。
此代码不太安全:
>
IV必须是不可预测的(读:随机)。不要使用静态IV,因为这使得密码具有确定性,因此在语义上不安全。观察密文的攻击者可以确定以前何时发送了相同的消息前缀。IV不是秘密的,所以您可以将它与密文一起发送。通常,它只是简单地添加到密文中,并在解密前被切片。
钥匙必须是随机的(读:看起来像随机噪音)。文本看起来不是随机的,如果(错误地)使用密码作为密钥,会严重降低安全性。如果你有一个密码,那么你需要使用像PBKDF2、bcrypt、scrypt或Argon2这样的具有高迭代计数/成本系数的东西从中派生一个密钥。
为了检测(恶意)操纵,您应该对密文进行身份验证。如果不这样做,则可能会受到oracle攻击的攻击。身份验证可以通过GCM或EAX等经过身份验证的操作模式来完成,也可以通过HMAC-SHA256等具有强MAC的加密后MAC方案来完成。
我在基本加密/解密方面遇到了麻烦。我到处找了一个可行的例子,但还没有找到一个可行的例子。 -我将使用php加密,使用cryptojs解密,以获得一个小的安全层
我正在尝试使用CryptoJS在JavaScript中进行加密,在C#中进行解密。花了很多时间试图让两种技术返回相同的输出。但是,输出是不同的--CryptoJS产生的加密字符串不同于C#产生的加密字符串。我做错了什么?谢谢你的帮助。
加密方法 JavaScript
本文向大家介绍angular使用md5,CryptoJS des加密的方法,包括了angular使用md5,CryptoJS des加密的方法的使用技巧和注意事项,需要的朋友参考一下 在业务系统中,通常需要对用户的密码进行加密,再时行http的请求。加强系统登录的安全验证。 常用的加密方式有MD5, Base64, CryptoJS的 AES DES等。下面介绍我常用的几种加密方法的使用: MD5
我有一个问题解密文本,它是在Go lang加密,使用CryptoJS。 下面是Go代码:https://play.golang.org/p/xcbl48t_in 这里是JS代码:http://jsfidle.net/ltkxm64n/ 这两种方法都能很好地加密和解密,但是当我将base64密文从GO复制到JS(或者反过来)时,它就不起作用了。我还注意到js输出的第一部分与Go输出相同,但在js输出
在用于aes加密和解密的python脚本中 但是相同的iv、消息和密钥在python和js中产生不同的加密消息, JavaScript与python解密兼容的问题是什么? 两者都使用了aes.mode_cbc,并且假设两者都使用了Pkcs7填充。硬编码iv现在是随机生成的