RSA加/解密算法——gmp大数库C++实现
2014-06-01 15:13
761 查看
gmp库c++接口的资料,网络上相对较少,说几乎没有更准确些,很多人想学习也没有资料,今天小生给出一个RSA 的gmpxx实现,写的不好,忘批评指正。
gmpxx.h对的接口很少,很多函数没有封装,所以代码会有些长,有时间自己封装再上传来,废话不多说,上代码。
运行示例:
输入大数比特数:333
公钥:(41609, 5235823573856100980829702379838171035594853361913386143766165746731918525312184303057207029921017173)
私钥:(-306028093239876891667135383877681077617022359974356478226302709483221421363577335727905690995297351, 5235823573856100980829702379838171035594853361913386143766165746731918525312184303057207029921017173)
输入加密数据:80314089383470138971034897103489712
加密后:2922069171265461071579916047307650461183647307395702969588502175499709109402891385825418176112070352
解密后:80314089383470138971034897103489712
加/解密成功!
是否继续(Y/N):Y
输入大数比特数:8192
公钥:(8861, 20768313644402333468739937569235425317009889033113404505715377291233882121068441738784907332055369449286603207095905686149833043403118623789039547740303913302883267708475513143015548298767106982750871952229838538731623539265403932992993696581379543401320442198569099073902629997243843095281474227625256299395255314457103387441188644906830993965213593341956713662455351145711084855464623993900472857472715209765097545877113232153784880985547084506518063011291726059235856552025031133343000351755772739286030529733598124506008184325486114688065499203151876347510202982849422752151310559754721228729954272527905190738238496251905506524782143567235919273974481262556917590582782165412307124147280545138792332605090715041347158453244215799595365763654880181843015804203895486478046556976089485553707772607436923736258015171319766344393502746014576094955328055560757969491960077350189252286987226317628793701484208599934242334926022479213143012471045548461568952678886386065641803958766181484426246758397693920840173213473694044500987779760748075272519424489853200861514942618708394058473934227306856385691232233504917708938442808907477727453923337827014599636857209051281788399099163795559090689930077158936877746768781688459059551902027795302530545306881105669182670135178405535309189349206413391989799958332191571988508118279874587420772160378815647646709268112145963441213609549292164003314643222728433133150607617810412801913145129450570261909827535609151363279446643899211818719057252875627696681350602017038478560293910575346201484398718352875346340168098278736575421589868977173849103985404965459599692822750629790268287461023174930591215299034952323295136221599973232223010174971914516239673182448164801247736142854929802041964942062904411659203652212701133122945175369704902191539064379535841397709055050365192656465810471054571254712326813796094863481090977999444178919399574795129594702791182332977931977711604115407446710563215091814101657971301520646997256886122504712483567120042430891578540160202042507914753604115512211009777892708048607793696112782565847766723880412045760840550646768113874619866402976678494899921348383873322385761195112384814822596113416058519334536161853763535190536962965593441524790004286884224735457108647801713684194565638498574763113268281579622994829655224313984601978391062398199431063330217332177469647905406251375628326251805035126448519813705184161933787407657599563993534122459530218449590603496280237367770583519440988813)
私钥:(7087617702366849837430264215028543748858808761554557637431813669866974329546435821925918042222710440654857024969870081809851610794609041681306352823234288887023925239863441117760864242802362206956171626627133702869250601821304761694031479343425317599096379326088811149924563041605392339479875642065091417376283948867879544478293021351795161466065444787955885578971333017112100282465299961353688062408022886167436517180046316897985044588680101969045324742822049385298412167173422203727483699775359075002929276821397215721269467261061958110451424172252711214859593027890379686548421524963127976038752028001849147589711456118469952796630312848134682302730936839856914433350900944386278833474932441992970095226023510019753279219344375192187832758073846932614070623170362256078277032873907527854013351130221110188290738954753523690943003307070091198639534142875040300162925998635252488310106012005925908154078348584381125022098667416447415017459930226672811704423987409035379845973514155604210018078929536893874357724584635006271412599706184649545660618401683340413635163805323799078301001817331670659105099455379626582984973598254848510080201351268354830075821713144236105193417884134721892590717588683966269981517751475668682551061023566655187607581653339352673614968693508255110505050968637689590824186859823184173801873183645542271742433520671591750933391185370859916597532841522369742447690456531074694992857551091799795979175597535420738867352359218255726847329387300968514183040532182085827515106547278332479164239759318012991932851395778872490957245929291721806802720448869904632152972278757532398221454447021433723741361790885875176018310010034751792512675741148851918271223069705752918199728613454760237581709490365565844154640425302121584624996394636607932357398589990174519972148148941222349995021940157306386756468834348285077069862858819218729274241045928625252121563826217274803617297518048267604926458433320625910839831395538388544471070739999531043360411047703565645002850632061204727361342542440625637290168921811325767847076407716151139615015243903620713595822558028776443726528676560860360933763780268733940130830324366142790902212436747920544458555108784435623312783215874276199891843180517408406058452060368783442948872189063338552701878045780893417626765137428746692468039339088026118993321423428970869753584637011772782003407819596601699330542162822072894046739278316631961758208854904005739877806837317483595571256054085289452567953236853578101,
20768313644402333468739937569235425317009889033113404505715377291233882121068441738784907332055369449286603207095905686149833043403118623789039547740303913302883267708475513143015548298767106982750871952229838538731623539265403932992993696581379543401320442198569099073902629997243843095281474227625256299395255314457103387441188644906830993965213593341956713662455351145711084855464623993900472857472715209765097545877113232153784880985547084506518063011291726059235856552025031133343000351755772739286030529733598124506008184325486114688065499203151876347510202982849422752151310559754721228729954272527905190738238496251905506524782143567235919273974481262556917590582782165412307124147280545138792332605090715041347158453244215799595365763654880181843015804203895486478046556976089485553707772607436923736258015171319766344393502746014576094955328055560757969491960077350189252286987226317628793701484208599934242334926022479213143012471045548461568952678886386065641803958766181484426246758397693920840173213473694044500987779760748075272519424489853200861514942618708394058473934227306856385691232233504917708938442808907477727453923337827014599636857209051281788399099163795559090689930077158936877746768781688459059551902027795302530545306881105669182670135178405535309189349206413391989799958332191571988508118279874587420772160378815647646709268112145963441213609549292164003314643222728433133150607617810412801913145129450570261909827535609151363279446643899211818719057252875627696681350602017038478560293910575346201484398718352875346340168098278736575421589868977173849103985404965459599692822750629790268287461023174930591215299034952323295136221599973232223010174971914516239673182448164801247736142854929802041964942062904411659203652212701133122945175369704902191539064379535841397709055050365192656465810471054571254712326813796094863481090977999444178919399574795129594702791182332977931977711604115407446710563215091814101657971301520646997256886122504712483567120042430891578540160202042507914753604115512211009777892708048607793696112782565847766723880412045760840550646768113874619866402976678494899921348383873322385761195112384814822596113416058519334536161853763535190536962965593441524790004286884224735457108647801713684194565638498574763113268281579622994829655224313984601978391062398199431063330217332177469647905406251375628326251805035126448519813705184161933787407657599563993534122459530218449590603496280237367770583519440988813)
输入加密数据:809157849571895718571845718947589135708589179057894157089570839457018570189345701348957019834570193845710895701834570183457018934570189357018345701489571893457109457013894750189345701893457018934751903457019847555554997
加密后:9499877782650316751961587148715735686625807927209130710099865378874932112742498563041358191345395022577763277875970041062153326857757356396242519973497930431446880040066587537739020235344178577041487403871065461995930342876582482466177408550498545414074967825857744132249088518733237708735564331029459796038660414704731842177926691679694362051300419492349643136279450513088734777077826300437191554784374162856083674797806273520279190634593814592829248328064880957854675497168745089481821356865349063626418663210443816622276129885441214154118437022220422113779532840299636350716048641222462939609610684233301162607960694873294778745193643667467587230233316027806081670314626977383360202060565136847879490234086064813945560793510044852078503343935080972381003312202452787360527899916273653394528312383340294889834206974528542508543521394013892567498458381703297481643256509938034894038039343990733666667094465656842558486880196299359275082475102236109819955973687644285981669094208938672119836488792574537789422513777347085721282658396073491659713488610515409587491401261800569158004478912283510712859596681323896581629306608716309024717281518493016230440590148548657388687629995486512945124427399871705247963112386566374727221948491068337110799203802875654069383348625605450422000433831288195060431751995689831950965527101864858259497330404001342030457068533300786984366252015342387876992161848113719090208937611076407895886473217634652620358114314099383987971111820763959396499788389384196212795369962343855785299626144835278221070748059447413150330110348044198195535456457363674011477697546745753520542893076904674912900917607545929268449428115971217515261182157516222941489804038345773297721781675773860114621366593788695789713492635611367624246824040126703604005636881561357439245493814597538309278715907272106849994631189639681690530310742047740339073512813070365276028228212927144215417960339277814210875846785064830493381025793109335372118196103337006004870064481172248130988779490212514117012169622726761280491235986393992903126732044307380891658379245827472869333866667499593909849033974305030297323991403335917164536728806589454704325838036090326801447289795815153623158812602524938715859840887828566507505126269535685092134054073420115471123357538278772186108073396960640744569585567985140406379740396371768303323105561720111200966321785156668371828498819456662007187775946943624403362026990483505959839030828826100250409404533979789966487851563791419073
解密后:809157849571895718571845718947589135708589179057894157089570839457018570189345701348957019834570193845710895701834570183457018934570189357018345701489571893457109457013894750189345701893457018934751903457019847555554997
加/解密成功!
是否继续(Y/N):Y
输入大数比特数:64
公钥:(41609, 6417188530507974259)
私钥:(2288250766673447009, 6417188530507974259)
输入加密数据:13213213432555
加密后:4892539868815503876
解密后:13213213432555
加/解密成功!
是否继续(Y/N):
gmpxx.h对的接口很少,很多函数没有封装,所以代码会有些长,有时间自己封装再上传来,废话不多说,上代码。
#include <iostream> #include <gmpxx.h> #include <cstdlib> using namespace std; mpz_class randbits(int bits) //base = 2 { gmp_randclass a(gmp_randinit_default); a.seed(rand()); mpz_class l(bits); return a.get_z_bits(l); } inline mpz_class randprime(int bits) { mpz_class a = randbits(bits); mpz_class ret; mpz_nextprime(ret.get_mpz_t(),a.get_mpz_t()); return ret; } void setKey(mpz_class &n, mpz_class &e, mpz_class &d,const int nbits,int ebits=16) { if(nbits/2<=ebits) { ebits = nbits/2; } mpz_class p = randprime(nbits/2); mpz_class q = randprime(nbits/2); n = q*p; mpz_class fn = (p-1)*(q-1); mpz_class gcd; do{ e = randprime(ebits); mpz_gcd(gcd.get_mpz_t(),e.get_mpz_t(),fn.get_mpz_t()); }while(gcd!=1); mpz_gcdext(p.get_mpz_t(),d.get_mpz_t(),q.get_mpz_t(),e.get_mpz_t(),fn.get_mpz_t()); } inline mpz_class encrypt(const mpz_class &m,const mpz_class &e,const mpz_class &n) { mpz_class ret; mpz_powm(ret.get_mpz_t(),m.get_mpz_t(),e.get_mpz_t(),n.get_mpz_t()); return ret; } inline mpz_class decrypt(const mpz_class &c,const mpz_class &d,const mpz_class &n) { return encrypt(c,d,n); } int main() { int nbits; cout<<"输入大数比特数:"; cin>>nbits; mpz_class n,e,d; setKey(n,e,d,nbits); cout<<"公钥:("<<e.get_str()<<", "<<n.get_str()<<")"<<endl; cout<<"私钥:("<<d.get_str()<<", "<<n.get_str()<<")"<<endl; cout<<"输入加密数据:"; string s; cin>>s; mpz_class m(s); mpz_class c; c = encrypt(m,e,n); cout<<"加密后:"<<c.get_str()<<endl; c = decrypt(c,d,n); cout<<"解密后:"<<c.get_str()<<endl; if (c==m) cout<<"加/解密成功!"<<endl<<endl; else cout<<"加/解密失败!"<<endl<<endl; string q; cout<<"是否继续(Y/N):"; cin>>q; if(q=="y"||q=="Y") main(); return 0; }
运行示例:
输入大数比特数:333
公钥:(41609, 5235823573856100980829702379838171035594853361913386143766165746731918525312184303057207029921017173)
私钥:(-306028093239876891667135383877681077617022359974356478226302709483221421363577335727905690995297351, 5235823573856100980829702379838171035594853361913386143766165746731918525312184303057207029921017173)
输入加密数据:80314089383470138971034897103489712
加密后:2922069171265461071579916047307650461183647307395702969588502175499709109402891385825418176112070352
解密后:80314089383470138971034897103489712
加/解密成功!
是否继续(Y/N):Y
输入大数比特数:8192
公钥:(8861, 20768313644402333468739937569235425317009889033113404505715377291233882121068441738784907332055369449286603207095905686149833043403118623789039547740303913302883267708475513143015548298767106982750871952229838538731623539265403932992993696581379543401320442198569099073902629997243843095281474227625256299395255314457103387441188644906830993965213593341956713662455351145711084855464623993900472857472715209765097545877113232153784880985547084506518063011291726059235856552025031133343000351755772739286030529733598124506008184325486114688065499203151876347510202982849422752151310559754721228729954272527905190738238496251905506524782143567235919273974481262556917590582782165412307124147280545138792332605090715041347158453244215799595365763654880181843015804203895486478046556976089485553707772607436923736258015171319766344393502746014576094955328055560757969491960077350189252286987226317628793701484208599934242334926022479213143012471045548461568952678886386065641803958766181484426246758397693920840173213473694044500987779760748075272519424489853200861514942618708394058473934227306856385691232233504917708938442808907477727453923337827014599636857209051281788399099163795559090689930077158936877746768781688459059551902027795302530545306881105669182670135178405535309189349206413391989799958332191571988508118279874587420772160378815647646709268112145963441213609549292164003314643222728433133150607617810412801913145129450570261909827535609151363279446643899211818719057252875627696681350602017038478560293910575346201484398718352875346340168098278736575421589868977173849103985404965459599692822750629790268287461023174930591215299034952323295136221599973232223010174971914516239673182448164801247736142854929802041964942062904411659203652212701133122945175369704902191539064379535841397709055050365192656465810471054571254712326813796094863481090977999444178919399574795129594702791182332977931977711604115407446710563215091814101657971301520646997256886122504712483567120042430891578540160202042507914753604115512211009777892708048607793696112782565847766723880412045760840550646768113874619866402976678494899921348383873322385761195112384814822596113416058519334536161853763535190536962965593441524790004286884224735457108647801713684194565638498574763113268281579622994829655224313984601978391062398199431063330217332177469647905406251375628326251805035126448519813705184161933787407657599563993534122459530218449590603496280237367770583519440988813)
私钥:(7087617702366849837430264215028543748858808761554557637431813669866974329546435821925918042222710440654857024969870081809851610794609041681306352823234288887023925239863441117760864242802362206956171626627133702869250601821304761694031479343425317599096379326088811149924563041605392339479875642065091417376283948867879544478293021351795161466065444787955885578971333017112100282465299961353688062408022886167436517180046316897985044588680101969045324742822049385298412167173422203727483699775359075002929276821397215721269467261061958110451424172252711214859593027890379686548421524963127976038752028001849147589711456118469952796630312848134682302730936839856914433350900944386278833474932441992970095226023510019753279219344375192187832758073846932614070623170362256078277032873907527854013351130221110188290738954753523690943003307070091198639534142875040300162925998635252488310106012005925908154078348584381125022098667416447415017459930226672811704423987409035379845973514155604210018078929536893874357724584635006271412599706184649545660618401683340413635163805323799078301001817331670659105099455379626582984973598254848510080201351268354830075821713144236105193417884134721892590717588683966269981517751475668682551061023566655187607581653339352673614968693508255110505050968637689590824186859823184173801873183645542271742433520671591750933391185370859916597532841522369742447690456531074694992857551091799795979175597535420738867352359218255726847329387300968514183040532182085827515106547278332479164239759318012991932851395778872490957245929291721806802720448869904632152972278757532398221454447021433723741361790885875176018310010034751792512675741148851918271223069705752918199728613454760237581709490365565844154640425302121584624996394636607932357398589990174519972148148941222349995021940157306386756468834348285077069862858819218729274241045928625252121563826217274803617297518048267604926458433320625910839831395538388544471070739999531043360411047703565645002850632061204727361342542440625637290168921811325767847076407716151139615015243903620713595822558028776443726528676560860360933763780268733940130830324366142790902212436747920544458555108784435623312783215874276199891843180517408406058452060368783442948872189063338552701878045780893417626765137428746692468039339088026118993321423428970869753584637011772782003407819596601699330542162822072894046739278316631961758208854904005739877806837317483595571256054085289452567953236853578101,
20768313644402333468739937569235425317009889033113404505715377291233882121068441738784907332055369449286603207095905686149833043403118623789039547740303913302883267708475513143015548298767106982750871952229838538731623539265403932992993696581379543401320442198569099073902629997243843095281474227625256299395255314457103387441188644906830993965213593341956713662455351145711084855464623993900472857472715209765097545877113232153784880985547084506518063011291726059235856552025031133343000351755772739286030529733598124506008184325486114688065499203151876347510202982849422752151310559754721228729954272527905190738238496251905506524782143567235919273974481262556917590582782165412307124147280545138792332605090715041347158453244215799595365763654880181843015804203895486478046556976089485553707772607436923736258015171319766344393502746014576094955328055560757969491960077350189252286987226317628793701484208599934242334926022479213143012471045548461568952678886386065641803958766181484426246758397693920840173213473694044500987779760748075272519424489853200861514942618708394058473934227306856385691232233504917708938442808907477727453923337827014599636857209051281788399099163795559090689930077158936877746768781688459059551902027795302530545306881105669182670135178405535309189349206413391989799958332191571988508118279874587420772160378815647646709268112145963441213609549292164003314643222728433133150607617810412801913145129450570261909827535609151363279446643899211818719057252875627696681350602017038478560293910575346201484398718352875346340168098278736575421589868977173849103985404965459599692822750629790268287461023174930591215299034952323295136221599973232223010174971914516239673182448164801247736142854929802041964942062904411659203652212701133122945175369704902191539064379535841397709055050365192656465810471054571254712326813796094863481090977999444178919399574795129594702791182332977931977711604115407446710563215091814101657971301520646997256886122504712483567120042430891578540160202042507914753604115512211009777892708048607793696112782565847766723880412045760840550646768113874619866402976678494899921348383873322385761195112384814822596113416058519334536161853763535190536962965593441524790004286884224735457108647801713684194565638498574763113268281579622994829655224313984601978391062398199431063330217332177469647905406251375628326251805035126448519813705184161933787407657599563993534122459530218449590603496280237367770583519440988813)
输入加密数据:809157849571895718571845718947589135708589179057894157089570839457018570189345701348957019834570193845710895701834570183457018934570189357018345701489571893457109457013894750189345701893457018934751903457019847555554997
加密后:9499877782650316751961587148715735686625807927209130710099865378874932112742498563041358191345395022577763277875970041062153326857757356396242519973497930431446880040066587537739020235344178577041487403871065461995930342876582482466177408550498545414074967825857744132249088518733237708735564331029459796038660414704731842177926691679694362051300419492349643136279450513088734777077826300437191554784374162856083674797806273520279190634593814592829248328064880957854675497168745089481821356865349063626418663210443816622276129885441214154118437022220422113779532840299636350716048641222462939609610684233301162607960694873294778745193643667467587230233316027806081670314626977383360202060565136847879490234086064813945560793510044852078503343935080972381003312202452787360527899916273653394528312383340294889834206974528542508543521394013892567498458381703297481643256509938034894038039343990733666667094465656842558486880196299359275082475102236109819955973687644285981669094208938672119836488792574537789422513777347085721282658396073491659713488610515409587491401261800569158004478912283510712859596681323896581629306608716309024717281518493016230440590148548657388687629995486512945124427399871705247963112386566374727221948491068337110799203802875654069383348625605450422000433831288195060431751995689831950965527101864858259497330404001342030457068533300786984366252015342387876992161848113719090208937611076407895886473217634652620358114314099383987971111820763959396499788389384196212795369962343855785299626144835278221070748059447413150330110348044198195535456457363674011477697546745753520542893076904674912900917607545929268449428115971217515261182157516222941489804038345773297721781675773860114621366593788695789713492635611367624246824040126703604005636881561357439245493814597538309278715907272106849994631189639681690530310742047740339073512813070365276028228212927144215417960339277814210875846785064830493381025793109335372118196103337006004870064481172248130988779490212514117012169622726761280491235986393992903126732044307380891658379245827472869333866667499593909849033974305030297323991403335917164536728806589454704325838036090326801447289795815153623158812602524938715859840887828566507505126269535685092134054073420115471123357538278772186108073396960640744569585567985140406379740396371768303323105561720111200966321785156668371828498819456662007187775946943624403362026990483505959839030828826100250409404533979789966487851563791419073
解密后:809157849571895718571845718947589135708589179057894157089570839457018570189345701348957019834570193845710895701834570183457018934570189357018345701489571893457109457013894750189345701893457018934751903457019847555554997
加/解密成功!
是否继续(Y/N):Y
输入大数比特数:64
公钥:(41609, 6417188530507974259)
私钥:(2288250766673447009, 6417188530507974259)
输入加密数据:13213213432555
加密后:4892539868815503876
解密后:13213213432555
加/解密成功!
是否继续(Y/N):
相关文章推荐
- RSA加/解密算法--miracl大数库实现
- 【密码学】AES加解密原理及其C++实现算法
- C++实现大数乘法算法代码
- 算法:C++实现大数相乘
- C++实现的大数相乘算法示例
- c++实现加密和解密算法以及JNI技术的应用实例
- C++实现的O(n)复杂度内查找第K大数算法示例
- DES 加密解密算法的C++实现
- 算法:C++实现O(n)复杂度内查找第K大数
- 内存管理:算法及其c/c++实现 翻译五
- 单源最短路 Dijkstra 算法 C++高效实现
- 跨语言平台的RSA加密、解密、签名、验证算法的实现
- 用C++实现warshall的算法
- 数据结构复习:几种排序算法的C++实现和二叉树的相关算法实现
- 动态聚类中 C-均值算法 (K-均值算法)的C++实现
- C++实现的农历算法
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- 内存管理:算法及其c/c++实现 翻译七