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

问题描述 投票:0回答:1

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

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

我已经做过的测试:

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

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

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

encryption snmp des
1个回答
0
投票
您缺少的部分是关键本地化步骤。您提到的“加密密钥”更准确地称为“共享秘密”。为了与 SNMP 引擎通信,您必须通过将共享机密与权威引擎 ID 组合来生成“本地化密钥”(在两个引擎之间的每次交互中,其中一个是权威的——您可以在

RFC 3414 第 2.1 节).

密钥本地化算法使用用户的身份验证协议生成密钥和 engineID 的摘要(以特定方式组合),然后将其截断为 16 个字节,这就是您同时用作 DES 密钥和预IV。

2.6部分描述了密钥定位算法,附录A.3中有示例。

以下是附录 A.2 中的 Python 示例,使用了

python-snmp

 库 (
pip install snmp
):

from snmp.security.usm.auth import * secret = b"maplesyrup" engineID = bytes.fromhex("00 00 00 00 00 00 00 00 00 00 00 02") key = HmacMd5.localize(secret, engineID) print(key.hex()) key = HmacSha.localize(secret, engineID) print(key.hex())
这给出了每个示例的预期最终输出:

526f5eed9fcce26f8964c2930787d82b 6695febc9288e36282235fc7151f128497b38f3f
    
© www.soinside.com 2019 - 2024. All rights reserved.