Encryption RSA/ECB/PKCS1填充和;AES/CBC/PKCS5P添加加密/解密

Encryption RSA/ECB/PKCS1填充和;AES/CBC/PKCS5P添加加密/解密,encryption,cryptography,cryptojs,jsencrypt,Encryption,Cryptography,Cryptojs,Jsencrypt,我需要调用一个API,在这里我必须使用RSA/ECB/PKCS1 Padding&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.

我需要调用一个API,在这里我必须使用RSA/ECB/PKCS1 Padding&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加密(步骤4)中使用
PKCS5Padding
,但似乎
AES
不支持
PKCS5Padding
,而是
PKCS7Padding

我想我在将KEY&IV传递给
CryptoJS
的方式上犯了一个错误


任何帮助都将不胜感激。

首先让我们看看你为什么要做这个练习。RSA旨在只对有限数量的数据进行编码。所以我们使用“混合加密”,其中数据使用带有随机密钥的对称密码加密,密钥本身使用RSA加密

加密作用于二进制数据,为了安全传输二进制数据,将数据编码为可打印形式(十六进制或base64)

步骤1:我必须生成一个16位的随机数

我们看到的是16位数字0-9。那真的不安全。生成16位数字时,您将得到一个10^16的键,大约等于2^53(如果我的计算错误,请评论)

您需要生成16个随机字节(数字0-256导致2^128密钥)。这是您的DEK(数据加密密钥)

您可以将DEK编码为可打印形式,十六进制编码将包含32个字符

步骤2:

好的,你现在得到加密的加密密钥

步骤3,步骤4

在这里你应该明白你在做什么

  • 使用DEK(不是二进制形式的编码随机数)加密数据,您将得到加密的数据。您可以将结果编码为已编码的加密数据
  • 连接加密密钥和加密数据。信息技术由您选择是在编码之前还是之后进行编码。我建议您使用一些分隔符连接编码的加密密钥和编码的加密数据,因为如果RSA密钥长度发生变化,编码的加密密钥的长度也会发生变化 确保与客户讨论确切的预期格式
注:

  • 对于AES和CryptoJS,IV需要16字节长,我相信它需要十六进制编码,所以使用btoa可能不是最好的主意。我相信CryptoJS只是将值修剪为16字节,但在形式上它是不正确的。
    • CBC密码需要某种完整性检查,我建议在结果中添加一些HMAC或签名(否则有人可能在您无法检测到篡改的情况下更改密文)
但AES似乎不支持PKCS5Padding,而是支持PKCS7Padding


事实上,AES支持Pkcs7。Pkcs5在功能上相同,但定义在64个块上。该名称在Java中仍然作为DES加密的遗产使用。

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