过去我实现了自己的 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?
我已经做过的测试:
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