2012-05-21 30 views
7

我是密碼學和pycrypto的新手。我有模數和私人指數。如何構建RSA私鑰並簽署消息?

我有模數n和私人指數d。根據我的理解,在看完一些文檔後私鑰nd組成。

我需要簽署一條消息,我不知道如何使用pycrypto來做到這一點。 RSA.construct()方法接受一個元組。但我不得不另外提供公開指數e這個方法(我沒有)。

所以這是我的問題。我必須以某種方式計算e才能簽署消息嗎?

看來我應該能夠通過使用nd(即構成私鑰)來簽署消息。我對麼?我可以用pycrypto來做到這一點嗎?

在此先感謝。

+1

你沒有公鑰? –

回答

4

實際上,對於使用公鑰加密的消息進行解密,它足以擁有私有指數。

這也意味着你可以簽署一條消息,因爲簽名基本上就是* de *用私鑰加密明文,當* en *用公鑰加密時將再次給出明文。通常你使用哈希之前,對明文消化簽署...

爲什麼你不能解密消息uing的原因只有ndpyrcypto的是,它確實消息解密過程中blinding step,這involves the public exponent,但並不是真正需要解密的。

但是通過使用一些調用私有API這一步可以被繞過。

所以這應該工作:

from Crypto.PublicKey import RSA 
from Crypto.Util.number import bytes_to_long, long_to_bytes 

full = RSA.generate(2048) 

# construct key using only n and d 
try: 
    # pycrypto >=2.5, only tested with _slowmath 
    impl = RSA.RSAImplementation(use_fast_math=False) 
    partial = impl.construct((full.n, 0L)) 
    partial.key.d = full.d 
except TypeError: 
    # pycrypto <=2.4.1 
    partial = RSA.construct((full.n, 0L, full.d)) 



pub = full.publickey() 

# create message with padding 
# http://en.wikipedia.org/wiki/RSA_%28algorithm%29#Padding_schemes 
cleartext = ... 

signature = partial.sign(cleartext, None) 

print "validating message: ", pub.verify(cleartext, signature) 


message = pub.encrypt(cleartext, None) 

# bypassing the blinding step on decrypt 
enc_msg=map(bytes_to_long, message) 
dec_msg = map(partial.key._decrypt, enc_msg) 

print "decrypting: " 
for m in dec_msg: 
    print long_to_bytes(m) 
+3

RSA簽名沒有填充的任何一段代碼(如這個)都是* dead * * wrong *,無論它是否工作。 – SquareRootOfTwentyThree

+0

對於第一個句子而言,您無法使用公鑰進行簽名。 –

+0

@owlstead - uups,這當然是一個錯誤...修正了這個問題。 – mata

3

不,您不能從d計算e

RSA在de中是對稱的:您可以平等地交換公鑰和私鑰的角色。當然,我們選擇一個專門爲私人和透露其他 - 但理論上他們做同樣的事情。當然,既然你不能從公衆推斷私鑰,你也不能從私有中推斷出公鑰。

當然,如果你有私鑰,那就意味着生成了密鑰對,這意味着你有公鑰在某個地方。

+0

看到我的答案,你幾乎是正確的。 –

2

如果你沒有公開的指數,你可能會猜到它。大多數情況下,它不是一個隨機數,而是一個靜態數值。嘗試值65537(十六進制0x010001,費馬的第四個數字),3,5,7,13和17(依次)。

[編輯]只需用私鑰簽名並用公鑰驗證公鑰是否正確。

注意:如果它是隨機素數,就很難找到私有指數;這意味着你將試圖破壞RSA - 不可能對於大於512位的密鑰大小。

+0

很好的答案。我會補充說,它可能會更快,以檢查驗證簽名方將使用... – SquareRootOfTwentyThree

+0

@SquareRootOfTwentyThree嗯,確實是關於簽署,稍微改變我的答案:) –

+0

@owlstead感謝您指出了。主要問題是:如果我只有模數'n'和私有指數'd',我該如何簽名消息? – Maxim