RSA/ECB/PKCS1填充和AES/CBC/PKCS5Padding加密/解密

4

我有一个API需要调用,其中需要使用RSA/ECB/PKCS1填充及AES/CBC/PKCS5PADDING进行数据加密。

Sample Data: {"KEY":"VALUE"}

Step.1:

I have to generate a random number of 16 digit. eg: '1234567890123456'

Step.2:

Do RSA/ECB/PKCS1Padding to random number and base64Encode the result. we get "encrypted_key"

Step.3:

Concatenate random number & data:
DATA = 1234567890123456{"KEY":"VALUE"}

Step.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"

因此,在第一步中,我使用了JSEncrypt JavaScript库。 在第四步中,我使用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,但似乎AES不支持PKCS5Padding,而是支持PKCS7Padding

我想我在将KEY和IV传递给CryptoJS的方式上犯了错误。

非常感谢任何帮助。

1个回答

2
开始让我们看看你为什么要做这个练习。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
在这里,您应该理解自己在做什么。
加密数据使用DEK(而不是二进制形式的编码随机数),您将获得encrypted_data。您可以对结果进行编码以获得encoded_encrypted_data。
连接加密密钥和加密数据。由您选择在编码之前还是之后对其进行编码。我建议您使用一些分隔符将encoded_encryption_key和encoded_encrypted_data连接起来,因为如果RSA密钥长度更改,则encoded_encryption_key的长度也会更改。确保与客户讨论预期格式的具体内容。
注意:
AES需要16个字节的IV,而CryptoJS需要将其编码为十六进制,因此使用btoa可能不是最好的选择。我认为CryptoJS只是将值修剪为16个字节,但正式上讲这不是正确的。
CBC密码需要某种完整性检查,我建议在结果中添加一些HMAC或签名(否则,有人可以更改密文,而您无法检测到篡改)。
但似乎AES不支持PKCS5Padding而是PKCS7Padding。
实际上,AES支持Pkcs7。 Pkcs5在功能上相同,但在64个块上定义。该指定仍然在Java中使用作为DES加密的遗产。

非常感谢您详细的解释!我很感激! - Rakesh Nagarkoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接