**********************************************************************
                     CnPack For Delphi/C++Builder
                     йԼѵ
                 (C)Copyright 2001-2024 CnPack 
**********************************************************************

                        CnRSA㷨ʵ˵
                           Revision 1.0.1.0
                       =========================
                        ߣХ 2024.11.02


======================================================================
1. CnRSA 
======================================================================

    CnRSA  CnPack Դеһ֣Դ Delphi ʵֵĹ̿õ RSA 㷨ִ֧ Delphi 5 °а汾 Delphi OpenSSLΪ˸ûһʹ˵ԼʹûڷʱͨĶ CnRSA Ĵ⣬ｫ RSA 㷨˵Լ CnRSA ʵֻġ

======================================================================
2. RSA 㷨˵
======================================================================

    RSA 㷨ɵ¡ά˹أRon RivestϡĪAdi Shamirɵ¡Leonard Adleman 1977 깲ͬһַǶԳƼ㷨ĿǰڹԿܺ͵ҵб㷺ʹáRSA Ϊĸ
    νǶԳƼ㷨ָʱʹõԿܹͬԳƼ㷨ٵԿʱй¶Σա

----------------------------------------------------------------------
2.1 򵥵ķʽ RSA ӽ
----------------------------------------------------------------------

    ͨ׵㷨˽ RSA 㷨

  * ѡǵĻһ
  * һĻ
  * һͻص Eһѡ 65537ʱ 3 ҲУ
  *  DҪ D  D * 65537 mod  = 1

    ˣǵõһԼ򵥵 RSA ˽ԿйԿǻһ 65537˽Կǻһ D
    õ˹˽ԿμӽأҲܼ򵥣

  * ܣԭֵ 65537 ηԻһ
  * ܣֵ D ηԻһ

2.1.1 ʵʹõ RSA һ
-------------------------------

    Բ⣬ǿһַǳСͶʵʹõļ˵

  * 511
  * һ5 * 11 = 55
  * (5 - 1) * (11 - 1) = 40
  * E3
  * DD * 3 mod 40 = 1D = 27

    ǵõԿ 55  3˽Կ 55  27ǵ 2ô

  * ܣ2  27 η 55 = 134217728 mod 55 = 18Ϊ 18
  * ܣ18  3 η 55 = 5832 mod 55 = 2 2

2.1.2 ʵʹõ RSA Ӷ
-------------------------------

    ʵ̫ªˣǻһ΢һ

  * 1504629263146270947
  * һ220083547182922061
  * E65537
  *  D = 122005207634220149

    õԿ 220083547182922061  65537˽Կ 220083547182922061  122005207634220149 12345678987654321

  * ܵõģ99815494076289543
  * ܵõģ12345678987654321

----------------------------------------
2.2 ΪʲôӲͶʵʹã
----------------------------------------

    򵥵ķʽ˵ RSA 㷨ĻƣΪʲô޷ʵӦʹã𰸺ܼ򵥣һӷֽ̫ˣ55 = 5 * 11 һ۾ܿ220083547182922061 = 1504629263 * 146270947 üҲѣǸݹԿܹѸٲµ˽Կľֱܱӽˡ
    ֻеǳʱRSA 㷨ʵӦõ塣ڵѧԭһ仰ʮףҪ˻ӷֽȴѡ
    ΪʾCnPack е CnRSA.pas ԪҲṩ CnInt64RSA ʵܹ࣬ʵ Int64 Χڵ RSA ӽܡ˵ļӽǿ൱ֻΪѧʾʹá

======================================================================
3. RSA 㷨Ĺʵ
======================================================================

    RSA 㷨ҪʵӦʹã˼ĶһѾ¼㣺

