gpt4 book ai didi

haskell - 使用文件中的 PrivateKey 进行 RSA 签名

转载 作者:行者123 更新时间:2023-12-04 18:43:05 25 4
gpt4 key购买 nike

使用 Haskell,您如何使用文件中的现有私钥进行签名?

在 Python 中,它就像 -

import M2Crypto
rsa = M2Crypto.RSA.load_key("path/to/key")
result = rsa.sign("foo")

看来您可以使用 Codec.Crypto.RSA 签名模块 -

http://hackage.haskell.org/package/RSA-1.0.6.2/docs/Codec-Crypto-RSA.html#g:2

但我只看到如何从该模块生成新的私钥,而不是使用现有的。似乎 Network.TLS.Extra模块提供从文件中读取私钥 -

http://hackage.haskell.org/package/tls-extra-0.6.1/docs/Network-TLS-Extra.html#g:6

不幸的是,从每个模块导出的 PrivateKey 类型彼此不兼容 -
Couldn't match expected type `crypto-pubkey-types-0.4.0:Crypto.Types.PubKey.RSA.PrivateKey'
with actual type `tls-1.1.5:Network.TLS.Crypto.PrivateKey'

最佳答案

我需要类似的东西,所以我在包 crypto-pubkey-openssh 中添加了一些序列化/反序列化一会儿回来。它不处理加密或 ECC key ,但足以满足大多数需求。

正如我的评论所说,你想要这样的东西:

import Codec.Crypto.RSA (sign)
import Crypto.PubKey.OpenSsh (decodePrivate, OpenSshPrivateKey)
import Crypto.Types.PubKey.RSA (PrivateKey)
import Data.ByteString (ByteString)

throwLeft :: Either String OpenSshPrivateKey -> PrivateKey
throwLeft (Right (OpenSshPrivateKeyRsa k)) = k
throwLeft (Right _) = error "Wrong key type"
throwLeft (Left s) = error $ "Error reading keys: " ++ s

readAndSign :: FilePath -> ByteString -> IO ByteString
readAndSign file msg = (flip sign msg . throwLeft . decodePrivate) `fmap` readFile file

请注意,此代码未经测试,但构建 block 应该是正确的。你想读入一个私钥( readFiledecodePrivate )。执行一些错误检查 ( throwLeft) 并签署消息 ( sign)。

编辑:
我觉得确定它比问题中的 Python 示例更长的方式是有成效的。看起来好像构建 block 是相同的,但是库公开的抽象级别以及错误处理(显式与异常)非常不同。如果我们假设库作者通过重新导出一个模块中的所有内容并定义了一个助手来做更多的工作:
loadKey :: FilePath -> IO PrivateKey
loadKey p = (throwLeft . decodePrivate) `fmap` readFile p

然后代码几乎相同:
k <-loadKey keyFile
let result = sign k msg

关于haskell - 使用文件中的 PrivateKey 进行 RSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20318751/

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