我正在尝试在Haskell中生成一个RSA签名,该签名将匹配Python的M2Crypto中的相同签名。我认为我的问题是Codec.Crypto.RSA
正在使用PKCS1 v1.5算法而M2Crypto正在使用不同的东西。实际上,在Python中使用PKCS1 v1.5时,我得到的结果与Haskell相同。
如何使用与M2Crypto相同的算法进行签名?这似乎可能有所帮助,但我无法弄清楚如何应用它 - M2crypto signature "algorithm"
以下是我在Haskell和Python中的粗略实现(有和没有PKCS1 v1.5)。
$ ghci
λ> import qualified Codec.Crypto.RSA as RSA
λ> import qualified Data.ByteString.Lazy.Char8 as LC
λ> import Data.Char (ord)
λ> privateKey <- loadKey "path/to/key"
λ> let sign = RSA.rsassa_pkcs1_v1_5_sign RSA.ha_SHA1 privateKey
λ> map ord . LC.unpack . sign . LC.pack $ "foo"
[64,205,42,184,31,245,70,17,189,5,248,46, ...]
$ python
>>> import M2Crypto
>>> result = M2Crypto.RSA.load_key('path/to/key').sign('foo', 'sha1')
>>> map(ord, result)
[125, 114, 236, 230, 182, 19, 237, 220, ...]
>>> from Crypto.PublicKey import RSA
>>> from Crypto.Signature import PKCS1_v1_5
>>> from Crypto.Hash import SHA
>>> key = RSA.importKey(open('path/to/key').read())
>>> result = PKCS1_v1_5.new(key).sign(SHA.new('foo'))
>>> map(ord, result)
[64, 205, 42, 184, 31, 245, 70, 17, 189, 5, 248, 46, ...]