TypeError: Cannot read property '0' of undefined CryptoJS
TypeError: Cannot read property '0' of undefined CryptoJS
我在我的 angular 应用程序中使用 CryptoJS 来实现 AES 加密,但是当我尝试在 IV
中发送空的 16 字节数组时,我不断收到 TypeError: Cannot read property '0' of undefined
错误
这是我的打字稿代码:
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();
}
但同样的事情在 .NET 中工作正常,android,ios 当我在 IV
中发送空的 16 字节数组时
.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 平台上的其他应用程序互连,具有相同的加密设置,但我正在我的 angular 应用程序出错,我该如何解决这个问题?
在 JavaScript 代码中,IV 必须作为 WordArray
传递。由于在 C# 代码中使用了 0
-IV,因此在 JavaScript 代码中也必须这样做。相应的 WordArray
可以是
var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
请注意,使用 Hex encoder 以便 16 个字节 0
-IV 对应于 32 个 0
-值。
另请注意,通常 0
-IV 应仅用于测试目的。实际上,出于安全原因,必须为每次加密生成一个随机 IV。此外,密钥/IV 对只能使用一次。
此外 CryptoJS 不知道参数 keySize
并忽略它。使用的 AES 变体由密钥大小决定,例如对于 32 字节的密钥,应用 AES-256,here.
我遇到了同样的问题。
包括 iv 选项解决了它。
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f"); var ciphertext = CryptoJS.AES.encrypt("msg", CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f"),{ iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.AnsiX923 });
对于那些在加密字符串的打字稿中遇到类似错误的人,您只需要这样导入包
import * as Crypto from 'crypto-js';
我在我的 angular 应用程序中使用 CryptoJS 来实现 AES 加密,但是当我尝试在 IV
中发送空的 16 字节数组时,我不断收到TypeError: Cannot read property '0' of undefined
错误
这是我的打字稿代码:
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();
}
但同样的事情在 .NET 中工作正常,android,ios 当我在 IV
中发送空的 16 字节数组时.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 平台上的其他应用程序互连,具有相同的加密设置,但我正在我的 angular 应用程序出错,我该如何解决这个问题?
在 JavaScript 代码中,IV 必须作为 WordArray
传递。由于在 C# 代码中使用了 0
-IV,因此在 JavaScript 代码中也必须这样做。相应的 WordArray
可以是
var iv = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
请注意,使用 Hex encoder 以便 16 个字节 0
-IV 对应于 32 个 0
-值。
另请注意,通常 0
-IV 应仅用于测试目的。实际上,出于安全原因,必须为每次加密生成一个随机 IV。此外,密钥/IV 对只能使用一次。
此外 CryptoJS 不知道参数 keySize
并忽略它。使用的 AES 变体由密钥大小决定,例如对于 32 字节的密钥,应用 AES-256,here.
我遇到了同样的问题。 包括 iv 选项解决了它。
var iv = CryptoJS.enc.Hex.parse("101112131415161718191a1b1c1d1e1f"); var ciphertext = CryptoJS.AES.encrypt("msg", CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f"),{ iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.AnsiX923 });
对于那些在加密字符串的打字稿中遇到类似错误的人,您只需要这样导入包
import * as Crypto from 'crypto-js';