RSA編碼私鑰獲取RSA公鑰原理解析

    本文目的在於在逆向破解過程中遇見一個RSA私鑰字符串,以爲僅僅含有私鑰信息,無法獲取公鑰進行數據解密。但是經過後面的發現才知道自己理解錯誤。

先看java層的代碼:

可以看出在這裏私鑰是一種叫PKCS8編碼格式的,其實這裏帶入arg10編碼串是能夠導出公鑰的。

但是剛開始很迷惑,私鑰(d,n)對怎麼可能能生成公鑰(e,n)。爲了搞清查看了一下公私鑰的生成方式,網上找到如下步驟:

(1)選擇一對不同的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找一個與f(n)互質的數e,且1<e<f(n)。
(5)計算d,使得d*e≡1 mod f(n)。這個公式也可以表達爲d ≡e-1 mod f(n)
這裏要解釋一下,≡是數論中表示同餘的符號。公式中,≡符號的左邊必須和符號右邊同餘,也就是兩邊模運算結果相同。顯而易見,不管f(n)取什麼值,符號右邊1 mod f(n)的結果都等於1;符號的左邊d與e的乘積做模運算後的結果也必須等於1。這就需要計算出d的值,讓這個同餘等式能夠成立。
(6)公鑰KU=(e,n),私鑰KR=(d,n)。
(7)加密時,先將明文變換成0至n-1的一個整數M。若明文較長,可先分割成適當的組,然後再進行交換。設密文爲C,則加密過程爲:
(8)解密過程爲:

從這個過程中可以看出:只道私鑰(d,n),看似只要計算d mod f(n)就能得到唯一的e-1,從而獲得公鑰。雖然n=p*q,但是f(n)=(p-1)(q-1),無法通過n獲取f(n)。如果只知道公鑰對(e,n),也是需要f(n)。而只有n的情況下,唯一的做法就是對n進行質數分解,得到pq兩個值,顯然數學中對應大數的質數分解還沒有好的方法。

經過上述分析發現,僅有私鑰是不能獲取公鑰的。

那爲什麼上述java代碼裏面的私鑰能夠獲取公鑰呢,原因在於這種編碼格式的數據中含有公鑰。原因如下:

https://blog.csdn.net/zhymax/article/details/7683925#

這篇文章中給出了PKCS8編碼格式的數據結構,我截圖給大家看:

   0:d=0  hl=4 l= 710 cons: SEQUENCE
   4:d=1  hl=2 l=  64 cons: SEQUENCE
   6:d=2  hl=2 l=   9 prim:  OBJECT            :PBES2
  17:d=2  hl=2 l=  51 cons:  SEQUENCE
  19:d=3  hl=2 l=  27 cons:   SEQUENCE
  21:d=4  hl=2 l=   9 prim:    OBJECT            :PBKDF2
  32:d=4  hl=2 l=  14 cons:    SEQUENCE
  34:d=5  hl=2 l=   8 prim:     OCTET STRING      [HEX DUMP]:7A61B055165A89CA
  44:d=5  hl=2 l=   2 prim:     INTEGER           :0800
  48:d=3  hl=2 l=  20 cons:   SEQUENCE
  50:d=4  hl=2 l=   8 prim:    OBJECT            :des-ede3-cbc
  60:d=4  hl=2 l=   8 prim:    OCTET STRING      [HEX DUMP]:110E8A184EFEAB9C
  70:d=1  hl=4 l= 640 prim:  OCTET STRING      [HEX DUMP]:
C94F34F0CFF56B3E92D437C49559B1BD632BA2D8B22AF290B0E8EBB7F71C555115CED4DE87E3922A41436A20DA1DB01F1BD88EA3002E8AD4691C0B25F16AF4D196C2A96B99A1D49F704A21D3B81F8CC81C3F09412317B67F453151490D2573E1FD96D13BB55E7FCD4085ED0C4DD75EB1EFFC4ACE5431AFD708E6ECE5077BAB2B03965C6F2873C1DB5F475F861E9C04D61465C72A8A99DCF093190F746DD8959C0B0942E38A013B0FEC2D4A66F600EF75CE0326F3B4904C3128CB389204A1CC4F93EED7C8F2450603A42C6C16FB143FF4C9C01E714A43CC07B1F1B580A6C9DE4DC9B78CA0D5B874C75A0F56F6A55CFE4620F1AC639DCE4A8AF2BCBB69691DAF983BB26F6A6C859C371D1EBA7DA5C27FBDAC86C6529C48B32E3B89317FC7EBF03F9C105EAA1892437E9E789F0E2340979812A53CD1668EC07A45BBEAE088E7E27BB20B16C2D14280970BBF715D57005F194B97A1784E7BC563A0B84909A7EAB6C7E0BC6E2B467AA4009420D190617F93CD32FAEEE50003462DC8B26816040E891523E1375F339A3F05C43C9E90A4533BD4D3F75A2A33E60D91563542355D5ED1F46CF62594460694F459F0EC428BECE015F075895CFEB502EA22ECD9B53BF050B795074BE9A51194789F0B2970C21CCFE16284FB564F720C7899D5840362C48D248A50BAFA2720B0C1F7B417AD6EA183459BBB80679A85D96421C5AE3FA53A2135217F886759187123766914BB0169F6F9C3A36F1C46B6EB9300009A799D0F96C3E1FBE805F17A01FF2F5A9C941399E6130DBEE9825F4EB8937F2B8F0B3DE5F08644F3DC65028F2DE150D03D454AECFF9CAF26A00BB1B6D6D2C5255216E0A6769F14937618E31573811AAA464C3C42246A17DD70B1F77A87948FD5C7526D569BB8

因爲本文目的在於爲什麼通過私鑰可以獲取公鑰,所以在這裏就不解析具體結構了。上述最後一個OCTEC STRING結構就是私鑰數據。通過數據結構中指示的算法、密鑰或者還有加密向量對該數據進行解密得到明文私鑰。

該私鑰數據可以按如下結構進行解析:

RSAPrivateKey ::= SEQUENCE {
versionVersion,
modulusINTEGER, -- n
publicExponentINTEGER, -- e
privateExponentINTEGER, -- d
prime1INTEGER, -- p
prime2INTEGER, -- q
exponent1INTEGER, -- d mod (p-1)
exponent2INTEGER, -- d mod (q-1)
coefficientINTEGER, -- (inverse of q) mod p
otherPrimeInfosOtherPrimeInfos OPTIONAL
}

其中,每一項的具體定義可以參考PKCS#1。

到這裏我們發現一開始java代碼中給的PKCS8的私鑰其實是含有生成密鑰對的p和q以及公私鑰對。

所以,我們得出結論:

(1)在僅有公私鑰對的情況下是難以獲取另一個公私鑰。

(2)如果私鑰爲PKCS編碼格式的,則可以導出公私鑰。

(3)通過私鑰分析方法,您可以分析編碼的公鑰數據結構,一般編碼的公鑰數據結構僅有公鑰情況,不然也起不到加密作用。

  這裏有個在線工具可以從編碼的私鑰字符串中提取公鑰:http://tool.chacuo.net/cryptgetpubkey

  若有誤請大家指正,也參考了一些人的文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章