使用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密钥,但满足大多数需求。
正如我的评论所说,您想要的是:
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
请注意,此代码未经测试,但构件应该正确。你想在一个私人密钥来读取(readFile
,decodePrivate
)。执行一些错误检查(throwLeft
)并在消息上签名(sign
)。
编辑:我觉得确定该长度比问题中的Python示例长的方法很有帮助。似乎构建块是相同的,但是库所公开的抽象级别与错误处理(显式与异常)大不相同。如果我们假设库作者通过从一个模块中重新导出所有内容并定义了一个助手来做更多的工作:
loadKey :: FilePath -> IO PrivateKey
loadKey p = (throwLeft . decodePrivate) `fmap` readFile p
然后代码几乎相同:
k <-loadKey keyFile
let result = sign k msg
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句