You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#生成PPK v3文件:HMAC-SHA-256的Private-Mac计算错误排查

PPK v3 基于HMAC-SHA256的Private-Mac正确计算方法

核心密钥派生逻辑(空密码场景)

PPK v3的MAC密钥不是直接取空字符串的SHA256哈希,必须严格遵循Putty的PBKDF2派生规则:

  • 盐值为固定ASCII字符串:putty-private-key-file-mac-key(无末尾换行)
  • 使用PBKDF2算法,参数配置:
    • 输入密码:空字节序列(即长度为0的字节数组)
    • 盐:上述固定字符串的UTF-8字节
    • 迭代次数:1000次
    • 输出密钥长度:32字节(SHA256标准密钥长度)
    • 底层哈希函数:SHA256

Private-Mac的计算范围

必须对PPK文件中从Private-Lines字段起始,到Private-MAC字段之前的所有字节计算HMAC:

  • 包含Private-Lines:字段名、后续的换行符(注意Putty使用\r\n作为换行)
  • 包含所有私钥行的内容及每行末尾的\r\n
  • 不包含Private-MAC:字段本身及后续内容

最终计算步骤

  1. 按上述规则生成32字节的HMAC密钥
  2. 提取目标范围的原始字节流(严格匹配文件中的换行格式)
  3. 用SHA256作为哈希算法,计算该字节流的HMAC值
  4. 将HMAC的二进制结果做Base64编码,得到的字符串就是Private-MAC字段的值

常见错误点排查

  • 跳过PBKDF2直接用空串SHA256当密钥:这是v1/v2的逻辑,v3强制要求PBKDF2派生
  • 计算范围错误:比如漏掉Private-Lines:字段名或换行符,或者误包含了Private-MAC字段
  • 换行符格式不匹配:代码中用\n但Putty生成的文件用\r\n,导致字节流不一致
  • Base64编码前额外处理哈希值:必须直接对HMAC的二进制结果编码,不要做hex转换或其他修改

内容的提问来源于stack exchange,提问作者Ana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:27:05