Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟Python';Haskell中的M2S加密签名算法_Python_Haskell_Openssl_Rsa_M2crypto - Fatal编程技术网

模拟Python';Haskell中的M2S加密签名算法

模拟Python';Haskell中的M2S加密签名算法,python,haskell,openssl,rsa,m2crypto,Python,Haskell,Openssl,Rsa,M2crypto,我试图在Haskell中生成一个RSA签名,该签名将与Python的M2Crypto中的相同签名相匹配。我认为我的问题在于,Codec.Crypto.RSA使用的是PKCS1 v1.5算法,而M2Crypto使用的是不同的东西。事实上,在Python中使用PKCS1 v1.5时,我得到的结果与Haskell相同 如何使用与M2Crypto相同的算法进行签名?这似乎有帮助,但我不知道如何应用它- 下面是我在Haskell和Python中的粗略实现(有和没有PKCS1 v1.5) $ghci λ>

我试图在Haskell中生成一个RSA签名,该签名将与Python的M2Crypto中的相同签名相匹配。我认为我的问题在于,
Codec.Crypto.RSA
使用的是PKCS1 v1.5算法,而M2Crypto使用的是不同的东西。事实上,在Python中使用PKCS1 v1.5时,我得到的结果与Haskell相同

如何使用与M2Crypto相同的算法进行签名?这似乎有帮助,但我不知道如何应用它-

下面是我在Haskell和Python中的粗略实现(有和没有PKCS1 v1.5)

$ghci
λ> 将合格的Codec.Crypto.RSA导入为RSA
λ> 将限定数据.ByteString.Lazy.Char8作为LC导入
λ> 导入数据字符(ord)
λ> privateKey let sign=RSA.rsassa_pkcs1_v1_5_sign RSA.ha_SHA1 privateKey
λ> 地图。开箱。签名LC.pack$“foo”
[64,205,42,184,31,245,70,17,189,5,248,46, ...]
$python
>>>导入M2Crypto
>>>result=M2Crypto.RSA.load_key('path/to/key')。sign('foo','sha1'))
>>>地图(作战需求文件,结果)
[125, 114, 236, 230, 182, 19, 237, 220, ...]
>>>从Crypto.PublicKey导入RSA
>>>从加密签名导入PKCS1\u v1\u 5
>>>从Crypto.Hash导入SHA
>>>key=RSA.importKey(open('path/to/key')。read())
>>>结果=PKCS1\u v1\u 5.new(key).sign(SHA.new('foo'))
>>>地图(作战需求文件,结果)
[64, 205, 42, 184, 31, 245, 70, 17, 189, 5, 248, 46, ...]

看起来像'M2Crypto.RSA.load_key(..).sign'的第一个参数是摘要,而不是您想要根据Ugh签名的消息…所以这只是我一个愚蠢的人为错误。我的Haskell代码散列错误…谢谢!
$ 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, ...]