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

使用Go解密AES-256-CFB文件失败,OpenSSL可正常解密求排查

AES-256-CFB解密:Go代码与OpenSSL命令的差异问题

你用OpenSSL命令能正常解密,但Go代码解密失败,核心问题是你的代码没有遵循OpenSSL enc命令的加密格式和密钥派生规则,具体错误点和修正方案如下:

你的代码存在的问题

  • 密钥生成方式错误:OpenSSL用-pbkdf2时,是通过PBKDF2算法从密码和salt生成密钥和IV,而不是直接对密码做SHA256哈希。
  • 文件格式解析错误:带-salt参数加密的文件,开头是固定8字节的Salted__标识,接着是8字节的随机salt,之后才是密文;你的代码错误地把文件开头当成了IV。

修正后的Go代码

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/sha256"
    "log"
    "os"

    "golang.org/x/crypto/pbkdf2"
)

func main() {
    // 读取加密文件
    encData, err := os.ReadFile("encpkg")
    if err != nil {
        log.Fatal(err)
    }

    // 读取密码文件
    password, err := os.ReadFile("encpass")
    if err != nil {
        log.Fatal(err)
    }

    // 解析OpenSSL加密文件格式:前8字节是"Salted__",接下来8字节是salt
    if len(encData) < 16 {
        panic("加密文件格式错误,数据过短")
    }
    salt := encData[8:16]
    ciphertext := encData[16:]

    // 使用PBKDF2生成密钥和IV:OpenSSL默认迭代次数10000,哈希算法SHA256
    // AES-256需要32字节密钥,CFB需要16字节IV,所以总共派生48字节
    derived := pbkdf2.Key(password, salt, 10000, 48, sha256.New)
    key := derived[:32]
    iv := derived[32:]

    // 初始化AES块和CFB解密器
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }
    stream := cipher.NewCFBDecrypter(block, iv)

    // 解密数据(CFB模式直接异或即可)
    plaintext := make([]byte, len(ciphertext))
    stream.XORKeyStream(plaintext, ciphertext)

    // 写入解密后的文件
    err = os.WriteFile("x_go.txz", plaintext, 0644)
    if err != nil {
        log.Fatal(err)
    }
}

关键说明

  • 文件格式解析:必须跳过前8字节的Salted__标识,提取接下来的8字节salt,剩下的部分才是需要解密的密文。
  • PBKDF2参数匹配:OpenSSL的-pbkdf2默认使用10000次迭代、SHA256哈希算法,派生的字节数是密钥长度(32字节)+ IV长度(16字节)=48字节,要完全匹配这些参数才能生成正确的密钥和IV。
  • CFB解密处理:CFB模式的解密和加密流程类似,都是通过流的异或操作完成,使用独立的明文缓冲区可避免覆盖原密文数据,更安全规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:58:57