调用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
相关产品推荐
相关产品推荐

