Encryption RSA/ECB/PKCS1填充和;AES/CBC/PKCS5P添加加密/解密
我需要调用一个API,在这里我必须使用RSA/ECB/PKCS1 Padding&AES/CBC/PKCS5PADDING对数据进行加密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.
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支持Pkcs7。Pkcs5在功能上相同,但定义在64个块上。该名称在Java中仍然作为DES加密的遗产使用。非常感谢您的详细解释!我很感激!