我有一个API可以调用,我必须使用RSA / ECB / PKCS1填充和AES / CBC / PKCS5PADDING对数据进行加密。
Sample Data: {"KEY":"VALUE"}
步骤1:
I have to generate a random number of 16 digit. eg: '1234567890123456'
步骤2:
Do RSA/ECB/PKCS1Padding to random number and base64Encode the result. we get "encrypted_key"
步骤3:
Concatenate random number & data:
DATA = 1234567890123456{"KEY":"VALUE"}
步骤4:
Do AES/CBC/PKCS5Padding on DATA (from Step 3) using random number(1234567890123456) as KEY & Base64Encoded random number as IV. we get "ENCRYPTED_DATA"
因此,对于步骤1 ,我正在使用JSEncrypt
JavaScript库。
对于第4步,我正在使用CrytoJS.AES.encrypt()
函数。我很确定我的JSEncrypt函数可以正常运行,因为客户端可以解密它,但是客户端不能解密我的数据。我觉得使用CryptoJS
时出错了。
有人可以正确地指导我如何使用该库。
我正在做的是:
KEY = '1234567890123456'
IV = MTIzNDU2Nzg5MDEyMzQ1Ng== (result of btoa('1234567890123456') )
DATA = "1234567890123456{"KEY":"VAL"}"
cryptedData = Crypto.AES.encrypt(DATA, KEY, {iv: IV, mode: CryptoJS.mode.CBC,padding:CryptoJS.pad.Pkcs7})
有人告诉我在AES / CBC加密中使用PKCS5Padding
(第4步),但是似乎AES
不支持PKCS5Padding
而是PKCS7Padding
。
我认为我在将KEY和IV传递给CryptoJS
的方式上犯了一个错误。
任何帮助将不胜感激。
答案 0 :(得分:1)
首先,让我们看看您为什么要进行锻炼。 RSA仅用于编码有限的数据。因此我们使用“混合加密”,即使用带有随机密钥的对称密码对数据进行加密,并使用RSA加密密钥本身。
对二进制数据进行加密,以安全地传输二进制数据,并将数据编码为可打印形式(十六进制或base64)
步骤1:我必须生成一个16位随机数
我们看到的是16位数字0-9。那不是很安全。生成16位数字,您将获得10 ^ 16的密钥,大约等于2 ^ 53(如果我的数学运算有误,请发表评论)。
您需要生成16个随机字节(0-256位数字,产生2 ^ 128个密钥)。那就是您的DEK(数据加密密钥)。
您可以将DEK编码为可打印形式,以十六进制编码将包含32个字符。
步骤2:
好的,您现在得到加密的encode_encryption_key
第3步,第4步
在这里,您应该了解自己在做什么。
注意:
但似乎AES不支持PKCS5Padding,但支持PKCS7Padding。
独立AES支持Pkcs7。 Pkcs5在功能上相同,但在64个块上定义。在Java中,该名称仍被用作DES加密的遗产。