我在我的角度应用程序中使用CryptoJS来实现AES加密,但是TypeError: Cannot read property '0' of undefined
当我尝试在IV中发送空的16字节数组时,我一直收到错误消息
这是我的打字稿代码:
aesEncrypt(keys: string, value: string) { // encrypt api request parameter with aes secretkey
var key = CryptoJS.enc.Utf8.parse(keys);
//var iv = CryptoJS.enc.Utf8.parse(keys);
var iv = new Uint16Array(16);
var encrypted = CryptoJS.AES.encrypt(JSON.stringify(value), key,
{
//keySize: 256,
keySize: 128,
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
return encrypted.toString();
}
但是当我在IV中发送空的16字节数组时,同样的东西在.NET,Android,iOS中也能正常工作
.NET代码:
private static AesCryptoServiceProvider AesCryptoServiceProvider(string key)
{
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.KeySize = 128;
aes.BlockSize = 128;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
aes.Key = Encoding.UTF8.GetBytes(key);
//aes.IV = Encoding.UTF8.GetBytes(key);
aes.IV = new byte[16];
return aes;
}
android代码:
public static String encryptURLEncoding(byte[] key, String encryption) throws GeneralSecurityException
{
if (key.length != 16)
{
throw new IllegalArgumentException("Invalid key size.");
}
// Setup AES tool.
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16]));
byte[] dstBuff = cipher.doFinal(encryption.getBytes());
String encryptedStringData = android.util.Base64.encodeToString(dstBuff, android.util.Base64.DEFAULT);
return encryptedStringData;
}
我想通过提供空的16字节数组来实现AES加密解密,因为此应用与我的其他应用(在具有相同加密设置的android,ios平台上)相互连接,但是我的角度应用出现错误,如何解决此问题?
在JavaScript代码中,IV必须以形式传递WordArray
。由于0
C#代码中使用了-IV,因此还必须在JavaScript代码中完成。对应的WordArray
可能是例如
var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
注意,使用十六进制编码器,以便16个字节0
-IV对应于32个值0
。
还应注意,通常0
-IV仅应用于测试目的。实际上,出于安全原因,必须为每个加密生成随机IV。此外,密钥/ IV对只能使用一次。
此外,CryptoJS不知道该参数keySize
,而是将其忽略。所使用的AES变体由密钥大小决定,例如,对于32字节密钥,此处使用AES-256 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句