您的位置:首页 > 编程语言 > C语言/C++

RSA加/解密算法——gmp大数库C++实现

2014-06-01 15:13 761 查看
gmp库c++接口的资料,网络上相对较少,说几乎没有更准确些,很多人想学习也没有资料,今天小生给出一个RSA 的gmpxx实现,写的不好,忘批评指正。

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):
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: