多謝各位關注,問題緣由已經肯定,現決定結貼!算法
總結一下:安全
每對RSA密鑰均存在至少一組非法私鑰,且非法私鑰能夠正常進行密鑰補全和解密;性能優化
對用戶來講,並無影響;工具
安全性上,暴力破解時間複雜度會有一些減少,可是對我的電腦速度來講,也基本忽略了。性能
可能我最開始野心太大,總想着找找RSA的茬,卻沒有先想着從原理上找到出現這種狀況的緣由,也感謝@Mike_Dog的及時指點。儘管如此,我仍是會對權威的東西保持懷疑,另外AKS素數檢測算法也會繼續跟進。優化
再次感謝!spa
==============================2017.01.23夜更新==============================code
再次感謝@Mike_Dog的評論,如今具體緣由已經分析完畢!在這裏詳細描述一下出現這種狀況的緣由。blog
再次羅列一下原文提到的密鑰數據。ip
5元子以下:
P =
E3DB3B70833CFAC57472BE9234AECC4E0EECFD909015F199BDD109F05F89CE72B2CDAE24BD4D7923C1472DC719F9B987649C96675685D9F4EEDDA9EAE5C853EF
Q =
D534A891DB7899D60A917379105B9EE4589CB32046F850489539938C2EA8DF77A55BB21FA7B4FC30B2CAB67DF530918BB1267530F6A2E0C82765C5C96F27A21D
φ(N) = (p - 1)(q - ) =
BDC447066192C96D3A4F6200885903E335A46BA0F989618F7158343F94BDC9BBEEB08CE1550C4D82655529D436B4FAAA790CB6CB463F43A62A9C78DE1B43B9600E99F4F9B78352EEC1D2E4E005AAF2C577872A5E153A90427CBB408BA658C28F8C075E205F6597814F76C3F9E4514C3E86F56409237B816813F624E0E247CA08
D =
7E82DA04410C8648D18A4155B03B57ECCE6D9D15FBB0EBB4F63ACD7FB87E867D49CB089638B2DE56EE38C68D79CDFC71A60879DCD97F826EC712FB3EBCD7D0EAB466A35125023749D68C9895591CA1D8FA5A1C3EB8D1B581A87CD5B26EE5D70A5D5A3EC03F990FAB8A4F2D5142E0DD7F04A3980617A7AB9AB7F96DEB4185315B
DP = D % (P - 1) =
97E77CF5ACD351D8F84C7F0C231F32DEB49DFE60600EA111293606A03FB1344C7733C96DD388FB6D2B84C92F66A67BAF98686444E4593BF89F3E714743DAE29F
DQ = D % (Q - 1) =
8E231B0BE7A5BBE4070BA250B59269ED9068776AD9FAE030637BB7B2C9C5EA4FC39276BFC52352CB21DC79A94E206107CB6EF8CB4F1740856F992E864A1A6C13
QINV = (P ^ (-1)) % Q =
BD245407D1E2BF05D5AA4D7CFC55907B4FA03E8521BDC4C2BABC09AAF74FB4DA9A9238E115F1A3392AE97A546FDD1A4F6A23CE0A7B6106E2628503ED99D053E5
N = P * Q =
BDC447066192C96D3A4F6200885903E335A46BA0F989618F7158343F94BDC9BBEEB08CE1550C4D82655529D436B4FAAA790CB6CB463F43A62A9C78DE1B43B961C7A9D8FC1638E78A40D716EB4AB55DF7DF10DB0EEC48D224CFC5DE08348B7079E430BE64C4680CD5C388A83EF37B97519CB86FA170A43C252A3994953737C013
以上按照正確的RSA密鑰產生方式依次計算。
產生問題的計算方式以下:
在計算φ(N)的時候,若是在計算以前將P-1和Q-1的公因子約掉(P-1和Q-1均爲偶數,能夠約掉一個2),則
(P- 1) / 2 =
71ED9DB8419E7D62BA395F491A57662707767EC8480AF8CCDEE884F82FC4E7395966D7125EA6BC91E0A396E38CFCDCC3B24E4B33AB42ECFA776ED4F572E429F7
(Q - 1) / 2 =
6A9A5448EDBC4CEB0548B9BC882DCF722C4E5990237C28244A9CC9C617546FBBD2ADD90FD3DA7E1859655B3EFA9848C5D8933A987B51706413B2E2E4B793D10E
此時,φ'(n) = ((P- 1) / 2)((Q- 1) / 2) =
2F7111C19864B25B4E93D880221640F8CD691AE83E625863DC560D0FE52F726EFBAC23385543136099554A750DAD3EAA9E432DB2D18FD0E98AA71E3786D0EE5803A67D3E6DE0D4BBB074B938016ABCB15DE1CA97854EA4109F2ED022E99630A3E301D78817D965E053DDB0FE7914530FA1BD590248DEE05A04FD89383891F282
則按照這個φ'(n)計算獲得的私鑰,知足E * D' ≡ 1 % φ'(N)的D' =
1FA0B68110432192346290556C0ED5FB339B67457EEC3AED3D8EB35FEE1FA19F5272C2258E2CB795BB8E31A35E737F1C69821E77365FE09BB1C4BECFAF35F43AAD19A8D449408DD275A32625564728763E96870FAE346D606A1F356C9BB975C297568FB00FE643EAE293CB5450B8375FC128E60185E9EAE6ADFE5B7AD0614C57
與前文提到的非法私鑰徹底一致。
按照這個計算流程,能夠知道D' = D % φ'(n),也就解釋了爲何這個D'對於5元子補全以及解密操做徹底沒有影響。
其實按照這個思路,還能夠有兩種方式獲得這個非法私鑰。
若是計算φ''(n) = (P- 1)((Q- 1) / 2) =
5EE2238330C964B69D27B100442C81F19AD235D07CC4B0C7B8AC1A1FCA5EE4DDF7584670AA8626C132AA94EA1B5A7D553C865B65A31FA1D3154E3C6F0DA1DCB0074CFA7CDBC1A97760E9727002D57962BBC3952F0A9D48213E5DA045D32C6147C603AF102FB2CBC0A7BB61FCF228A61F437AB20491BDC0B409FB12707123E504
或者計算φ'''(n) = ((P- 1) / 2)(Q- 1) =
5EE2238330C964B69D27B100442C81F19AD235D07CC4B0C7B8AC1A1FCA5EE4DDF7584670AA8626C132AA94EA1B5A7D553C865B65A31FA1D3154E3C6F0DA1DCB0074CFA7CDBC1A97760E9727002D57962BBC3952F0A9D48213E5DA045D32C6147C603AF102FB2CBC0A7BB61FCF228A61F437AB20491BDC0B409FB12707123E504
這兩個值是相等的,則知足E * D'' ≡ 1 % φ''(N)的D'' =
1FA0B68110432192346290556C0ED5FB339B67457EEC3AED3D8EB35FEE1FA19F5272C2258E2CB795BB8E31A35E737F1C69821E77365FE09BB1C4BECFAF35F43AAD19A8D449408DD275A32625564728763E96870FAE346D606A1F356C9BB975C297568FB00FE643EAE293CB5450B8375FC128E60185E9EAE6ADFE5B7AD0614C57
也就是原文中的非法私鑰。
而後要說的就是產生這個問題的緣由,按照上面的計算方式,能夠爲全部的RSA密鑰計算獲得一組非法私鑰(也許更多組),可是該非法私鑰的計算過程仍然依賴素因子P和Q,也就是沒有繞過大數分解難題,對RSA算法的安全性沒有任何影響(不過非法私鑰比合法私鑰小不少,暴力破解的話也許會在時間複雜度上小不少)。
並且對於用戶來講,密鑰一旦生成,不管是合法私鑰仍是非法私鑰,在加解密、簽名驗籤的過程當中均沒有任何正確性的影響,那麼也許咱們不能說這個密鑰就是非法的,它只是不知足E * D ≡ 1 % φ(N)這一個條件罷了,其餘的徹底沒有影響啊!
最後要說的是我提到的檢測軟件爲何會獲得這麼一組非法私鑰的緣由(我驗證得知,該工具給出的私鑰所有都是非法的,不知道爲何還用了不少年),可能性有兩個:
1、
如上所述,在計算φ(N)的時候錯誤的使用了最小公倍數的算法((P - 1)和(Q - 1)都約掉2的時候,計算出來的並非最小公倍數),致使計算獲得的並非指望的φ(N),因此會致使後面私鑰的計算非法。
2、
DP = D % (P - 1)
DQ = D % (Q - 1)
則,在補全祕鑰的時候,沒有考慮到(P - 1)和(Q - 1)實際並不互素,卻強制使用了中國剩餘定理,致使計算出非法私鑰,固然了這個本質上跟可能性一是同樣的。
就此,問題解決。
==============================2017.01.23晨更新==============================
很是感謝評論區@Mike_Dog的評論,使用他的方法,已經能夠求解出下面文章中的非法私鑰,且能夠求出來不止一個。
如今手機碼字不是很方便,等我分析一下,晚上作更新!
==============================2017.01.22更新==============================
很是感謝你們的關注和編輯的推薦!
按照我以前的猜想,結合你們的回覆,我目前的主要驗證點集中在驗證P和Q兩個大數是否肯定是素數上。
如以前的原文中所說,這兩個數我進行了屢次Robin-Miller素數檢測,且以前的重複次數爲5次,如今我將重複次數增長到20次,檢測結果依然是素數。
不過這個檢測方式和費馬檢測同樣,都是機率性檢測,儘管20次重複,P和Q確實是素數的機率已經很是很是高了,可是仍然有極低的機率可能不是素數。
若是這個猜測成立的話,那麼想必這兩個數中應該至少有一個是卡邁克爾數(Carmichael Number),那麼就不得不考慮一個100%可以確認的方式進行素性檢測了。
我前天使用了窮舉的方式嘗試暴力檢測,使用P對2~sqrt(P)依次取餘,看是否有可以除盡的因子。可是我沒有考慮該方式的時間複雜度,兩天兩夜的時間只計算到0x1C09AC7F75。
這個方式已經就此打住了,由於個人電腦風扇要像瘋狗同樣算幾輩子才能獲得我想要的結果。。。
如今在考慮的是印度的Manindra Agrawal教授和他的兩個學生Neeraj Kayal和Nitin Saxena共同開發的AKS素數檢測算法,能夠保證100%的確認。
這個算法很是新穎,很是有趣,可是原理理解起來有些困難。
但願我能儘快理解並實現該算法,得出相應的結論。
針對該算法,若是有大牛比較熟悉,也但願能指點一下,多謝!
==============================如下是原文==============================
筆者從事各類數據加解密算法相關的工做若干年,今天要說的是基於大數分解難題的RSA算法,可能有些囉嗦。
事情的原由是這樣的,我最近針對一款芯片進行RSA CRT解密的性能優化。由於指望值是1024bits長度能作到20ms左右,但個人實現結果接近40ms。爲了找到更加快速的實現方式,我在各大論壇查找不基於Jebelean和Montgomery的模乘實現。在查找過程當中很是偶然的得到了一組密鑰數據,如今按照通常生成密鑰的順序,先對該組數據簡單說明一下,證實其正確性。
1. 密鑰產生過程
選取兩個512bits的大素數
P =
E3DB3B70833CFAC57472BE9234AECC4E0EECFD909015F199BDD109F05F89CE72B2CDAE24BD4D7923C1472DC719F9B987649C96675685D9F4EEDDA9EAE5C853EF
Q =
D534A891DB7899D60A917379105B9EE4589CB32046F850489539938C2EA8DF77A55BB21FA7B4FC30B2CAB67DF530918BB1267530F6A2E0C82765C5C96F27A21D
這兩個數據,我使用Robin-Miller素數檢測算法通過很是屢次的驗證,能夠認定是素數(Robin-Miller素數檢測是機率性檢測,但可經過重複次數將機率變得極高)。
選取公鑰E =
03
而後是歐拉定理
計算φ(N) = (p - 1)(q - ) =
BDC447066192C96D3A4F6200885903E335A46BA0F989618F7158343F94BDC9BBEEB08CE1550C4D82655529D436B4FAAA790CB6CB463F43A62A9C78DE1B43B9600E99F4F9B78352EEC1D2E4E005AAF2C577872A5E153A90427CBB408BA658C28F8C075E205F6597814F76C3F9E4514C3E86F56409237B816813F624E0E247CA08
計算模數N = P * Q =
BDC447066192C96D3A4F6200885903E335A46BA0F989618F7158343F94BDC9BBEEB08CE1550C4D82655529D436B4FAAA790CB6CB463F43A62A9C78DE1B43B961C7A9D8FC1638E78A40D716EB4AB55DF7DF10DB0EEC48D224CFC5DE08348B7079E430BE64C4680CD5C388A83EF37B97519CB86FA170A43C252A3994953737C013
至此,就能夠獲得ND模式下的私鑰D,D知足條件: E * D ≡ 1 % φ(N) ,則計算出私鑰爲D =
7E82DA04410C8648D18A4155B03B57ECCE6D9D15FBB0EBB4F63ACD7FB87E867D49CB089638B2DE56EE38C68D79CDFC71A60879DCD97F826EC712FB3EBCD7D0EAB466A35125023749D68C9895591CA1D8FA5A1C3EB8D1B581A87CD5B26EE5D70A5D5A3EC03F990FAB8A4F2D5142E0DD7F04A3980617A7AB9AB7F96DEB4185315B
下面隨機選取一組數據做爲密文,使用該私鑰D對密文進行解密,密文cipher =
906BEA0B6BE3FBEFC0B4CA426B190424E955AD292AABF8D478A18261BCE7405932452D2CB9A7A8F17D5AAC920825CA5733FEEA5B2D1476BD4BBC16A83420082784DAEBD39FD2158E7264F49B4BC409DDDD1B0B5717F65D89264762D6F50A8C44C140429A4C84FD0FE620594A81674D6C47955BF7B090BFE352F59353BD3E470A
解密獲得的明文爲:plain = (cipher ^ D) % N =
75E796210F8064F78AB974858AD14FBB2ADEF2FF6316438BEA2E028E34EF602BF3D749536F73DE0E987F54468A1EB7B5F4FE77C472A282031B6286AAAD4D8444A4BED7F011C11CF1E2781AE9B7966B07317056ADAE4D13E83D8EA7486ED56FA8B1506D7FF2591FF94525193C2079052C18D584C7699CE64B1A16397D4696AA04
若是進一步使用該數據補全CRT模式下的5元子,過程以下:
DP = D % (P - 1) =
97E77CF5ACD351D8F84C7F0C231F32DEB49DFE60600EA111293606A03FB1344C7733C96DD388FB6D2B84C92F66A67BAF98686444E4593BF89F3E714743DAE29F
DQ = D % (Q - 1) =
8E231B0BE7A5BBE4070BA250B59269ED9068776AD9FAE030637BB7B2C9C5EA4FC39276BFC52352CB21DC79A94E206107CB6EF8CB4F1740856F992E864A1A6C13
QINV = (P ^ (-1)) % Q =
BD245407D1E2BF05D5AA4D7CFC55907B4FA03E8521BDC4C2BABC09AAF74FB4DA9A9238E115F1A3392AE97A546FDD1A4F6A23CE0A7B6106E2628503ED99D053E5
至此密鑰數據計算以及隨機選取的密文解密計算結束。
2. 發現問題
直到這裏,整個計算過程徹底沒有問題。
我平時驗證數據喜歡使用本身作的驗證工具,可是這時我隨手拿起公司的算法驗證工具進行密鑰補全操做,輸入以上的P、Q、E長度指定爲1024,而後計算出來的私鑰爲
D' =
1FA0B68110432192346290556C0ED5FB339B67457EEC3AED3D8EB35FEE1FA19F5272C2258E2CB795BB8E31A35E737F1C69821E77365FE09BB1C4BECFAF35F43AAD19A8D449408DD275A32625564728763E96870FAE346D606A1F356C9BB975C297568FB00FE643EAE293CB5450B8375FC128E60185E9EAE6ADFE5B7AD0614C57
與我經過標準計算流程獲得的結果不一致。
固然了,通過計算能夠知道這個私鑰確定不知足E * D' ≡ 1 % φ(N)d的條件,也就是說,這是一個非法私鑰。
本着找茬的精神,我想找到公司的工具哪裏出了問題,而後開始分析這組數據。
既然私鑰D'不合法,那我想看看它對密文解密能加出什麼鬼來,因而我仍然使用上面的cipher做爲密文,進行解密操做 plain' = (cipher ^ D') % N =
75E796210F8064F78AB974858AD14FBB2ADEF2FF6316438BEA2E028E34EF602BF3D749536F73DE0E987F54468A1EB7B5F4FE77C472A282031B6286AAAD4D8444A4BED7F011C11CF1E2781AE9B7966B07317056ADAE4D13E83D8EA7486ED56FA8B1506D7FF2591FF94525193C2079052C18D584C7699CE64B1A16397D4696AA04
到這裏,問題就比較明顯了。使用合法私鑰D獲得明文plain,使用非法密鑰D'獲得明文plain'
plain 與 plain' 徹底相等。
我認爲,RSA做爲一個非對稱算法,必然應該是公鑰私鑰一對一的,可是這組數據明顯是一個公鑰對應了兩個私鑰。儘管其中一組不合法,可是我嘗試了幾組數據後,發現解密所得明文均相等。
既然如此,我嘗試着使用這個非法的D'進行5元子的補齊:
DP' = D' % (P - 1) =
97E77CF5ACD351D8F84C7F0C231F32DEB49DFE60600EA111293606A03FB1344C7733C96DD388FB6D2B84C92F66A67BAF98686444E4593BF89F3E714743DAE29F
DQ' = D' % (Q - 1) =
8E231B0BE7A5BBE4070BA250B59269ED9068776AD9FAE030637BB7B2C9C5EA4FC39276BFC52352CB21DC79A94E206107CB6EF8CB4F1740856F992E864A1A6C13
接下來的QINV'就不須要計算了,由於已經知足:
DP = DP'
DQ = DQ'
我仍不死心,認爲兩個私鑰之間可能相差了若干個φ(N)致使能夠計算出相同的結果,可是實際上兩個私鑰均小於φ(N),則二者的差絕無多是φ(N)的倍數,且兩個私鑰均在N域之內。
3. 疑問
說到這裏,便有了一個很大的問題,雖然不能從嚴格意義上說,這裏發生了一個公鑰對應兩個私鑰的狀況,可是使用這個非法的私鑰確確實實完成了合法私鑰所能作的解密過程。
也就是說別人根本不須要知道個人私鑰,而使用另一組數據就能夠完成簽名,且這個簽名使用個人公鑰是徹底能夠經過延籤的!!!!!!
這個問題我會持續的跟進,可是公司的工具我可能沒法獲得源碼,因此仍是有很大難度的。
發到這裏,主要是想說清楚這個通過,以避免有關RSA有一些比較特殊的狀況,或者個人職業生涯中不曾涉獵的部分,固然也不排除計算過程當中有什麼失誤的地方,歡迎你們使用數據進行驗證,筆者整個驗證均使用的OpenSSL庫。
目前的計劃是:拋開Robin-Miller素數檢測算法,研究一下能夠100%肯定素數的算法,實在不行就窮舉,先確認P 和 Q 確實是素數。其餘可行的方案,也但願有相關知識的大牛指點一二,不吝賜教,小可不勝感激。
本人郵箱:heshuchao@hotmail.com