----------------------------------------------
3.1 RSA 㷨Ͷʵʹٵı
----------------------------------------------

  * ҪӴǿƽѶȣInt64 ԲҪǳĴ֧֡
  * ܴ׼ȷٵѰң֪ɸڴѰ̫ˡ
  * ӽܵĹ̶Ҫдĸߴ㣬ֱ㼫һܲ
  * ɹ˽Կʱ D ô

    ҵǣϵĵһѧĿǰȫˣֱ

--------------
3.2 
--------------

    вٿԴԲο GMP ⡢JDK е BigInteger ȡCnPack вο OpenSSL е BN_ ⣬ CnBigNumber.pas Ԫʵ TCnBigNumber ࣬ʵ˴ĳ㡢˷Ƚϡλȹܡ
    һ TCnBigNumber һû޵ĴڲһΪ Neg ıһɱ䳤ȵ UInt32 ʾôֵУԽڴλԽĸλUInt32 ڲ CPU ĴСˡ x86 С CPU ϣһ TCnBigNumber Ĵֵϸڸ龭ֽڵ
    UInt32 еÿ UInt32 ԪشеСԪʮÿһλӼ⣬ӦԪؼӼɣҪעλͽλı仯˷ʽ˷ÿԪԷӣֵϴʱ Karatsuba 㷨١ΪӣҪģʽԳּ UInt32 Ԫؼʵ漰 64 λĽλ 32 λƽ̨漰 DIV Ȼָʹϵͳװ _lludiv ෽ЧʽѾʵ 128 λλ 64 λƽ̨Ե͡
    ⣬ڸӵУҪʱɴΪмĽ洢Ƶͷ TCnBigNumber ЧӰϴ CnBigNumber.pas ԪҲṩ˴ TCnBigNumberPool ĻƣпٻȡմЧʡ
     64 λϵͳϣһ TCnBigNumber ĴֵʾԪҲ UInt64 棬ĲȽ UInt32 󣬸Ч 64 λ CPU ûδϸĬδšҪʹãͷҵ {$IFDEF CPU64BITS} Уȡ {$DEFINE BN_DATA_USE_64} עͼɡ

--------------
3.2 ѰҴ
--------------

    RSA ÿһԹ˽Կ벻ѰҲóɸʱ临Ӷ̫޷ܡƩΪ͵İ˹ɸʱ临ӶΪ O(nlog(logn))n һܲˡ
    вѧڴоĿǰЧʽϸߵȷԴж㷨 AKS ȣʱ临Ӷ O(log^12(n))  O(log^6(n))Ȼ
    ѧҷķСһж㷨ĳϷСôһǺСƫƫвٿ˶ڷСж㷨ֻ˵һֲȷĸ㷨ʧܵĸʲ̫ɿء
    ѧ Miller  Rabin ڷжоĿǰΪͨõĸԵ-Miller-RabinԲ㷨㷨һжֶжÿһжͨĻôһĳͨжôǺĸʾͻǳСϿԽΪ
    -Բ㷨ʱ临ӶǶʽģԼ O(klog^3(n))еĸʿͨжƣĿǰͨõĿٴ㷨CnBigNumber.pas Ҳṩ˸㷨ʵ BigNumberIsProbablyPrime Զһ-ԲԣĬ 50 ֡Ѱָȵʱ䳤ȲͽȡΪһ-Բԣûͨ 2 һò˶þҵһ
    ȻRSA 㷨ܹ䵱˽ԿһЩȫҪƩĻҪĿλĲλҪڻλ֮һ NAF ʽҪһȣCnRSA.pas е CnRSAGenerateKeys ӦʵԼ

----------------------
3.2 ɸ
----------------------

    RSA ӽܹҪõòͬҪŻĿǰ͵Ŀ㷨ɸMontgomery㷨㷨ɽתɻ࣬ٽתɺ࣬ڴпֱӼ㣬תĻˡ
    CnBigNumber.pas е BigNumberPowerMod Ǹ㷨Żʵ֣˻ڻ٣ BigNumberPowerPowerMod 㷨ļ㡣

