我有一个API可以调用,使用RSA/ECB/PKCS1 1填充& 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时犯了一个错误。
任何帮助都将不胜感激。
发布于 2019-04-11 11:08:05
首先,让我们看看你为什么要做这个练习。RSA只打算对有限的数据进行编码。因此,我们使用“混合加密”,其中数据使用带有随机密钥的对称密码加密,密钥本身使用RSA加密。
加密工作在二进制数据上,为了安全地传输二进制数据,数据被编码成可打印的形式(十六进制或base64)。
步骤1:我必须生成16位数字的随机数
我们看到的是16位数0-9。这不太安全。如果生成16位数字,您将得到10^16的键,等于2^53 (如果我做错了数学,请评论)。
您需要生成16个随机字节(数字0-256,导致2^128键)。这是您的DEK (数据加密密钥)。
您可以将DEK编码为可打印形式,在十六进制编码中它将包含32个字符。
步骤2:
好了,现在你得到了加密的encoded_encryption_key
步骤3,步骤4
在这里你应该明白你在做什么。
备注:
但是,AES似乎不支持PKCS5Padding,而支持PKCS7Padding。
事实上,AES支持Pkcs7。Pkcs5在功能上是相同的,但定义在64个块上。这个名称在Java中仍然被用作DES加密的遗产。
https://stackoverflow.com/questions/55630138
复制相似问题