2009-10-15 31 views
3

這可能是一個新手問題。我生成密鑰對與Java:Java:爲什麼512位RSA KeyPairGenerator返回65個字節的密鑰?

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 
keyGen.initialize(512, random); 

KeyPair keyPair = keyGen.genKeyPair(); 

RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate(); 

現在,我一直以爲privateKey.getModulus()和privateKey.getPrivateExponent()形成「私鑰」,他們是一樣大的密鑰長度(512位)傳遞給密鑰生成器。但是,privateKey.getPrivateExponent()。toByteArray()有時返回一個64字節(如我所料),有時是65字節的數組。

爲什麼有時候會有65個字節?我在這裏錯過了什麼嗎?

+0

512 =密鑰中的位數。 512/8 = 64字節。不知道爲什麼你得到65字節回來雖然... – 2009-10-15 12:30:53

回答

10

getPrivateExponent()返回一個BigInteger,toByteArray()方法返回一個字節數組,它總是包含一個符號位。如果設置了512位指數中的最高有效位,則BigInteger將添加額外的第513位0位,以指定該數字爲正值,而不是511位負數,第512位設置爲1.對於513位,65字節爲編碼所需的。

如果您查看返回的字節數組的內容,如果您獲得一個65元素數組,則第一個字節將始終爲0。

+0

大聲笑,猜我們在這裏的同一頁,你只是打我1分鐘:) – Abel 2009-10-15 12:40:19

+0

thx,這是快速:-) * rtm *我想,對不起...... – wilth 2009-10-15 12:46:00

+0

這不僅發生在Java (由於BigInteger簽名),但也出於類似的原因(由於ASN.1的INTEGER簽名)在ASN.1 DER格式中。 – lapo 2009-10-28 10:36:16

-1

8 * 64 = 512?

編輯:我的壞,沒有看到64和65之間的交易,確實是一個很好的問題。

+0

是的,正確的:-)我的觀點是:爲什麼參數(私人exp,mod)_sometimes_ 65字節? – wilth 2009-10-15 12:29:56

2

這裏的a little story on RSA這說明密鑰長度並不總是你的想法,即從最重要的位開始計算。但是,它不應該超過512位,因爲這是密鑰的最大長度。這個故事是關於感知密鑰長度的,不一定是實現中的關鍵長度。

getPrivateExponent返回BigIntegergetPrivateExponent().toByteArray()返回BigInteger的二進制補碼錶示。 A BigInteger已簽署。 512位(64字節)未被簽名。這意味着:如果最高有效位被設置(符號位)使其無符號,則BigInteger需要填充一個字節以使其符合要求。如果你看看字節,你會發現增加的字節總是爲零。

相關問題