gpt4 book ai didi

common-lisp - 如何在 Common Lisp 中使用 Ironclad 创建 SHA256 HMAC?

转载 作者:行者123 更新时间:2023-12-02 21:50:00 24 4
gpt4 key购买 nike

我正在尝试将一个 python 函数移植到 Common Lisp:

HEX(HMAC_SHA256(apiSecret, 'stupidstupid'))

我该如何使用 Ironclad 来解决这个问题?

我最接近的是:

(ironclad:make-hmac apiSecret :sha256)

但是它不起作用;它说 apiSecret

The value "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI"
is not of type
(SIMPLE-ARRAY (UNSIGNED-BYTE 8) (*)).

最佳答案

Ironclad 在内部使用字节数组。

但它提供了从 ascii 字符串转换为此类数组以及从字节转换为“十六进制”字符串的工具。这是一个交互式 session (注意我对加密算法了解不多):

CL-USER> (in-package :ironclad)
#<PACKAGE "IRONCLAD">

转换 secret :

CRYPTO> (ascii-string-to-byte-array "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI")
#(86 48 109 110 49 76 76 81 73 99 54 71 78 83 105 66 112 68 102 68 109 82 111
51 74 105 56 108 101 66 90 87 113 77 73 111 108 78 66 115 110 97 107 108 83
99 103 73)

根据之前的值构建 HMAC:

CRYPTO> (make-hmac * :sha256)
#<HMAC(SHA256) {1006214D93}>

现在,我不确定这是否是您想要的,但根据the documentation ,您应该使用一个或多个序列更新 hmac:

CRYPTO> (update-hmac * (ascii-string-to-byte-array "stupidstupid"))
#<HMAC(SHA256) {1006214D93}>

...然后计算摘要:

CRYPTO> (hmac-digest *)
#(178 90 228 244 244 45 109 163 51 222 77 235 244 173 249 208 144 43 116 130
210 188 62 247 145 153 100 198 119 86 207 163)

结果数组可以转换为十六进制字符串:

CRYPTO> (byte-array-to-hex-string *)
"b25ae4f4f42d6da333de4debf4adf9d0902b7482d2bc3ef7919964c67756cfa3"

为了完整起见,假设您位于导入正确符号的包中,以下是如何包装这些函数以复制原始代码:

(defun hex (bytes)
(byte-array-to-hex-string bytes))

(defun hmac_sha256 (secret text)
(let ((hmac (make-hmac (ascii-string-to-byte-array secret) :sha256)))
(update-hmac hmac (ascii-string-to-byte-array text))
(hmac-digest hmac)))

最后:

(HEX (HMAC_SHA256 "V0mn1LLQIc6GNSiBpDfDmRo3Ji8leBZWqMIolNBsnaklScgI"
"stupidstupid"))

=> "b25ae4f4f42d6da333de4debf4adf9d0902b7482d2bc3ef7919964c67756cfa3"

关于common-lisp - 如何在 Common Lisp 中使用 Ironclad 创建 SHA256 HMAC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42445504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com