在Haskell中使用PEM格式的公钥验证RSA签名

时间:2019-02-02 02:13:20

标签: haskell cryptography

如果我有一个有效载荷,签名和一个公共密钥(全部为字节串或类似格式),如何验证签名?

我在Hackage上看到的所有PublicKey类型似乎纯粹是通过数字表示密钥,例如:

PublicKey    

public_size :: Int  -- size of key in bytes

public_n :: Integer -- public p*q

public_e :: Integer -- public exponant e

如何从PEM文件中获取PublicKey,或者直接从PEM文件中进行验证?

[从反馈中进行编辑,未尝试进行任何解决方案]-我四处寻找解决方案,但是根本找不到满足我期望的任何类型签名的东西,例如{{1} }。我不想从头开始重新实现它,因为我现在正在做的只是调用执行所有验证的python脚本。如果我不需要调出python,但似乎找不到任何现有代码,那就太好了。

1 个答案:

答案 0 :(得分:1)

如果库公开了类似public_n :: Integer的接口,则意味着它是说明RSA操作的库,而不是用于加密的库。加密库具有类似sign :: Key -> ByteString -> ByteString的接口。任何加密库都应能够解析PEM格式的密钥。

OpenSSL是流行的密码学库。它并不总是理想或易于使用,但它已经广泛使用,并且由于使用Haskell,因此您不会使用其古怪的C接口。因此,您可以使用HsOpenSSL,它是基于OpenSSL的Haskell绑定。 (注意:我从未使用过HsOpenSSL,但是看起来很明智。)使用OpenSSL.PEM.readPrivateKey读取PEM格式的密钥,使用OpenSSL.EVP.Digest.digestLBS计算要签名的消息的摘要,然后使用{{3 }}对摘要进行签名。