首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RSA/ECB/PKCS1 1填充&AES/CBC/PKCS1 5加密/解密

RSA/ECB/PKCS1 1填充&AES/CBC/PKCS1 5加密/解密
EN

Stack Overflow用户
提问于 2019-04-11 10:18:08
回答 1查看 3K关注 0票数 4

我有一个API可以调用,使用RSA/ECB/PKCS1 1填充& AES/CBC/PKCS5PADDING加密数据。

代码语言:javascript
复制
Sample Data: {"KEY":"VALUE"}

步骤1:

代码语言:javascript
复制
I have to generate a random number of 16 digit. eg: '1234567890123456'

步骤2:

代码语言:javascript
复制
Do RSA/ECB/PKCS1Padding to random number and base64Encode the result. we get "encrypted_key"

步骤3:

代码语言:javascript
复制
Concatenate random number & data:
DATA = 1234567890123456{"KEY":"VALUE"}

第4步:

代码语言:javascript
复制
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时犯了一个错误。

有人能正确地指导我如何使用图书馆吗?

我所做的是:

代码语言:javascript
复制
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时犯了一个错误。

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 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

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

  • 使用DEK加密数据(不是二进制形式的编码随机数),您将得到encrypted_data。可以将结果编码为encoded_encrypted_data
  • 连接加密密钥和加密数据。它。您可以选择在编码之前还是之后对其进行编码。我建议您用一些分隔符连接encoded_encryption_key和encoded_encrypted_data,因为如果RSA长度发生变化,encoded_encryption_key的长度也会发生变化,请确保与客户端讨论所期望的格式。

备注:

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55630138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档