------------------------------
3.3 չŷշת D
------------------------------

    RSA 㷨 D ʵǽһ̡÷̿չŷշתCnBigNumber.pas зֱʵ BigNumberExtendedEuclideanGcd  BigNumberExtendedEuclideanGcd2 ԷֱԪһβ A * X + B * Y = 1  A * X - B * Y = 1 һܵ⡣ A  B Ǵ֪ϵX  Y ǽĽб֤ A  B أ׼ȷ X С 0ټ B ʵʹõҪ

-------------------------
3.4 ʵʹõ RSA 
-------------------------

    һ CnRSA ɲʵֵ 1024Bit  RSA ӣ

  * 111795690727769166502699638182754409621456989841069533832409296669283539752710514527118625192440783910929318385366251930645685151242541471612896690908882923456354611372214569998798084210665759517540352249124683826216519450941427190839581034113979818949296421808888128229002101509923237360815392588526618623329

  * 2
41796933860949200670641741619002242706200884209800427754253948967485500817792149989487462921560747234453728927850855387841283613487237843749810167266874818386701456382226980435208447566858623992216821707365826319661759609660952845848248344717132880325137049426056929895980579645903534795006345618720672323903

  * ˽Կ
493023705192779595210145354685109032381675423245360416178769886612163990284348875671828035231858207098648425646220707837436431132668213677174682529367508918477166322056877775736729813634753876786035741510262055711504159365918297754773269440589944916358958356251028578635995752304389582201751807633999913547105822151847389558292350264276539573157158412151534508675407677679382724637583925191636337580097289205994468084262989724899881442817872960905702688082976843140262209457214252940923560528088923892710365238269097437794268515595342764640130947923874793568727740340900389930404581924472824917092620371109040133087
135809648745674199800551659186875709318192569324938456036671388116779781140475613050696728871335828810471947574518553467342720772053332644369356908352100927800605514626742366684089648985278724043186341173455618837599899126187085606099178070570369036956654640972272440455248658259473963219070530894252108568670123741636034469281039220462078765731342191652521431688864354969945295611074934753899645904014933858251338620621806232860404238483976297099160836127912880292330477076462999501920642080564286548567282027098415191128055260860093628449927525319005051929366532495686583229065742627467952309370633927463816745537

  * Կ
493023705192779595210145354685109032381675423245360416178769886612163990284348875671828035231858207098648425646220707837436431132668213677174682529367508918477166322056877775736729813634753876786035741510262055711504159365918297754773269440589944916358958356251028578635995752304389582201751807633999913547105822151847389558292350264276539573157158412151534508675407677679382724637583925191636337580097289205994468084262989724899881442817872960905702688082976843140262209457214252940923560528088923892710365238269097437794268515595342764640130947923874793568727740340900389930404581924472824917092620371109040133087
65537

     123456789098765432160987654321234567890

    õģ
370761033836692845867876908686801249690501348545326198396750376307045398113322358066839178778435264575616327278764502560461230964491703721106607773979135199442894855382213278795836052552935514091663273554569294373201200736874888350373001927444818995774668351437275863963782001163681323154102543656763841655066052620792911166395441572020624608625297270763670162863103600728965900763109571233491420275859860131675836838619509708151209660156607343765129188413561502687349711359681330652057612549647531874481003031800795322394905021006554579157421282649620031479766125003843382414751938227385246262073569289334870480359

    ܺ 123456789098765432160987654321234567890

======================================================================
4. RSA ľʹ
======================================================================

    ǶԳƼ㷨ҪӦóϣܽܡǩǩ RSA ˣECC Ҳˡ
    ϵ˵УRSA ľֵķʽģԭʼתּλԭⲿֻ漰롣ע RSA ʱ޷ȳ˻ĵĻһʽΪ ModulusλȵݣһЩܹ޳ܵĶԳƼ㷨ͬȻ RSA ҲԽݷֳһ㷨һܣΪ RSA ļЧԶڷԳƼܣַֿƿԽûͨù淶涨Ĺ RFC ĵ淶˵
    ⣬RSA Ĺ˽ԿҲ漰ݡ桢أĿǰ CnPack ʵ PEM ʽļݴøʽʹ BER/DER ʽı뽫˽ԿȹؼϢ洢״ṹУ״ṹɶ Base64 롣 PEM ʽָ֧жԳƼܣԱ˽Կļʧйܡ

