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) 的相关文章

  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • 是否曾经建议使用 ECB 密码模式?

    判断从这篇关于密码模式的维基百科文章 http en wikipedia org wiki Block cipher modes of operation以及我听说过的有关 ECB 的其他事情 这是一个很大的禁忌 并且可能会泄露有关您的加密
  • 字母表中的加密和解密 - Python GCSE

    我目前正在尝试为学校编写一个程序 以便加密和解密输入的消息 我需要加密或解密的消息仅在字母表中 没有其他符号或密钥 例如 使用消息车加密输入的偏移量为 5 我希望它输出 afs 有人可以帮忙吗 这是我目前的代码 def find offse
  • 如何向数据添加填充以使其可以接受 pycrypto 库中的 AES256 加密算法

    有人可以告诉我如何向数据添加填充 使其可以接受 pycrypto 库 Python 中的 AES256 加密算法 提前非常感谢 看着文档 http www dlitz net software pycrypto doc 看来要由图书馆用户自
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 如果用户可以解密 web.config,那么加密它有什么意义呢?

    哎呀 一些供应商告诉我的老板 不加密 web config 是一个很大的安全漏洞 这对我来说听起来像是废话 我的意思是 如果有人破坏了服务器 我们不是就完蛋了吗 就像 Joelt 所建议的那样 ASP NET 最近出现了一个安全问题 允许人
  • 使用 CommonCrypto 的 Swift AES 加密

    我正在开发一个 iOS 应用程序代码7 1 with 斯威夫特2 1我正在尝试进行简单的加密AES 128 位 and PKCS7填充使用通用加密库 该代码有效 但每次我尝试投射NSData反对NSString然后对于 String 我得到
  • 用java解密AES加密文件

    我有一个使用 AES 使用 java 应用程序加密的文件 我还有一个加密的密钥文件 但我不明白如何使用密钥来解密文件 大多数教程和示例都会在一个地方创建临时随机密钥 加密文件和解密 所以 问题是如何指定解密时必须使用的密钥 EDIT 我发现
  • 使用 Java 进行 AES 加密并使用 Javascript 进行解密

    我正在制作一个需要基于 Java 的 AES 加密和基于 JavaScript 的解密的应用程序 我使用以下代码作为基本形式进行加密 public class AESencrp private static final String ALG
  • MVC中如何对数据进行加密和解密?

    In my MVC应用我想要encrypt and decrypt数据从视图到控制器的数据传输 如何执行此操作MVC 4 using Razor 您不需要加密从控制器到视图的数据 因为视图渲染发生在控制器正在操作的同一台计算机中 如果您想加
  • 使用 .NET 加密和解密数字

    NET 使用 C 有哪些可用的加密技术 我有一个数值 我想将其加密为字符串表示形式 哪一款支持解密 加密 由 NET 框架 BCL 提供 而不是 C 语言提供 通常对字节进行加密 但那很好 数字很 容易表示为字节 并且输出字节可以通过以下方
  • 什么是监控网络活动的好工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我经营的是小区 现在我正在寻找一个在服务器 Windows 或 Linux 上运行的监控工具 它可以跟踪
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • JSEncrypt 在后端解密(Bash)

    看起来 JSEncrypt 在 RSA 加密字符串中添加了一些随机填充 因此我无法使用 OpenSSL 对其进行解密 我的 JS 代码如下所示 const rsaEncrypt new window JSEncrypt rsaEncrypt
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 密文窃取算法 - 哪一种是正确的?

    网络上提出了两种算法 在这两种算法中 第一部分是相同的 1 Pad the last partial plaintext block with 0 2 Encrypt the whole padded plaintext using the
  • PyCrypto:仅使用文件中的公钥解密(无私钥+公钥)

    大家好 我正在尝试使用 RSA 公钥和私钥以及加密 解密PyCrypto我遇到了一个对我来说似乎有点奇怪的问题 它现在的工作方式可能很有意义 但我对 RSA 非对称加密了解不多 这就是它让我困惑的原因 这是我遇到的无法解密只有公钥的东西 事
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 生成签名和加密的 JWT

    我正在尝试使用生成签名和加密的 JWT 令牌雨云智威汤逊 http connect2id com products nimbus jose jwt private void generateToken throws JOSEExceptio

随机推荐