gpt4 book ai didi

encryption - RSA/ECB/PKCS1 填充 & AES/CBC/PKCS5Padding 加密/解密

转载 作者:行者123 更新时间:2023-12-03 19:30:08 26 4
gpt4 key购买 nike

我有一个 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"}

第四步:
Do AES/CBC/PKCS5Padding on DATA (from Step 3) using random number(1234567890123456) as KEY & Base64Encoded random number as IV. we get "ENCRYPTED_DATA"

因此,对于 Step 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 旨在仅对有限的数据进行编码。所以我们使用“混合加密”,其中数据使用带有随 secret 钥的对称密码加密, key 本身使用 RSA 加密

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

Step.1: I have to generate a random number of 16 digit



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

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

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

Step.2:



好的,你现在得到了加密的 encode_encryption_key

Step 3, Step 4



在这里你应该明白你在做什么。
  • 使用 DEK 加密数据(不是以二进制形式编码的随机数),您将获得 encrypted_data。您可以将结果编码为encoded_encrypted_data
  • 连接加密 key 和加密数据。它。由您决定是在编码之前还是在编码之后进行编码。我建议你用一些分隔符连接 encoding_encryption_key 和 encoding_encrypted_data,因为如果 RSA key 长度改变,encoded_encryption_key 的长度也会改变
    确保与客户讨论确切预期的格式。

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

  • but it seems that AES does not support PKCS5Padding but PKCS7Padding.



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

    关于encryption - RSA/ECB/PKCS1 填充 & AES/CBC/PKCS5Padding 加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55630138/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com