--------------
4.1 
--------------

    RSA ӽʹõ PKCS1 ䷽ʽ÷ʽὫһָֽڳȣԭݳ̫ʧܡPKCS1 ֱַͣ Private 00Private FFPublic Random֡RSA ˽Կʱʹ Private FF ͵ PKCS1 䣬Կʱʹ Public Random ͵ PKCS1 䡣ĿĶԭʼǰϡ0͡ݡ0Ĳݴճɵ RSA ˻λȵĹ̶ȣҵһֽ 0 ȷֵȷС Modulusע⹫ԿʱʹݣͬԿͬݼܣÿν᲻ͬ
    
--------------
4.2 
--------------

    CnRSA.pas Ԫʹ TCnRSAPrivateKey  TCnRSAPublicKey һ RSA ˽Կ˽Կͨ CnRSAGenerateKeys ɣͨ CnRSALoadKeysFromPem  OpenSSL ɵԿļ루ֲ֧㷨ܵ PEM ʽҲͨ CnRSASaveKeysToPem  PEM ʽԿļֲָ֧ԳƼ㷨ܣ
    CnRSAEncryptData  CnRSAEncryptFile ֱܹʹù˽ԿļݼܣCnRSADecryptData  CnRSADecryptFile ֱܹʹù˽Կݻļڲʵ RFC 涨ȥ OpenSSL

--------------
4.3 ǩǩ
--------------

    RSA 㷨һ˽ԿǩԿ֤ǩRSA ļǩҲָ֣ Hash 㷨벻ָ Hash 㷨ġָ Hash 㷨ʱRSA ǩĻֱӽԭʼļ Private FF ͵ PKCS1 䣬Ȼ˽Կܣǩļָ Hash 㷨ʱָ Hash 㷨ԭʼļ Hash ֵ BER ʽƴһЩ˵Ϣʹ Hash 㷨ȣ Private FF ͵ PKCS1 䣬Ȼͬ˽Կܣǩļ
    ֤ǩʱùԿǩļܲȥ PKCS1 ݣ֪ Hash 㷨ǩֱӱȶԭʼļļɣԲϾǩʧܡ֪ Hash 㷨ģ BER ʽ⿪ļе Hash 㷨 Hash ֵȻָ Hash 㷨ԭʼļ Hash ֵͽļе Hash ֵԱȣͬǩɹ
     Hash 㷨 RSA ǩ뷽ʽͬ⣬˽Կܣͬ޷ݵ⡣ڹݣָ Hash 㷨 RSA ǩΨһѡHash 㷨ⳤɳȽ϶ҹ̶ժҪֵ RSA ˽Կܡжûԭʼݣ Hash 㷨޷ͬժҪժҪǩ RSA ˽Կ¼ܣֻҪ RSA ˽Կˣ Hash  RSA ǩ֤Ʊû©ĿǰԲǩͬеݷ۸Ļơ
    ǩ֤ǩĹͬ OpenSSL

======================================================================
4. 
======================================================================

    CnRSA ϸӿɼ cnvcl/Example/VCL/RSA Ŀ¼ӵĵڶ Tab Big Number RSA CnRSA ĺݣ˽Կɡ桢Լļļ֤ܽǩʾCnRSA.pas ԴҲжԸԼϸ˵ɹο

======================================================================
5. ϵ
======================================================================

    վhttps://www.cnpack.org
    ̳https://bbs.cnpack.org
    Ա䣺master@cnpack.org
    Դ룺https://github.com/cnpack

