-
Notifications
You must be signed in to change notification settings - Fork 38
/
paillier_test.go
502 lines (438 loc) · 44.8 KB
/
paillier_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
package paillier
import (
"crypto/rand"
"math/big"
"testing"
)
func params1024() (*PrivateKey, error) {
N := new(big.Int)
N.SetString("126194739155835722284776424454884204473143558969432048050666085525483743326812572739133951780229568968242666387178716330176115078654756683794062569619072029437454239631056216963495470367201933227657358333279651768209533023678019381169146877239644271394293303796480870611603376632270428546228709474128379959019", 10)
NSquared := new(big.Int)
NSquared.SetString("15925112190609417625492461454892622425530252653601455182093462156969328245964085440205339130085237593554400954214969912476144228411614827951469756330913448660935795192344738398284240062795124639133546845845769387767467781523779528744853227902706640384494261375870702625308175188419621019069372371633881684663188652136757403456143527325953597174437151000929412167803177547239520146931302162313100945730195691895401576064630904427999317995018872667136279172351911902456581292831479061296990759060262215795867270804647859511918522582655516661026038210169389767637801445942762308938597330878175614563235505889720119442361", 10)
G := new(big.Int)
G.SetString("126194739155835722284776424454884204473143558969432048050666085525483743326812572739133951780229568968242666387178716330176115078654756683794062569619072029437454239631056216963495470367201933227657358333279651768209533023678019381169146877239644271394293303796480870611603376632270428546228709474128379959020", 10)
p := new(big.Int)
p.SetString("11417199089782166040604591155607756882824089281848393137705011449158567041080821230419448902775923082897096945349966229057035946462169759501157528722504829", 10)
pp := new(big.Int)
pp.SetString("130352435055722720734086734017119741188192360246029923493079619647991064736201805091117981507487734396525571770952203653592329062396193424951854687073659107060086928173683471562812900736704834312882004064229536161872765526815732756683280779856724286293163716326116967617940615756605985780674661418651928319241", 10)
pminusone := new(big.Int)
pminusone.SetString("11417199089782166040604591155607756882824089281848393137705011449158567041080821230419448902775923082897096945349966229057035946462169759501157528722504828", 10)
q := new(big.Int)
q.SetString("11053038329582413315651358890083978373055815370238049997513401852498911944390423398149497610492121999467828846599283497585229737474442243989848292624287111", 10)
qq := new(big.Int)
qq.SetString("122169656315217985643768096096314231378667305636147905392806896792422692825223345259478433497450253614392323918412554529852266767308205928668670850103561950481658129287539188638679162031370722092153837804642191333149224390850755406017808628099240767422502599164922831158243910613522848876271471663220960726321", 10)
qminusone := new(big.Int)
qminusone.SetString("11053038329582413315651358890083978373055815370238049997513401852498911944390423398149497610492121999467828846599283497585229737474442243989848292624287110", 10)
pinvq := new(big.Int)
pinvq.SetString("9061648216505145434973283043286426678371068863673452162827748634009304767296346711807004486645099525872814989107755825626131214518936422331968552345125756", 10)
hp := new(big.Int)
hp.SetString("9360199312121396517986757562179041663631709957001290887357715158339077566353381490763447937631465071703345144689063419248625791188531067584527857181430493", 10)
hq := new(big.Int)
hq.SetString("1991390113077267880678075846797551694684746506564597834685653218489607177094076686342493123847022473595013857491527671959098522955505821657879740279161355", 10)
n := new(big.Int)
n.SetString("126194739155835722284776424454884204473143558969432048050666085525483743326812572739133951780229568968242666387178716330176115078654756683794062569619072029437454239631056216963495470367201933227657358333279651768209533023678019381169146877239644271394293303796480870611603376632270428546228709474128379959019", 10)
pk := PrivateKey{
PublicKey: PublicKey{
N: N,
NSquared: NSquared,
G: G,
},
p: p,
pp: pp,
pminusone: pminusone,
q: q,
qq: qq,
qminusone: qminusone,
pinvq: pinvq,
hp: hp,
hq: hq,
n: n,
}
return &pk, nil
}
func params2048() (*PrivateKey, error) {
N := new(big.Int)
N.SetString("24200018270481492011294364537584013406693893319178816182446062485217244133471872399991660249002577582598935380321030595486939195042216970545193820187370464524739989841317564869972667065255835467544378654465004468502485976862575950973320331777265422886818214162226779636664326056795744905250752001218128913038722528757052673325711794358276228077331762441454210124553234766599565141066534119710608240681342137973183418251814153602255317603388310015900238370495147691271223848818578240321756446807333749583682843710344675439937251772381044762947283144959525621019205040048487957284673590088263163847597645650295041428749", 10)
NSquared := new(big.Int)
NSquared.SetString("585640884291638023840597170872086744671257791117383643177142029882661558677674783005006066278385728840555613019540865307817977240276861509622853277688919799323234056414740037059566480017229142454402638258592212893147143150571717060556729055594515311777749536947923947762482052132301098067005980007149505804935174274459519325058070263142493106528720198732209674015602564736587439887698935138582084435375369691941058737209326246051029366551837788099619294277645703287976829357101196807617347182043936450840293763709765703972423241884289223305780868101683171102977819207555977314973978832075838554217551968242374588914715548064977875200988842745373446024010086142895984219764343374918593475605829547414858648872334761971611488901517597946327269307455042481408338938909195928243163731404563870875904041143119542568859691628479013307779753680833848457741289592752786851699714659480548341282606529870305146443039163258413185974945671498838668907827422997128525103700779706182964097992120521202511992304183789641203319435552900215022463218181671295796585077974223810598434935980051324148780775203545796108566349914444426917035149664032597354644003381069914527370853591626729354623104820163416188345647469177968509427816299028378251243705001", 10)
G := new(big.Int)
G.SetString("24200018270481492011294364537584013406693893319178816182446062485217244133471872399991660249002577582598935380321030595486939195042216970545193820187370464524739989841317564869972667065255835467544378654465004468502485976862575950973320331777265422886818214162226779636664326056795744905250752001218128913038722528757052673325711794358276228077331762441454210124553234766599565141066534119710608240681342137973183418251814153602255317603388310015900238370495147691271223848818578240321756446807333749583682843710344675439937251772381044762947283144959525621019205040048487957284673590088263163847597645650295041428750", 10)
p := new(big.Int)
p.SetString("170140453264361174406287502741240889587739362622974549539248660582426757947755531489310228550354741702925524947187502195342773407715314030768420062297662610370912590255673547259289676911669832068158704373445144329324907765835870657687649294358573126396429163342151596834832566397857773012466213482020052556683", 10)
pp := new(big.Int)
pp.SetString("28947773837002269008082354062738492050636771265360447321358886690052746583185466677773853083624930369510197895868323948715555891153631208567061685347940190621150165686061523497078669766520317912304261747887011931848233349362651191380869745415931861875614973784518449513302639533796736859342572975985810311544789124320503051512942152309782375291380873176998342472702098065944088149921419081333771061747504378221965193907911577596785726346813088258542108542324526263406604776296308645446779169420155116036804648646379941593631568049104410919839049260973900915705590640217378390612458825007817146940769705441524927962489", 10)
pminusone := new(big.Int)
pminusone.SetString("170140453264361174406287502741240889587739362622974549539248660582426757947755531489310228550354741702925524947187502195342773407715314030768420062297662610370912590255673547259289676911669832068158704373445144329324907765835870657687649294358573126396429163342151596834832566397857773012466213482020052556682", 10)
q := new(big.Int)
q.SetString("142235534266973763906526279588904904846817430995243919523201739109410864572981229511003453607666297545175937814382782230294542205089590911629832370908370311672520957356234666464094719217410200046127416867709294982902838182087441088168138959820171543475677210691456459401842128181904827163277510990666820168903", 10)
qq := new(big.Int)
qq.SetString("20230947208211467817744373539140013294482497573758302458935386477422712346395013405753043212095769244506950208969603318427981605086366208532067074712150292252866810431793539768202874020005898715588672477257530207681782333066783738099406774344916560378157168148830188331747426596868484064161185056331576697081980591946697607377319925216759016789603600241435626237781432084809763637473188930507706157674790141969632778642649941326086282490386403733287286093304510440066763030996823966601916172393848309109208751771531428365605146894330705801695257605041252185781734186650706439840561404146244575271126625595825448223409", 10)
qminusone := new(big.Int)
qminusone.SetString("142235534266973763906526279588904904846817430995243919523201739109410864572981229511003453607666297545175937814382782230294542205089590911629832370908370311672520957356234666464094719217410200046127416867709294982902838182087441088168138959820171543475677210691456459401842128181904827163277510990666820168902", 10)
pinvq := new(big.Int)
pinvq.SetString("130403673737256651994948156133785307879963675726610801020203029094224687469829972785669977887044743047978439716843686057456479004768759140718115886537546249334553772202587632352482993171690199109001870935858458974432512628722265611360423792532513561840135828851832442300628822050305987373045858049281094886091", 10)
hp := new(big.Int)
hp.SetString("155987322516398718409248913860613337098751259316254376435026839973925938957734177738923386017432984785093100581229258322574844640930369608445860932043693092157022896975006627885697824061877334516107991070787514721685822681822381411628334777334380023596264422352454437793342132229041624240837498526461697106184", 10)
hq := new(big.Int)
hq.SetString("11831860529717111911578123455119596966853755268633118502998710015186177103151256725333475720621554497197498097539096172838063200320831770911716484370824062337967185153647034111611726045720000937125545931850836008470325553365175476807715167287657981635541381839624017101213306131598839790231652941385725282812", 10)
n := new(big.Int)
n.SetString("24200018270481492011294364537584013406693893319178816182446062485217244133471872399991660249002577582598935380321030595486939195042216970545193820187370464524739989841317564869972667065255835467544378654465004468502485976862575950973320331777265422886818214162226779636664326056795744905250752001218128913038722528757052673325711794358276228077331762441454210124553234766599565141066534119710608240681342137973183418251814153602255317603388310015900238370495147691271223848818578240321756446807333749583682843710344675439937251772381044762947283144959525621019205040048487957284673590088263163847597645650295041428749", 10)
pk := PrivateKey{
PublicKey: PublicKey{
N: N,
NSquared: NSquared,
G: G,
},
p: p,
pp: pp,
pminusone: pminusone,
q: q,
qq: qq,
qminusone: qminusone,
pinvq: pinvq,
hp: hp,
hq: hq,
n: n,
}
return &pk, nil
}
func params3072() (*PrivateKey, error) {
N := new(big.Int)
N.SetString("5095875443641105131611487207628062619966283476482438280547454879957026805062401379178517794048352418430429585304576861940298028017194573736862889040947900348831715443268170774511635714732967101032918403264492035096763379144748455226195125665527922348150230006379591347841168838702177941465434730819591518968960357598227719884121757785321009343287855957867162715316259455893457305928483192617126347017432556244132340666680092243083833306078968690352220810786127030063628847086251565362611876896330625251403074908843335487409770418167924858932431645971671869892139553246011614522896917566395730528416790779226747574208009365930697121307177334104940008450098629344949303048384536310619406130245550025342485730271674625887464886159489306548384886341132247275347432405388487846640442610757558167750266470446404929344231520284812193454599795823441058973061158401441037267884930748429637171285571201177470804789792773637303333468603", 10)
NSquared := new(big.Int)
NSquared.SetString("25967946537104430042531537145899555499581194087159190640759690752954538168732721605893219865486936681525663553599147975257511495709929255022674321788669588003001217912577261158781447363936585989919815624297873895988708176528197934745184898010720644277914971146125000031269641569572155179745648149165420746181989672465189618920908450136411130138373748414275896407391780181064977309574917899161922366527451863387470756241641794320373275536376434741983713817181204572697006686883202038039374326112935708167195236138937413761149764575292757244673281691573824310247641882954238655304717559847927816173582319573734790156828875383497160841061670263985825837588137892253031688857618571319130060753949671700014354247238386584475994072746268675346132503258014510497312558582176726390185800632037252311894545633755583078751295640211964410432692111569443000276134363778359879645745256762660412498260283698340797190959821071923643049445347867221848716598478310966599340742504336074915966276650592464412350816092436831434409815053761736904999131601917279830139117072584945343685095850305753789343300515698075659947959610095725305376425585592308130880998058223421498913968428693367989750884151179694550734740127231700048559000827352999204501925243769369302168098356803571555077920472429694298442229966317593340439029459852714150624276749897280091598694686453311364045455026424758571214514756262055203440051508978832173116965159834368785858382707854976789369531579343625939987889838400384006559642407818875674341513067162701191778752137292435393831267449254212775018028113368748916919198600156470428514316368876369043423709882727847138838693493366455452186935435239332925562770422773187198637727247192272169382652457008398809932524671193808002246212481110958641070678962261617144101395007275085180770682090579500916856849467988259216829704402882462431396727186771609", 10)
G := new(big.Int)
G.SetString("5095875443641105131611487207628062619966283476482438280547454879957026805062401379178517794048352418430429585304576861940298028017194573736862889040947900348831715443268170774511635714732967101032918403264492035096763379144748455226195125665527922348150230006379591347841168838702177941465434730819591518968960357598227719884121757785321009343287855957867162715316259455893457305928483192617126347017432556244132340666680092243083833306078968690352220810786127030063628847086251565362611876896330625251403074908843335487409770418167924858932431645971671869892139553246011614522896917566395730528416790779226747574208009365930697121307177334104940008450098629344949303048384536310619406130245550025342485730271674625887464886159489306548384886341132247275347432405388487846640442610757558167750266470446404929344231520284812193454599795823441058973061158401441037267884930748429637171285571201177470804789792773637303333468604", 10)
p := new(big.Int)
p.SetString("2328910714330945135342684055717255494274660210196083273687158460572242441480303380517226235737784394910542269672702382593242612262529889176289002663923507890863607277973702811977733317897134295541723678929120867509023382377714611641651374699596970314039017382978772485765548990476005828137816150643635039801096495199595069124204789215527296953044425072202879927941809756464349330424438981146830845403096290136846321963785609412212751625785282327087279635210546233", 10)
pp := new(big.Int)
pp.SetString("5423825115325473139001038600360766017864065289277566122549972690269640643196628876935935341218132321305018789491184984203693721574201679997048140877980757157054829874456491974739040768754786668209316213357579044785712302460309268660180516581147421077778469148580053148702812610404406727545462923443570997399344871517226355293695148671470758827334130845347220993226281429911024064389885346503512358849909582149827170476595223122829002275866555072389926634021758903034153373264017403439539545915300165230475355514835377929102605704466670384726104450321230222298810519318267113157230191372198638901925580517376937495781677838688057440528452214430236406159396914310740180221443315949989144972567007647651272982474815419808879252356081469202844096930940985604065041702041826044432038007471757690581861359152837696059997933798642233195751198670276278513654079958073343970681850184163054288405087500072746305134403778059626230490289", 10)
pminusone := new(big.Int)
pminusone.SetString("2328910714330945135342684055717255494274660210196083273687158460572242441480303380517226235737784394910542269672702382593242612262529889176289002663923507890863607277973702811977733317897134295541723678929120867509023382377714611641651374699596970314039017382978772485765548990476005828137816150643635039801096495199595069124204789215527296953044425072202879927941809756464349330424438981146830845403096290136846321963785609412212751625785282327087279635210546232", 10)
q := new(big.Int)
q.SetString("2188093949795348866798144390144788835269373141464363023779586075817438051249750973488541284307789467341497568864312883297379858235891260295968372418695068270973558007351046463412144655153694196151864739779191127634418913601933502712553559893867799539069004456556547068877558971078503118750452403380043090725648446600878872928315555659484087518476086137276275134525004647855520412669188506749218677111768698586297635491742892638001530907714843927823300073962175891", 10)
qq := new(big.Int)
qq.SetString("4787755133131010687202633308925307796520219531124097821362720655364009632390061707541984401884002439771910459578862545563913660443137415290587392547217202100254888684216722585602872424354497331632631845086988950966335001908689204749884821760216918575419642110573623476424530772999018950503975011378886563286823467016184909901616566909309862018257836432251044619061823821830279784446564902790413856178967523804763446829590011470864659847238917539284970067195232278787065397619714168750648453684489769854549597172158651729875943408317455803786313653240825981214823382922870262120278737927180390028542958321880300238857685656355409211742486913596312116704265615120998881004809244755075403075649016291694784996868552963046817856178137989358937913281300459195502412401624825427687877424974780798255194483257867669117566152974253451222342442545273697270000426686047067574414673772033092608482787232373812560452206524062531221643881", 10)
qminusone := new(big.Int)
qminusone.SetString("2188093949795348866798144390144788835269373141464363023779586075817438051249750973488541284307789467341497568864312883297379858235891260295968372418695068270973558007351046463412144655153694196151864739779191127634418913601933502712553559893867799539069004456556547068877558971078503118750452403380043090725648446600878872928315555659484087518476086137276275134525004647855520412669188506749218677111768698586297635491742892638001530907714843927823300073962175890", 10)
pinvq := new(big.Int)
pinvq.SetString("1504505218274334922479813947966313198970748954966658196303323872777005024611756546497972015435588880253787267965704882078878089727709466175070504921560617558878114412144448822079553235253157517563284843214577062885304570267297108778055645936762248939966598011238561865390034867202408838464446350607110847135190871092083519205406920876130806194708260616939398843106430216102084440823752743097973953311165544784371947546385718757209712149339386887092272698321346254", 10)
hp := new(big.Int)
hp.SetString("1601329011916343753059990790023948156547847861398245595604530565555958290017640706536660020967697803930602402155524235690359741380441037924377401728990282339809194767853669615979775076279957887755660726734808944091255377047789392974120642243944359450076956036438830412903478731600009323266591826107959594265898931319442321769412394309716375799536856233129230406425725678979122767938966543747251726852927691905301475614182583485334026432133499038043045024235626191", 10)
hq := new(big.Int)
hq.SetString("683588731521013944318330442178475636298624186497704827476262203040433026637994426990569268872200587087710300898608001218501768508181794120897867497134450712095443595206597641332591419900536678588579896564614064749114343334636393934497913957105550599102406445317985203487524103876094280286006052772932243590457575508795353722908634783353281323767825520336876291418574431753435971845435763651244723800603153801925687945357173880791818758375457040731027375640829637", 10)
n := new(big.Int)
n.SetString("5095875443641105131611487207628062619966283476482438280547454879957026805062401379178517794048352418430429585304576861940298028017194573736862889040947900348831715443268170774511635714732967101032918403264492035096763379144748455226195125665527922348150230006379591347841168838702177941465434730819591518968960357598227719884121757785321009343287855957867162715316259455893457305928483192617126347017432556244132340666680092243083833306078968690352220810786127030063628847086251565362611876896330625251403074908843335487409770418167924858932431645971671869892139553246011614522896917566395730528416790779226747574208009365930697121307177334104940008450098629344949303048384536310619406130245550025342485730271674625887464886159489306548384886341132247275347432405388487846640442610757558167750266470446404929344231520284812193454599795823441058973061158401441037267884930748429637171285571201177470804789792773637303333468603", 10)
pk := PrivateKey{
PublicKey: PublicKey{
N: N,
NSquared: NSquared,
G: G,
},
p: p,
pp: pp,
pminusone: pminusone,
q: q,
qq: qq,
qminusone: qminusone,
pinvq: pinvq,
hp: hp,
hq: hq,
n: n,
}
return &pk, nil
}
func params4096() (*PrivateKey, error) {
N := new(big.Int)
N.SetString("683909908095143093348475541381672472292787187340344521379600212803337507652826004300527800887309215063715965451236982401025789005466760644135887672664608536964117058844578721466988113924920298119328546955635723421270864117265839472318531741400793388954247779625102315773649069281764299434369796370438704475826940241516632552089064703226374080947401794218961092863135114386491748632278588350834615347378387613882986983759943752143131557547984744580559075607854000282623932343842704952948362817338713550850322189260252297101509525547114144824414943007292119395558219128294421884732993960496301074260229825774889936631686061734493112022689202576923664414645579078118313610233535767180302366014715988252881058000218143946330464654553820095631106340356479823551306896722148583875961639441581749294978775040829017859788387252720636486757742213142734134422123140969370156982457122089353066091410224513171128861496206515098451169061590191375915328365637006227901575315416671060597704284174867124288707128432205058461336199845356296738555574202565700090719374461454647211267237463457300355478344525917446311901320551205758338613827997470066882537542476418821168586717526519733429913152461597572421068923126824087094933866698532950082764055017", 10)
NSquared := new(big.Int)
NSquared.SetString("467732762390707072446634847105096357629024096710062445478461399248219756240964155208969273314126481364395720665642515985595528842039926118716220032207675469314545495853699135362392688475358343135688236906354016635335559963282658378054028572270192363388094818232078205051226128845101668658014799041136761981404048589601535622841077038274549944902941196390787947364502091650916863781689076794667834500594771959844644173111499158588774345026301238096020236782837237824172807256748975034721041758680262234456490779575266825932916742018653367685543103157314087653826159608001726055053464274215662473810659154338094689052687966648092839541171189449271775562874958762806649626776550457360941821735566713825896740513322863655520790606981502148903613473183178115142760820325920231986367040358646861641866411197445278531716783327207921987819191316202020433160803313527071002002441452496342730217826709299451440841341402505798689784084424544432845032237243101619679833588109361494478735223228362395587892260765278388922988304459710395273132409827969636486016981654269080799329321532395984101488984190544249345837135601605634403044051196282547997815098090671762287831102749486541962466273433644017046493701290191940757958315819124584597554502348098938043842127113524422735166051951203576651115658636364325942038519277195058593038021436918696669834230270510396026301462923997354334474229968333715534365440166422478296763993661695208996172709278128972870054796691787844238423329162504208237393467218910782975464501494192206829565571251582042233812029604428973852433771735320042673232455983054776995489196384513557835538195747559094499795845155523036151498567224422199142383827013737076340645104648686854698263942931173677218591928447263791995356735183149426073636518203848213657641605383320511175282411331256122334826167698503481760288925927765881955854582180176806114226550003374455875684089455203237277690346963948716560907257098238508102226376471281536759730842214703680771416298365990239571776160122994871299494323585434618173376228493985218495294280426849848757097996107495282981513042753244024981606692816160902701292269922375773878945928811977143830955792413458912807631006443399620425578941498398501953842354923013756763125350977654515055245898312521754291656240916357150509957335836484052756041263781215637768262866781579157655233481578476143283665654846719955176440175926998650154426393692908649333096973138981748022410779902948257329494726530350460824509102857002870289", 10)
G := new(big.Int)
G.SetString("683909908095143093348475541381672472292787187340344521379600212803337507652826004300527800887309215063715965451236982401025789005466760644135887672664608536964117058844578721466988113924920298119328546955635723421270864117265839472318531741400793388954247779625102315773649069281764299434369796370438704475826940241516632552089064703226374080947401794218961092863135114386491748632278588350834615347378387613882986983759943752143131557547984744580559075607854000282623932343842704952948362817338713550850322189260252297101509525547114144824414943007292119395558219128294421884732993960496301074260229825774889936631686061734493112022689202576923664414645579078118313610233535767180302366014715988252881058000218143946330464654553820095631106340356479823551306896722148583875961639441581749294978775040829017859788387252720636486757742213142734134422123140969370156982457122089353066091410224513171128861496206515098451169061590191375915328365637006227901575315416671060597704284174867124288707128432205058461336199845356296738555574202565700090719374461454647211267237463457300355478344525917446311901320551205758338613827997470066882537542476418821168586717526519733429913152461597572421068923126824087094933866698532950082764055018", 10)
p := new(big.Int)
p.SetString("27425259260560691406985908455755221192446302051758264899266916759370928371315099265314000824283781450518636291235217743543498397026787229417284833854175293297411879945078196897996308619056931406124418608715914341369890412467616840242603804330568062286992307600494162907974476108614273626972828509084926376244449383283782888850780610863047445766499460853130422399292986479912845011458543943262854405842436823119405671984867648806510674537173060828236036621467338656134165479846106524776833195408737109776849307648686240644558158588214027915559269415920803401595756580747528503771748079170632545440460419168467745687731", 10)
pp := new(big.Int)
pp.SetString("752144845508969962003199803985294198236433757803077779717734346472298978394480571633065778068244651903515032285118568462834501949735255305836637692203297183466775602610261447293578912506113549554091009937602871853910084193200595779738626694894933950867005900516803258935725584417879952575370415133888516447650152959296124031719529533762482310947606918581033708034862013387760846052604146432061450083448557783679258189970598122289477396450758835710974231189942946461527938430677514211813317632659000990008101947921922775258970379436472805777280154837592437457393842725452847357615040652357852040283065404168984525059067856156558737514364768853261505691650389307274553436497830788831328786435850631140294248199880146715342532895727748188148897406251826585610512140283055725692594551740939322746883370456950263441206441503092022207131377356014866966732808253502861797953613217030464076535175116261452218262733796524473128004528199825488589263705511734251523969372684172134637113697063463991235678838978973385315760626925940264550930697305194089494110722002150649946716003531317483991179183029778810153903229514001214474104018119965737145960601207739038771742102585141778458467674816518829792290117485780940346378260175684006946163928361", 10)
pminusone := new(big.Int)
pminusone.SetString("27425259260560691406985908455755221192446302051758264899266916759370928371315099265314000824283781450518636291235217743543498397026787229417284833854175293297411879945078196897996308619056931406124418608715914341369890412467616840242603804330568062286992307600494162907974476108614273626972828509084926376244449383283782888850780610863047445766499460853130422399292986479912845011458543943262854405842436823119405671984867648806510674537173060828236036621467338656134165479846106524776833195408737109776849307648686240644558158588214027915559269415920803401595756580747528503771748079170632545440460419168467745687730", 10)
q := new(big.Int)
q.SetString("24937226722179070645959332462074774278012916658596946670273113949884785855177792488034578414353801099378439025387526258470072328125968896741578526727928132457414385081404873594203747663791075219307755827276248113860606930836517852695444683388505847390512716123363323523298592210874924613859265603230900756081740914817724442323267792229556741847523990144043181496518369967220763441200398776437966394601258999945381796573198485627124474786487038867279083669119482436887028606829210255822806701136608498325817710484435839201509781611067567981635616635086611414912521615751331613406464948702210486762591134136273137393907", 10)
qq := new(big.Int)
qq.SetString("621865276593361915879117799893310517966990579229022271904306039333426116561696572781237330824607366560984038306311388541487657958063760385702646541484592204345517662459856406121781905537575489300302296730860053382810305952016982723804435028957538868626098600119802085968556979854227874098875318837217097130415173509965608751680449382313843733561932366006538792600709603384869980062626195135519608409910156262331352136214749252826486528093668734527427255846785358718319137496354103756511347738258895767042884438913498243826935284966312371681285968541265881097235279727429693313470237802803333562977506546406959201247106546271245153629043117781427939143920040067165370143647862615922435075304237042659774421687037873075717499115971568370080738791956188623180106889373211559078249854326321695847040657622882670701868567731906474242204277411925946932642510274736593050263231852818094294131820715568222079282201622343138723262582944132490786090254110419733645274168762753289348895611816637007841847295697997150019748460293192922668884753664334604059570247058553281645516894998988061960542748211971764306911058014280746621321215257371909163688371259401757447835688432318399547938884936357275196996866483159744594089055616254654307680724649", 10)
qminusone := new(big.Int)
qminusone.SetString("24937226722179070645959332462074774278012916658596946670273113949884785855177792488034578414353801099378439025387526258470072328125968896741578526727928132457414385081404873594203747663791075219307755827276248113860606930836517852695444683388505847390512716123363323523298592210874924613859265603230900756081740914817724442323267792229556741847523990144043181496518369967220763441200398776437966394601258999945381796573198485627124474786487038867279083669119482436887028606829210255822806701136608498325817710484435839201509781611067567981635616635086611414912521615751331613406464948702210486762591134136273137393906", 10)
pinvq := new(big.Int)
pinvq.SetString("1074927962500005431488972773348788323270871155895246263764666714729544148465106567268828111242959412000845406031086625260154618632267171041537206623762154085291203813631462555897613974240403206434225503372532652707002020156853902551616024131415155433718005775637264662915378492110138613126959091849051343104835557385667502423186803948400206334835567901924782085736222474023588606468050055442585199953375021577667796006546122734601253460936946910179242361204354314298892913975606926925988557601555666396959701620471569805965112656926247685497874089777268562749651806652294743756982192793465687064668602736130537653692", 10)
hp := new(big.Int)
hp.SetString("1182175483521965015329514377262089167521386806002007883544944072058895169014691417243637917097190519953593716673596741006118121492756683530331095289650225748113263565019858521731877180564654190428519169797013618168393492499853176788782154363568799402961133205200630748893240176641160499739123480650798213657792413512056224185985631119547048966395106830697093809658587323840169356150258699291607053852669116835175383633779487770228733186272209035402928741301125408527365839552626656556924846815705626324549351383522967129491452602887705562215793108165514273845134458859419171528126475793151011507374709814522152638593", 10)
hq := new(big.Int)
hq.SetString("23862298759679065214470359688725985954742045502701700406508447235155241706712685920765750303110841687377593619356439633209917709493701725700041320104165978372123181267773411038306133689550672012873530323903715461153604910679663950143828659257090691956794710347726058860383213718764786000732306511381849412976905357432056939900080988281156535512688422242118399410782147493197174834732348720995381194647883978367714000566652362892523221325550091957099841307915128122588135692853603328896818143535052831928858008863964269395544668954141320296137742545309342852162869809099036869649482755908744799697922531400142599740215", 10)
n := new(big.Int)
n.SetString("683909908095143093348475541381672472292787187340344521379600212803337507652826004300527800887309215063715965451236982401025789005466760644135887672664608536964117058844578721466988113924920298119328546955635723421270864117265839472318531741400793388954247779625102315773649069281764299434369796370438704475826940241516632552089064703226374080947401794218961092863135114386491748632278588350834615347378387613882986983759943752143131557547984744580559075607854000282623932343842704952948362817338713550850322189260252297101509525547114144824414943007292119395558219128294421884732993960496301074260229825774889936631686061734493112022689202576923664414645579078118313610233535767180302366014715988252881058000218143946330464654553820095631106340356479823551306896722148583875961639441581749294978775040829017859788387252720636486757742213142734134422123140969370156982457122089353066091410224513171128861496206515098451169061590191375915328365637006227901575315416671060597704284174867124288707128432205058461336199845356296738555574202565700090719374461454647211267237463457300355478344525917446311901320551205758338613827997470066882537542476418821168586717526519733429913152461597572421068923126824087094933866698532950082764055017", 10)
pk := PrivateKey{
PublicKey: PublicKey{
N: N,
NSquared: NSquared,
G: G,
},
p: p,
pp: pp,
pminusone: pminusone,
q: q,
qq: qq,
qminusone: qminusone,
pinvq: pinvq,
hp: hp,
hq: hq,
n: n,
}
return &pk, nil
}
func benchmarkKey(size int, b *testing.B) {
b.ReportAllocs()
for n := 0; n < b.N; n++ {
GenerateKey(rand.Reader, size)
}
}
func benchmarkEncryptionSmall(f func() (*PrivateKey, error), b *testing.B) {
m := new(big.Int).SetInt64(42)
privKey, err := f()
if err != nil {
println("error")
}
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Encrypt(&privKey.PublicKey, m.Bytes())
}
}
func benchmarkEncryptionLarge(f func() (*PrivateKey, error), b *testing.B) {
m := new(big.Int)
m.SetString("9601375721773960030826048348718350956180868954786249183055522621772391594913965263068361191091587324151101807311169301869981191762119859865346892157945421998951222949069729370836921713919282283633399891943869137940899827469813950721928452427835958620445001112962904065293585229146038515621140909326729", 10)
privKey, err := f()
if err != nil {
println("error")
}
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Encrypt(&privKey.PublicKey, m.Bytes())
}
}
func benchmarkDecryptionSmall(f func() (*PrivateKey, error), b *testing.B) {
m := new(big.Int).SetInt64(42)
privKey, err := f()
if err != nil {
println("error")
}
c, err := Encrypt(&privKey.PublicKey, m.Bytes())
if err != nil {
println("error")
}
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Decrypt(privKey, c)
}
}
func benchmarkDecryptionLarge(f func() (*PrivateKey, error), b *testing.B) {
m := new(big.Int)
m.SetString("9601375721773960030826048348718350956180868954786249183055522621772391594913965263068361191091587324151101807311169301869981191762119859865346892157945421998951222949069729370836921713919282283633399891943869137940899827469813950721928452427835958620445001112962904065293585229146038515621140909326729", 10)
privKey, err := f()
if err != nil {
println("error")
}
c, err := Encrypt(&privKey.PublicKey, m.Bytes())
if err != nil {
println("error")
}
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
Decrypt(privKey, c)
}
}
func benchmarkAddition(f func() (*PrivateKey, error), b *testing.B) {
ms := new(big.Int).SetInt64(42)
m := new(big.Int)
m.SetString("9601375721773960030826048348718350956180868954786249183055522621772391594913965263068361191091587324151101807311169301869981191762119859865346892157945421998951222949069729370836921713919282283633399891943869137940899827469813950721928452427835958620445001112962904065293585229146038515621140909326729", 10)
privKey, errz := f()
if errz != nil {
println("error")
}
c, err := Encrypt(&privKey.PublicKey, m.Bytes())
cs, errs := Encrypt(&privKey.PublicKey, ms.Bytes())
if err != nil {
println("error")
}
if errs != nil {
println("error")
}
b.ReportAllocs()
b.ResetTimer()
for n := 0; n < b.N; n++ {
AddCipher(&privKey.PublicKey, c, cs)
}
}
func BenchmarkKey1024(b *testing.B) { benchmarkKey(1024, b) }
func BenchmarkKey2048(b *testing.B) { benchmarkKey(2048, b) }
func BenchmarkKey3072(b *testing.B) { benchmarkKey(3072, b) }
func BenchmarkKey4096(b *testing.B) { benchmarkKey(4096, b) }
func BenchmarkEncryptionSmall1024(b *testing.B) { benchmarkEncryptionSmall(params1024, b) }
func BenchmarkEncryptionSmall2048(b *testing.B) { benchmarkEncryptionSmall(params2048, b) }
func BenchmarkEncryptionSmall3072(b *testing.B) { benchmarkEncryptionSmall(params3072, b) }
func BenchmarkEncryptionSmall4096(b *testing.B) { benchmarkEncryptionSmall(params4096, b) }
func BenchmarkEncryptionLarge1024(b *testing.B) { benchmarkEncryptionLarge(params1024, b) }
func BenchmarkEncryptionLarge2048(b *testing.B) { benchmarkEncryptionLarge(params2048, b) }
func BenchmarkEncryptionLarge3072(b *testing.B) { benchmarkEncryptionLarge(params3072, b) }
func BenchmarkEncryptionLarge4096(b *testing.B) { benchmarkEncryptionLarge(params4096, b) }
func BenchmarkDecryptionSmall1024(b *testing.B) { benchmarkDecryptionSmall(params1024, b) }
func BenchmarkDecryptionSmall2048(b *testing.B) { benchmarkDecryptionSmall(params2048, b) }
func BenchmarkDecryptionSmall3072(b *testing.B) { benchmarkDecryptionSmall(params3072, b) }
func BenchmarkDecryptionSmall4096(b *testing.B) { benchmarkDecryptionSmall(params4096, b) }
func BenchmarkDecryptionLarge1024(b *testing.B) { benchmarkDecryptionLarge(params1024, b) }
func BenchmarkDecryptionLarge2048(b *testing.B) { benchmarkDecryptionLarge(params2048, b) }
func BenchmarkDecryptionLarge3072(b *testing.B) { benchmarkDecryptionLarge(params3072, b) }
func BenchmarkDecryptionLarge4096(b *testing.B) { benchmarkDecryptionLarge(params4096, b) }
func BenchmarkAdditionLarge1024(b *testing.B) { benchmarkAddition(params1024, b) }
func BenchmarkAdditionLarge2048(b *testing.B) { benchmarkAddition(params2048, b) }
func BenchmarkAdditionLarge3072(b *testing.B) { benchmarkAddition(params3072, b) }
func BenchmarkAdditionLarge4096(b *testing.B) { benchmarkAddition(params4096, b) }
func TestPrintParams(t *testing.T) {
// Generate a 128-bit private key.
privKey, err := GenerateKey(rand.Reader, 4092)
if err != nil {
t.Fatalf("Unable to generate private key: %v", err)
}
// Encrypt the integer 15.
m15 := new(big.Int).SetInt64(15)
c15, err := Encrypt(&privKey.PublicKey, m15.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Encrypt the integer 20.
m20 := new(big.Int).SetInt64(20)
c20, err := Encrypt(&privKey.PublicKey, m20.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Now homomorphically add the encrypted integers.
addedCiphers := AddCipher(&privKey.PublicKey, c15, c20)
// When decrypted, the result should be 15+20 = 35
plaintext, err := Decrypt(privKey, addedCiphers)
if err != nil {
t.Fatalf("Unable to decrypted cipher text: %v", err)
}
decryptedInt := new(big.Int).SetBytes(plaintext)
if decryptedInt.Cmp(new(big.Int).SetInt64(35)) != 0 {
t.Fatalf("Incorrect. Plaintext decrypted to %v should be %v",
decryptedInt.String(), 35)
}
}
func TestCorrectness(t *testing.T) {
// Generate a 128-bit private key.
privKey, err := GenerateKey(rand.Reader, 128)
if err != nil {
t.Fatalf("Unable to generate private key: %v", err)
}
// Encrypt the integer 15.
m := new(big.Int).SetInt64(15)
c, err := Encrypt(&privKey.PublicKey, m.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Now decrypt the cipher text. Should come back out to 15.
d, err := Decrypt(privKey, c)
if err != nil {
t.Fatalf("Unable to decrypt cipher text: %v", err)
}
originalInt := new(big.Int).SetBytes(d)
if originalInt.Cmp(m) != 0 { // originalInt != 15
t.Fatalf("Scheme is not correct. Got %v back should've got %v",
originalInt.String(), m.String())
}
}
func TestHomomorphicCipherTextAddition(t *testing.T) {
// Generate a 128-bit private key.
privKey, err := GenerateKey(rand.Reader, 128)
if err != nil {
t.Fatalf("Unable to generate private key: %v", err)
}
// Encrypt the integer 15.
m15 := new(big.Int).SetInt64(15)
c15, err := Encrypt(&privKey.PublicKey, m15.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Encrypt the integer 20.
m20 := new(big.Int).SetInt64(20)
c20, err := Encrypt(&privKey.PublicKey, m20.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Now homomorphically add the encrypted integers.
addedCiphers := AddCipher(&privKey.PublicKey, c15, c20)
// When decrypted, the result should be 15+20 = 35
plaintext, err := Decrypt(privKey, addedCiphers)
if err != nil {
t.Fatalf("Unable to decrypted cipher text: %v", err)
}
decryptedInt := new(big.Int).SetBytes(plaintext)
if decryptedInt.Cmp(new(big.Int).SetInt64(35)) != 0 {
t.Fatalf("Incorrect. Plaintext decrypted to %v should be %v",
decryptedInt.String(), 35)
}
}
func TestHomomorphicConstantAddition(t *testing.T) {
// Generate a 128-bit private key.
privKey, err := GenerateKey(rand.Reader, 128)
if err != nil {
t.Fatalf("Unable to generate private key: %v", err)
}
// Encrypt the integer 15.
m15 := new(big.Int).SetInt64(15)
c15, err := Encrypt(&privKey.PublicKey, m15.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Attempt to add the plaintext constant "10" to our encrypted integer
// "15".
ten := new(big.Int).SetInt64(10)
encryptedAdd := Add(&privKey.PublicKey, c15, ten.Bytes())
plainText, err := Decrypt(privKey, encryptedAdd)
if err != nil {
t.Fatalf("Unable to decrypt cipher text: %v", err)
}
decryptedInt := new(big.Int).SetBytes(plainText)
// When decrypted, the result should be 15+10 = 25
if decryptedInt.Cmp(new(big.Int).SetInt64(25)) != 0 {
t.Fatalf("Incorrect. Plaintext decrypted to %v should be %v",
decryptedInt.String(), 25)
}
}
func TestHomomorphicConstantMultiplication(t *testing.T) {
// Generate a 128-bit private key.
privKey, err := GenerateKey(rand.Reader, 128)
if err != nil {
t.Fatalf("Unable to generate private key: %v", err)
}
// Encrypt the integer 15.
m15 := new(big.Int).SetInt64(15)
c15, err := Encrypt(&privKey.PublicKey, m15.Bytes())
if err != nil {
t.Fatalf("Unable to encrypt plain text: %v", err)
}
// Attempt to multiply our encrypted integer
ten := new(big.Int).SetInt64(10)
encryptedAdd := Mul(&privKey.PublicKey, c15, ten.Bytes())
plainText, err := Decrypt(privKey, encryptedAdd)
if err != nil {
t.Fatalf("Unable to decrypt cipher text: %v", err)
}
decryptedInt := new(big.Int).SetBytes(plainText)
// When decrypted, the result should be 15*10 = 150
if decryptedInt.Cmp(new(big.Int).SetInt64(150)) != 0 {
t.Fatalf("Incorrect. Plaintext decrypted to %v should be %v",
decryptedInt.String(), 150)
}
}