【问题标题】:Use of the Linux Crypto API for AES Encryption使用 Linux Crypto API 进行 AES 加密
【发布时间】:2021-08-26 11:51:50
【问题描述】:

我在使用 USB Armory Mk-II 的 Linux Crypto API(用户空间接口)时遇到了一些问题。我成功进行了哈希计算但没有进行aes加密或解密操作。

我正在编写一个使用 API 进行 AES 加密/解密的 go 代码。我以以下代码为例来帮助我:https://github.com/f-secure-foundry/mxs-dcp/blob/master/dcp_tool.go。一切都已安装,这是我的加密功能的一部分:

    fd, _ := unix.Socket(unix.AF_ALG, unix.SOCK_SEQPACKET, 0)
    addr := &unix.SockaddrALG{Type: "skcipher", Name: "ecb-aes-dcp"}
    unix.Bind(fd, addr)

    KEY := "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c"

    err = syscall.SetsockoptString(fd, unix.SOL_ALG, unix.ALG_SET_KEY, KEY)

    if err != nil {
            return
    }

    //unix.ALG_OP_ENCRYPT = 0x1
    // from https://pkg.go.dev/golang.org/x/sys/unix#pkg-constants

    //ENCRYPT := "\x00"
    err = syscall.SetsockoptInt(fd, unix.SOL_ALG, unix.ALG_SET_OP, unix.ALG_OP_ENCRYPT)

    if err != nil {
            return
    }

代码在syscall.SetsockoptInt停止运行,错误为“协议不可用”。

我不知道这是从哪里来的,Linux 加密 API 文档 (https://www.kernel.org/doc/html/v4.19/crypto/index.html) 并没有真正帮助我。如果我理解它,我必须进行系统调用来告诉我想要加密操作(unix.ALG_SET_OPunix.ALG_OP_ENCRYPT)。但这不起作用。

有人知道为什么吗?

【问题讨论】:

    标签: go encryption linux-kernel


    【解决方案1】:

    实际上,您必须将操作标志与数据一起发送。在此代码https://github.com/f-secure-foundry/mxs-dcp/blob/master/dcp_tool.go 中,您通过使用 TEST_KEY 对分散器进行加密 (aes cbc) 生成派生密钥。 DCPDeriveKey 函数将首先打开套接字然后绑定它并设置密钥。在由函数cryptoAPI 进行加密之前,我们必须将SYSACCEPT 标志发送到内核。函数cryptoAPI会将操作标志和数据发送给内核,并读取内核的答案。

    【讨论】:

      猜你喜欢
      • 2021-11-04
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多