2013-04-08 98 views
3

我想對散列執行盲法和解除盲操。Python PyCrypto RSA Blind and Unblind

以下: https://gdata-python-client.googlecode.com/hg/pydocs/gdata.Crypto.PublicKey.RSA.html#RSAobj_c-unblind

我:

messageHashed = md5.new('MyMessage').digest() 
print 'Message MD5:%s' % messageHashed 
blindSigned = loadedPublic.blind(messageHashed,123) 
print 'Blinded: %s' % blindSigned 
blindSigned = loadedPrivate.sign(blindSigned,loadedPrivate.n) 
print 'Blinded Signed: %s' % str(blindSigned) 

unblind = loadedPrivate.unblind(blindSigned,123) 
print '-------------' 
print 'Unblinded: %s' % unblind 
verify = loadedPrivate.verify(unblind,(loadedPrivate.n,loadedPrivate.d)) 
print 'Verify: %s' % verify 

(我先前已經加載了公鑰和私鑰和多數民衆工作的罰款)

現在,我的問題是,當它運行時,我得到這個輸出:

M<ssage MD5:?.Z?3??f2?? 
Blinded: ?YL⽥p??j+Z<I?vxV??{5?? 
??>[??? ??r?"l 
??d?ڸYC????k?U?Q?????C?0?D??*T8?}?P?9~$??'?p??ZR:2? sh͓l??kXvU??d]???$?c聻[email protected]? 
Blinded Signed: (122872721681409041185513323026772702402844983846953530757782619983060590754290923453963299094289086410649560247540686534912830758097386690290305557644701999751846538319065094741731992734124277081554060855405114566548615303949954231396930615801829673187895538075706631646002356108979884582511973944741160960028L,) 
Traceback (most recent call last): 
    File "NewClient.py", line 103, in <module> 
    unblind = loadedPrivate.unblind(blindSigned,123) 
    File "build/bdist.macosx-10.8-intel/egg/Crypto/PublicKey/pubkey.py", line 165, in unblind 
    File "build/bdist.macosx-10.8-intel/egg/Crypto/PublicKey/RSA.py", line 247, in _unblind 
    object = RSAobj 
    File "build/bdist.macosx-10.8-intel/egg/Crypto/PublicKey/_slowmath.py", line 47, in _unblind 
OverflowError: cannot fit 'long' into an index-sized integer 

儘管unblind功能記錄如下:

unblind(self, M, B) 
unblind(M : string|long, B : string|long) : string|long 
Unblind message M using blinding factor B. 

它似乎不接受它。

任何人都可以指向正確的方向嗎?我已經呆了好幾個小時了。

回答

3

兩件事情脫穎而出,成爲我試圖複製您的問題:

  • 在我的版本加密的(2.4.1)中,_RSAobj.blind()_RSAobj.unblind()呼叫出現強制類型(即你要求提供longstring,int s不起作用)。通過在數值的末尾添加L(例如,9001L)來表示常數long
  • _RSAobj.sign()函數返回一個元組。簽名結束於返回值的元素0。

所以,你的代碼真的是這樣的:

messageHashed = md5.new('MyMessage').digest() 
print 'Message MD5:%s' % messageHashed 
blindSigned = loadedPublic.blind(messageHashed,123L) 
print 'Blinded: %s' % blindSigned 
blindSigned = loadedPrivate.sign(blindSigned,loadedPrivate.n)[0] 
print 'Blinded Signed: %s' % str(blindSigned) 

unblind = loadedPublic.unblind(blindSigned,123L) 
print '-------------' 
print 'Unblinded: %s' % unblind 
verify = loadedPublic.verify(unblind,(loadedPrivate.n,loadedPrivate.d)) 
print 'Verify: %s' % verify 

此代碼運行,但可能不會做你真正想做的事情;特別是verify將總是最終成爲False

你有什麼揭盲後使用p的messageHashed有效RSA簽名,_RSAobj.verify(self, M, signature)是正確的函數簽名(有需要signature是一個2元組,第0要素之一是實際的RSA簽名)。所以,如果你有

verify = loadedPublic.verify(messageHashed, (unblind,)) 

工作如做廣告(即verify應該最終會被True)。

+1

非常感謝你。這讓我更多時間把頭髮拉出來。它完美無瑕! 另外,你使用比特幣嗎?如果是這樣,請提供一個地址,我會提示您的幫助:)再次感謝! – user2225961 2013-04-08 14:16:35

+0

@ user2225961 16So8uNJ9vqaC4zM2BUP6pi5b8L1bq6TTv :) – atomicinf 2013-04-08 17:17:01

0

從我的頭頂開始,你會想要提取簽名中包含的摘要以獲得非盲目數據。

稍後當我到一臺機器測試代碼時,我會採取更好的措施。

+0

隨着下面的信息(元組和類型修正),我會建議在簽名之前將填充應用到散列(PSS是較新的RSA簽名方案之一)。同樣看着這個,你可能會想要失明,這樣一個不同的密鑰參與致盲,否則失去致盲目的(簽名數據,以便隱式簽名「未知」函數的操作數)。 – harningt 2013-04-08 01:31:41

+0

如果我理解盲法正確,它是致盲因素(本例中爲'123L',雖然理所當然,它必須是隨機的和_large_),以防止第三方佔據消息 - 因此所有操作都使用_signing權威機構的keys_,但致盲因素(這是恢復'明文'所必需的)只對請求者是已知的,然後他可以使用它來解開並獲得他們可以附加到原始消息的有效簽名。 – atomicinf 2013-04-08 01:50:38

+0

123L只是爲了簡單而使用,它會生成並且更高。感謝您的輸入! – user2225961 2013-04-08 14:17:03