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

调用USB Armory Mk-II的Linux Crypto API做AES加密报协议不可用错误

问题原因及解决方案

核心错误原因

你错误地将ALG_SET_OP配置应用到了AF_ALG的初始套接字上,AF_ALG接口的正确使用逻辑为:

  • 调用socket()创建的AF_ALG套接字仅用于执行bind()绑定算法、设置密钥等全局配置
  • 全局配置完成后必须调用accept()获取一个专属的会话套接字,加密/解密方向设置、后续的读写操作都要在这个会话套接字上执行,你直接在初始套接字上设置ALG_SET_OP自然会抛出协议不可用的错误。

其他需要排查的点

  • 确认内核已加载mxs-dcp相关驱动,且目标算法存在:执行cat /proc/crypto | grep -A 10 "ecb-aes-dcp"检查是否有对应的算法条目,不存在的话先加载mxs_dcp内核模块
  • 确认内核配置开启了CONFIG_CRYPTO_USER_API_SKCIPHER选项,这是用户态调用对称加密API的必要前提
  • 补充所有系统调用的错误捕获:你当前代码忽略了socket()、bind()的返回错误,若算法不存在导致绑定失败,后续操作也会出现异常
  • 运行程序需要root权限,AF_ALG的加密操作默认需要高权限才能执行

修正后的代码逻辑参考

// 初始套接字仅用于配置算法和密钥
fd, err := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0)
if err != nil {
    return err
}
addr := &unix.SockaddrALG{Type: "skcipher", Name: "ecb-aes-dcp"}
if err := unix.Bind(fd, addr); err != nil {
    return err
}

KEY := "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c"
if err = syscall.SetsockoptString(fd, unix.SOL_ALG, unix.ALG_SET_KEY, KEY); err != nil {
    return err
}

// 必须accept获取会话套接字,后续操作都在会话fd上执行
opFd, _, err := unix.Accept(fd)
if err != nil {
    return err
}

// 正确:在会话套接字上设置加密方向
err = syscall.SetsockoptInt(opFd, unix.SOL_ALG, unix.ALG_SET_OP, unix.ALG_OP_ENCRYPT)
if err != nil {
    return err
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:45:00