SNMP V3 CBC-DES:如何使用 8 字节长的加密密钥对 PDU 进行加密? (DES,前 IV)

2023-12-09

过去我已经实现了自己的 v1/v2 SNMP 管理器。现在我还想支持 v3,因此必须实现 PDU 的加密。根据RFC2274 第 8.1.1.1 章16 字节私有密钥的前 8 个字节代表 DES 密钥,私有密钥的后 8 个字节代表 Prev InitVector...执行 PDU 的 CBC-DES 加密所需的两个值。

现在我的问题是:大多数 SNMP v3 管理工具,例如Paessler SNMP 测试仪期望用户在输入时(至少)提供一个 8 字节长的 V3 加密密钥。我认为这个V3加密密钥必须覆盖完整的16字节私有密钥信息,因为不能传递与加密相关的其他信息。这些工具如何在内部从这个短的 8 字节 V3 加密密钥中计算 DES 密钥和 Prev InitVector?

我已经完成的测试:

  • 我使用 8 字节长的 V3 加密密钥作为 DES 密钥,并假设 PrevIV 为 0000 0000
  • 我使用 8 字节长的 V3 加密密钥作为 DES 密钥,也作为 PrevIV

-> 我根据中描述的算法在代码中加密了 PDURFC2274 第 8.1.1.1 章与我用 Wireshark 读出的 Paessler 加密 PDU 相比,结果总是完全不同。 (对于这个测试,我使用了与 Paessler 相同的 PDU 和盐,我通过 Wireshark 在 privParameters 字段中读出了它们)

请不要讨论 CBC-DES 是否安全,谢谢! ;-)


您缺少的部分是关键本地化步骤。您提到的“加密密钥”更准确地称为“共享秘密”(RFC 通常将其称为“密码”)。为了与 SNMP 引擎通信,您必须通过将共享密钥与权威引擎 ID 相结合来生成“本地化密钥”(在两个引擎之间的每次交互中,其中一个是权威的 - 您可以在RFC 3414 第 2.1 节)。关键定位算法描述于RFC 3414 第 2.6 节。解释的不是很清楚,所以我尝试总结一下。

本地化算法的第一步是从密码生成中间密钥。创建长度为 1048576 的缓冲区(2^20)并通过一遍又一遍地重复密码来填充它(如果需要,截断密码的最后一个副本)。然后使用用户的身份验证协议计算缓冲区的哈希值。 (好吧,所以您实际上不必创建该大小的缓冲区,您可以一次对一个块进行哈希处理 - 详细信息取决于哈希算法的实现)。

计算出 Ku 后,计算哈希值Ku + engineID + Ku (where +代表连接)。This生成“本地化”密钥(称为“Kul”——我猜“l”的意思是“本地化”),然后将其截断为 16 字节(如果需要),并拆分为 8 字节 DES 密钥(其中仅实际使用了7个字节),以及8个字节的pre-IV。

附录A.3提供示例密码和引擎 ID,以及具有 HMAC-MD5 和 HMAC-SHA 的预期 Ku 和 Kul。下面是一些在 Python 中执行这些示例输入的关键本地化的代码,使用python-snmp图书馆 (pip install snmp==0.5.0):

from snmp.security.usm.auth import *

secret = b"maplesyrup"
engineID = bytes.fromhex("00 00 00 00 00 00 00 00 00 00 00 02")

Ku = HmacMd5.computeKey(secret)
Kul = HmacMd5.localizeKey(Ku, engineID)
print(f"MD5 Ku:  {Ku.hex()}")
print(f"MD5 Kul: {Kul.hex()}")

Ku = HmacSha.computeKey(secret)
Kul = HmacSha.localizeKey(Ku, engineID)
print(f"SHA Ku:  {Ku.hex()}")
print(f"SHA Kul: {Kul.hex()}")

这给出了每个示例的预期键:

