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

时间:2019-04-11 10:18:09

标签: encryption cryptography cryptojs jsencrypt

我有一个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的方式上犯了一个错误。

任何帮助将不胜感激。

1 个答案:

答案 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步

在这里,您应该了解自己在做什么。

  • 使用DEK(不是二进制形式的已编码随机数)对DATA进行加密,您将获得cryptod_data。您可以将结果编码为encode_encrypted_data
  • 连接加密密钥和加密数据。它。由您决定是在编码之前还是之后进行编码。我建议您使用一些分隔符将 encoded_encryption_key encoded_encrypted_data 串联起来,因为如果RSA密钥长度发生变化,那么encode_encryption_key的长度也会发生变化 确保与客户讨论确切期望的格式。

注意:

  • 对于AES和CryptoJS,IV必须为16个字节长,我相信它必须进行十六进制编码,因此使用btoa可能不是最好的主意。我相信CryptoJS只会将值修整为16个字节,但是从形式上来说这是不正确的。
    • CBC密码需要某种完整性检查,我建议在结果中添加一些HMAC或签名(否则,某些人可能会更改密文而无法检测到篡改)
  

但似乎AES不支持PKCS5Padding,但支持PKCS7Padding。

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