当前位置: 首页 > 知识库问答 >
问题:

使用带有 PKCS7 填充的三重数据加密标准 (3DES) 加密字符串

松兴邦
2023-03-14

要求:

我有一个Ruby on rails应用程序,我需要执行以下操作。

以下字符串应使用3DES算法和工作密钥加密。ABJGTU9的加密值将是vV51P0OGXt0=

工作密钥为 A5157A0D77B24AEA868AD73288366826

以下文献中提到的3DES算法使用以下步骤进行数据加密: i.使用CBC密码模式和PKCS7填充的密钥的左侧部分加密数据。ii.使用CBC密码模式和无填充的密钥的右侧部分解密数据。iii.使用CBC密码模式和无填充的密钥的左侧部分加密数据。

我尝试了以下文章这就是我所做的,我的输出是"hsYUuA/Mo6A=\n"预期是vV51P0OGXt0=

  cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC')
  cipher.encrypt # Must be called before anything else

  # Generate the key and initialization vector for the algorithm.
  # Alternatively, you can specify the initialization vector and cipher key
  # specifically using `cipher.iv = 'some iv'` and `cipher.key = 'some key'`
  # cipher.pkcs5_keyivgen('SOME_PASS_PHRASE_GOES_HERE')

  key = Digest::MD5.base64digest('A5157A0D77B24AEA')
  cipher.key = key
  data = "ABJGTU9"
  output = cipher.update(data)
  output << cipher.final
  output
end

我不确定我是否走对了路。

共有1个答案

海保臣
2023-03-14

问题中提到的计划有许多错误之处:

    < li >该密钥是两个密钥的三重DES密钥,您需要对其进行十六进制解码,而不是对其执行MD5 < li >如果您的代码不能使用所示的128位DES密钥,您应该复制前8个字节并将它们附加到密钥的末尾(因此DES密钥1和DES密钥3是相同的)-但是OpenSSL应该可以很好地使用16字节的密钥; < li >步骤I、ii和iii中描述的加密方法仅适用于需要加密的每个单独的块-如果您已经使用cipher < code > ' DES-ede 3-CBC ' ,则不需要它。

默认情况下,OpenSSL 已经使用 PKCS#7 填充进行填充,因此没有理由为此做任何特别的事情。

CBC需要一个唯一的、不可预测的IV,用于具有相同密钥的每个加密操作,这似乎在所描述的方案中缺失。

 类似资料:
  • 问题内容: 我正在尝试使用128位AES加密(ECB)加密/解密字符串。我想知道的是如何向其中添加/删除PKCS7填充。看起来Mcrypt扩展可以处理加密/解密,但是必须手动添加/删除填充。 有任何想法吗? 问题答案: 让我们来看看。RFC 5652(加密消息语法)中描述了PKCS#7。 填充方案本身在第6.3节中给出。内容加密过程。它的本质是说:根据需要追加许多字节以填充给定的块大小(但至少一个

  • 我对我当前尝试访问的API的加密有以下要求: < li>PKCS7填充方法 < li>CBC加密模式 < li>AES密钥大小256,块大小128 每次我提交带有加密的API时,API似乎都有问题(不幸的是没有产生错误)。 问题: PKCS7填充方法到底是什么,可以用php实现? AES 256很好,但是块大小到底是什么意思? IV到底是做什么的?

  • 我一直在到处寻找一些示例代码,介绍如何使用Bouncy Castle框架用标题中的加密加密一个简单的字符串。 此代码将在Windows Universal项目上运行。我以前尝试使用内置API进行加密,但在服务器上解密失败。 服务器使用 但失败的原因是: 填充无效,无法删除。 初始化向量的长度必须与块大小相同 服务器上的长度为128。我怎么能强迫它是等长的?

  • 问题内容: 我有一个应用程序,该应用程序必须发送先由MD5然后由3DES加密的登录凭据。 我设法使用CryptoSwift通过MD5加密字符串。但是我找不到任何可以在Swift上通过3DES加密的东西。 我已经尝试过CommonCrypto。据我所知,这是用C语言编写的,但可以通过桥接头导入到目标C语言中。 我发现了一些文章和教程,它们告诉我如何通过桥接标头(警告它不适用于框架)或Model.ma

  • 这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案。 我想加密128位,应该适合一个加密块。 所以我调用,然后呢? 我是否调用(加密 128 位块)和(即使没有更多要加密的内容)? 还是只有?还是只有?