MD5 Ku:  9faf3283884e92834ebc9847d8edd963
MD5 Kul: 526f5eed9fcce26f8964c2930787d82b
SHA Ku:  9fb5cc0381497b3793528939ff788d5d79145211
SHA Kul: 6695febc9288e36282235fc7151f128497b38f3f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SNMP V3 CBC-DES:如何使用 8 字节长的加密密钥对 PDU 进行加密? (DES,前 IV) 的相关文章

  • OpenSSL 和 CryptoJS SHA256 加密转换

    我的问题是 OpenSSL 的新版本与 CryptoJS 的默认设置不兼容 openssl enc 用于基于密码的密钥派生的默认哈希值 1 1 0 中更改为 SHA256 而较低版本中更改为 MD5 https unix stackexch
  • Java如何使用私钥文件而不是PEM来解密?

    使用 Java 和 Bouncy Castle 1 52 我可以使用以下代码通过 PEM 证书加载私钥 我还有一个相同的 PKCS8 格式的 private key 文件 直接使用private key文件而不是PEM的代码是什么 Stri
  • 为我的 AES 方法创建字节数组需要多少个字符?

    我在这里使用 AES 方法 http msdn microsoft com en us library system security cryptography rijndaelmanagement aspx http msdn micro
  • Java 到 ruby​​ AES/ECB/PKCS5Padding 加密

    我有一个使用第三方支付门户的在线电子商务网站 支付门户一直运行良好 直到第三方支付门户要求每个人开始使用带有其他支付参数的哈希密钥 现在的问题是第三方支付门户只提供了一页文档来实现哈希密钥 这是提供的文档 加密演算法 为了减少数据传输和发布
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • 如何混淆整数?

    我需要从 C 中的整数列表生成唯一值的列表 我以为是 MD5 或类似的 但它们生成了太多字节 整数大小为 2 个字节 例如 我想获得单向通信 0 gt ARY812Q3 1 gt S6321Q66 2 gt 13TZ79K2 因此 在证明哈
  • 解密后缺少几个字符

    这是我原来的xml table table
  • 易于使用的Python加密库/包装器?

    我想在Python中用密码加密任意长度的字符串 我会比较喜欢not处理填充 密钥生成和 IV 因为说实话 我对密码学还不太了解 而且我想避免搞砸 我还更喜欢使用众所周知的密码作为 AES 我理想的库 我们称之为 MagicCrypt 会像这
  • 可以混淆/加密 SharedPreferences 文件吗?

    因此 我对混淆应用程序的 SharedPreferences xml 文件很感兴趣 就像 Android LVL 混淆其许可证 cahce 数据一样 这是可以想象的吗 大量的谷歌挖掘几乎没有产生任何可能解决我的问题的结果 我当然不是密码学家
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • Delphi 的免费加密库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Delphi 2010 寻找一个免费且最新的加密库 该库实现 RSA 和 AES Rijnda
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 如何将pgp私钥传输到另一台计算机? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 I read 本文 http www robertsosinski com 2008 02 18 working with pgp and mac o
  • AES 会话密钥的 RSA 解密失败,并显示“AttributeError:‘bytes’对象没有属性‘n’”

    我正在努力在 Python 3 6 上从 PyCryptodome 实现公钥加密 当我尝试创建对称加密密钥并加密 解密变量时 一切正常 但是当我引入 RSA 和 PKCS1 OAEP 的那一刻 一切就都顺理成章了 session key加密
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • IOS 上图像的加密/解密

    我们正在使用加密 解密和 UIIMAGE 如果我们加密和解密 UIIMAge 而不保存到 iphone 画廊中 它工作正常 但如果我们加密 保存到画廊中 将 加密的图像 加载到应用程序中 然后解密它效果不好 我们使用这个函数来加密 解密 保
  • 如何使用 DUKPT 加密在读卡器中生成密文?

    For BDK 0123456789ABCDEFFEDCBA9876543210 KSN FFFF9876543210E00008 生成的密文如下 C25C1D1197D31CAA87285D59A892047426D9182EC11353
  • 在 JavaScript 中生成 RSA 密钥对

    我最近发现了这个 RSA JavaScript 库 http www ohdave com rsa http www ohdave com rsa 但是 它要求预先生成密钥 这是我的问题 问题 我想在 JavaScript 中生成 RSA
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 使用 PBKDF2 和 SHA256 生成 128 位 AES 密钥是否安全?

    我想使用 PBKDF2 和一些加密哈希函数来生成 128 位 AES 密钥 SHA1 也是 128 位 所以我想将其与 PBKDF2 一起使用 但它已损坏 所以我选择使用 SHA256 这是否安全 或者散列大小和生成的密钥大小之间的差异是否

随机推荐