From 1e479986fc8063c520cefc0ebd3a97ce70a965e6 Mon Sep 17 00:00:00 2001 From: Leonetienne Date: Sun, 22 May 2022 20:16:26 +0200 Subject: [PATCH] Readme and visualizations --- .../visualizations/input-big-flip.bmp.png | Bin 0 -> 938 bytes GCryptLib/visualizations/input-big.bmp.png | Bin 0 -> 938 bytes GCryptLib/visualizations/input-big.gif | Bin 0 -> 6334 bytes GCryptLib/visualizations/input-flip.bmp.png | Bin 0 -> 355 bytes GCryptLib/visualizations/input.bmp.png | Bin 0 -> 358 bytes GCryptLib/visualizations/input.gif | Bin 0 -> 1107 bytes .../visualizations/output-big-flip.bmp.png | Bin 0 -> 1087 bytes GCryptLib/visualizations/output-big.bmp.png | Bin 0 -> 1089 bytes GCryptLib/visualizations/output-big.gif | Bin 0 -> 7873 bytes GCryptLib/visualizations/output-flip.bmp.png | Bin 0 -> 442 bytes GCryptLib/visualizations/output.bmp.png | Bin 0 -> 443 bytes GCryptLib/visualizations/output.gif | Bin 0 -> 3729 bytes readme.md | 108 ++++++++++++++---- 13 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 GCryptLib/visualizations/input-big-flip.bmp.png create mode 100644 GCryptLib/visualizations/input-big.bmp.png create mode 100644 GCryptLib/visualizations/input-big.gif create mode 100644 GCryptLib/visualizations/input-flip.bmp.png create mode 100644 GCryptLib/visualizations/input.bmp.png create mode 100644 GCryptLib/visualizations/input.gif create mode 100644 GCryptLib/visualizations/output-big-flip.bmp.png create mode 100644 GCryptLib/visualizations/output-big.bmp.png create mode 100644 GCryptLib/visualizations/output-big.gif create mode 100644 GCryptLib/visualizations/output-flip.bmp.png create mode 100644 GCryptLib/visualizations/output.bmp.png create mode 100644 GCryptLib/visualizations/output.gif diff --git a/GCryptLib/visualizations/input-big-flip.bmp.png b/GCryptLib/visualizations/input-big-flip.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..18127a336ddfea9052ec4fb6592c8163785391f4 GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K59)QUsR;_=59F}xPUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadSO zEbxddW?lFzi8y?AW^~?b10I*1 z%1YvE_rYfg`DeG*a7IQL=V3w~`jhKYi&r2^*$+N6~n{l1I8;`qN^ zY7C#;LSMgk+MaXFFUFF=jyLkVk zD!vqSPzdopG|j)H;8SScf7h!l4-|iWI5(-Nto@+X-dXH_E-Kl1uCZEUxAO0VDkg`X zHSTwJo(rhE`%v4Rm%%IKtU}7t46hZp+yYj)Gq@ko(22<})V*=VmQh16B5l{Qn~tj! ze7kQmJP`b~;brF10})sE8Cb^I?Bl685Oik8y^^IfYqm({_%fW@YWJzJC*!ne+d4x= zfy9e%%f2tRn(m=``8mgex&E;kPd^4-2L32Z4)D=H(zJ;zra5Ahp5Tn z>Z^%cLu}O<&!M>Z5XLioy)B73?z@ zIyQ({GO>$JOB0qj`2iSKnHRm>R5+I3iwM1(dm#6K@Rx<>92V3CX#QR5yoc|H!(%~* z{6`aFCrb(%D@QRM|5WQBuqE%Pcka)bvs%0FF*303`}BO7!Dg2y#<8h940FzSE`4|8 z+YLVRnHJv}J7adTe^_H6xmfVrrK^kwn7=4~n!WyA>p#_x3=jUVkz@QK$@pN}mx${7 zKhM@O2ko6xwu^gD})w24B??V%Y5D8_5S6XZ@ zHcdX(&gnSmd=}FO*7tGOr9IiU0rr literal 0 HcmV?d00001 diff --git a/GCryptLib/visualizations/input-big.bmp.png b/GCryptLib/visualizations/input-big.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..88608c75aea626511cdb498008f3a9dafff31f99 GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K59)QUsR;_=59F}xPUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadSO zEbxddW?lFzi8y?AW^~>g10LtC z%x~+b-)hW~yLI`cYvJ?LSv@mN3L_k*y1u&jf?u1BVWQw`sld5`HfbeCzwhF&IR0;! z8p9{I(AUqMw&xsk%vN6Q&M ziZ2Bn6hgcYP4h1)_!OG=-}NfX1I1q-&P^&RYd>hUcNY7fi%NE$YpmATt^7Noipim8 zjr-l5=K|{PKGb&SW$+3)tB|rZ!)wJYw}4gd4DLrXbYk)gb#Gj;Wz-OiNZYmSrsL`a z-|pKC4+MX0c$vBMK*ZI329|L)`*5C z`fB3V5L_f){AJ-ehXr*3ntzu%@8SF5@L13x z|Ivil$&!M`%27b*FCD|TF$uOkOX5uxS_-G zb1trjJner7uVdcFV0-y`c##XYA298zmbgZgq$HN4S|t~y0x1R~10y3{15;fiqYy(2 uD)ZR(k~1pp_sJVkSXsNz7{09xWPTwo21j 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 BViEuV literal 0 HcmV?d00001 diff --git a/GCryptLib/visualizations/input.bmp.png b/GCryptLib/visualizations/input.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..a6df3cafd71b5de5a391f3d94ae2ec35ef7b26ab GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58o=b4b6v}U9F}xPUq=Rpjs4tz5?O(Kg=CK) zUj~LMHK4i{28LfC^)DD0N(~qoUL`OvSj}Ky5HFasE6@fg!Ib3f?!v%$w@Y{lkjGiz z5n0T@z%2~Ij105pNB{-dOFVsD*`KkB2}$cZ37Gx`3PpOlIEF+VetUHzFM|RPv*Wk; zTL)PD#l8JstyZ#*Y>X5tc-FjILqLjQ;YJ3p9@ZxdEw}`9`dA+=@u`q-Vek5?1`l!ovlk|8slhCZ?zQ zCZ=a5XY-~f=H@2a8t9prnwXk0=z#QtOk!aA-_yVH^jrSLbGF>--h6M*Z~nGN9@Cz6 zE_-!q+dJ;#pM0)=>wW&~-1mR{JY4N64IevvwEB-MGv3h8qu-PQ|FThDs=`?sWy)t)Gs zikewDJA7{K`N1O_Ysnk4w$gXbUS8?vf4SxMS^L#x*V)Zp_wUrbzB6q5_3ZWI^5yfV zo&R<2{NDHS#x+ciKeaPnDjf3Q5;qchHbMAE$8@!zDJdV57WX`s5-faU@j}_dUdery zO{dY)Q&V-KchztjFY}4xO%Gd{`I+ zcSTTfz*?)Vn%4rZZo9SPRVmwz4d%TQbyvSx*Yor zeSW2ZbMrBipQbMlZ%W*~&Nf;q@Aj7R=WS1B7ruGG0l&+xb-8=Y3)xOK>c?NG`BD7h)Xebtbqc%k-dvkoKK-2S?^4#|sp1R_ F)&R$D7@YtB literal 0 HcmV?d00001 diff --git a/GCryptLib/visualizations/output-big-flip.bmp.png b/GCryptLib/visualizations/output-big-flip.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..eca1a58639805da35e85d200e8a126b56391d515 GIT binary patch literal 1087 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K59)QUsR;_=59F}xPUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&V7%KUyadSO zEbxddW?%5bv%8Slk;D0A z!@u22n0w|~ly5lVr&q0h-k?V1K%k_gXz0bOD}zhVFI`>IX~B?k{;efr_q=H43zyIA zl&@u+@m=BBoj-2N-i0RSKj%$&H>K{`1fzo5W!@(`*&C*;&kFFp^UP|VwExLWOUFG7 zCW2Dim%N#ny2+4Dm3y~8LzUF2>pM@yH%{eR6!eQ_!2%86-cCfb`cjYRV7vI8S7;dGV@L;q~Fw*e-TEnzK_Li zzg=&#*(=#cu9mT5X%yJ^)DSJGpyh%=nJ9C^w@tufvG;4FsI z^O+@%>82z~E`5A$^4#Wo%(rY>7wtG3XKX9*g;hb2?_xw_j#ZwP`KQ}awrmDn#Sg-! zt~_(LZ}Lye15R$YJLgrI{419#Wc=~XgvWmNzGorgmpL0g>8?M$$13>!d&!?17vzp` znf{!%{K|!Q#{3MP2`_RNzLyQ!F4!Y|K<;LCu>OyghyI@9bTE1~Rd839S}Nb>6*7!T z-%bC89qcy#*XrQMuxUkM&vun9)t7{hZq#S^I{n*^X{qNF*_5;IW;;}eK9jw8jeDA) z+qv_Mt75p0e2y>twk{?6m2E@e;yd3fPtL37DJ^B(uxYaC-}xLjAN)MMjG4iC`tJDY z6M621?%&^2&G&;*Ug3|*vA;_iff-7*#5JNMC9x#cD!C{XNHG{07#ZmrnCcoCg&0~` u8JSy|m}(msSQ!{R5mB3jq9HdwB{QuOw}z>n^Ynlk7(8A5T-G@yGywpv)w_rQ literal 0 HcmV?d00001 diff --git a/GCryptLib/visualizations/output-big.bmp.png b/GCryptLib/visualizations/output-big.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..fdca11b6c7d102976c2e9e9ef216336d1cebdce6 GIT binary patch literal 1089 zcmZ{jc{Cda9LIkVnU=Y$j+x^PP1l7qcq-HqNh)EExM`UyLd_M)T+^2-T6y{;smxI& zQ^y+`bssIy9IaX%PuI6PMyoXM9=)v7IKRm&9m59^t9sppgEh^ta!C2WW6+z+_dR`B9!Qg8@VFr()F zDlXqHxSH)>DYFEYXmNYv+gDra9jmlgfrt&1nmZ!$P>Zg!Y(d^Qt9@V6X zjs`Ysxf0ft9zh;MT%$!g|rO@GcJ5 zz9x@A)ej_hN-O%*ZVB*`xt6K@=an%MaJV(?2h1QpY{7YP!$c(*6n0(LaTKoi=+qJ0WYF#% zv}`JNG%TLYocwwhv2xd_)b@TlNya}u2^?g4$!l?NA<;&l!X0BZXUq}4i?P|6S_8g> zjue_c)VwxO!u%Z(>R0+~^qi)hrAK3T2LfkN-u75sJ?tUoKn7duv6FV=S0--mU}gQB zezXGzgC1JV<`W+%ad%BD&ZPVJ`Cq9`w@U6n>{CWw@Eh4%{Cmkr@%LIHRI#;zOyY89 z6Dht;kdB5diYjiKj;)=*4*0LumkQeZvwfUwyVTHDt;`TaomS1Xkr9mk7K$DDs)Me# z;JOEs`+pk@7A@v}88;Wy-Gub*&abYD`=HCPCrzUuvz}EJJ0{`1_j}Wc>~Gvl$vE@# zuVw~!#t*qW0r7ggILD*F8v~s(t}!p=vDh^9WBS0HO$lU2g|iv>NESmr0EfllFj!j* y4(EIR0v>0Fx3M{g#p1D8=SYk^#{V(ICq~6ar~kjf+DTLT#uasWY`+&MrFo}LbBk0s^g<>ckhN&JuhU(>k@jQESC z2_F_qI_0;4=@Nm8b)l(_2f44Rlm(()(K^h zcNWOz4p%JKzY_lg_j<^Zl5I7x0NwiQ5&UoVx!U&MQ*;Y^<$}0`Rl*~~9Yf)E#8tjL zx^V}`+#JU}tj(_XtA@8zt6af7JHu*GcqWDNl*f)wLskGcST#@lq^>%xW-^iDI&0+mrV9qxoKS;<4(D2Kc z_%Z+f6W4f`-kw)`s$MOgvo_5?d>9>RN+p}8C#}e}%+2&UPA;(2D+-06? zE5hd6c3JVZkuI5Y^!cJ+Z)kx6C%gKEJ-#- zLK(_57Py$-zT{$i9yfz`JGfzaFI)ptdf!3o!k4Uct(pP*95D*s)zc*6xELv_d|@_J zF`7k?pqyKpUEp%LjAnM1J2Rhf>o)1(J9!10ji_hF+y!xjz|E2h(YyN4a< zmX;X%DLD}((=miHZgpiG!iO(yE}%BEOth>C8NF7Z!T=yPapiXPu7zke17~~Nf!Mp% zL&I|drRfD5yh*mtR94gV?dCuYZj#npjh|!w3L|!KL8M}jt8)^S`O7UL`M+z+x669R zkG?nk^86Qxvgxw;f|B|JwI9YHm@v2C#v}P zP@(E;2c^-!kB6@n0e?;f?ZX?!`)`*0>|TxdU7z>(BS9qZ3&zN2;Lwh}Zo*BN!< zBpYS8iIKEF8Xw(NTmP9iarbu(FlZR`9UPXp?Xt-K)w6b4 z<(k|v%d|W2cgeNj2fvnPhqz?AZAF59xPR>(lNVt+W`h0Qnqh>RKlyxT%&F1Tx?1;( z%K4D%RyX6)4sVe=N7Q^Aw0`BY*s~~KH`cTMQkVDB%2IX(or=3R8x^%C7=NUocNPk``$*3()Q(|psM_y;I1>Ht z5^o0oKEIBgRtWUG5w2w@wB)6zDbTwSW3lBVaM@LMhU-calj_X$d#FNFx)r*h`J^y9Wx<8OkLC6W~7 z(r!anH@ol{X3&}^214lR*geLXIF|@_96p^#u;aD5okoj6J#T#`AyG<=u59n=nVQ!Uk6IV z=lpYyS6yx%B8pYJ8LXK4J5Q>QM8J+$9Y^s+A=p{Sn=ZRvWl!NVE-i<_El=%Rf&9(T@M?%_5 zS_Yl!P;zq40~wBHt3kJ<_)2AAXX$y(iG$yD(4-DgWaa@RaF z_mnc>pOLjoZzzm*_b7)ySMD`z9A?y$IZIfu8kYTJ<>t&PYznOGf;BQKHUcY=EBy9-XR?Wt0&||CkS;*`Ayw^%*u5HF zzf6VS6!(?y7%=L;C{Ltyt&dvBCvFJs`f4g8qX;W zD&V!{*fMXqbGIUvM`G-pw@lBWbB%#7|JQ3_oYZzLP`$^$X(cgWzo7y@hppe(#vEd|a+Lvm3P$t^CYFm!*8DEg9%qw32+Gcf)FnLaXRD0%< zwKqSzP((3jGt*#Dr)}^4ZrL#0mQ_)Dng(@WiP>Cy4w9+=Gv#zM+2d`^=HKBD-1c5^ z9y3>75a!t*NVRcsd|~4hSn>N8Na+)|e?FnK%wUqM@%=H8Y9p{J_+&5L@{DFKk_+~YaY~I-hIqq-;?K=T)MyH=N4parIgyzR9gjadNw?s6a(Gh8wH++l^Z9! z&V2+%ZN{P&f#oub(+)by<(|2(vt#OiqyvO!FI)Y3S+2TmZ?Cejtm6BDt(E%qPqhIo z?hl}j&|z2I+|;>g683t3mz{&!`uU%8VfE{2Oa}#%F*lVc6ujdbBDvP{HK4Z|K977+ zL0}Do?|oF-zC|7;-{gWo$kR4bPGcqdBi~ghS$1F~~;iq12Q1P+4=tMPa zca-~V(*DUwBU8>HW9@LYNfkQwBz*G7fmgTfI^VE^t6_>FZ(wB?K64R1f_M6AM~Ng#Kw z$4npwSwAh}-sQ;2?%<1*;60ju9ue7>VO-p&p{M(f(j8U7<8?vT zHwNV=ONEHgb)$CJxaCD>j2u%kvE4e=dqt{T#Pm{r~=%{o{hzTh`iSFwj6Prbi&f!LB z^r6KVH1zYMsLexnOBI_9yhjeTtEf>w6+*p4qC2VK zM{AMYcuN-%Fn~EC?+~7$jlhBehE4R7i}bCXLZzrBTUz13EWEV^yZn#(RX z7s=W^j{eji*Qt{?vk|whl>8qgCLI_f--9IUIsO7>?(`wJ@!qFAc{c~c;!Bfe389*Y zF)6?>P8-}hDCl?^$BjsB5Pfr#wWtrAJ0y~I-6r2D0{0^};T4U*UtF+EaPRF6Q6DS{ z*3)ukDi);YYq}LS)fA~8XNomPP@Aw`(^emDm0Sasd~_{R6U%&ioN-DF31IbfO1DU} z#^$jQELZ~en6p;ai&ePr3V#ZmHgl*`k>AnT`-)j~M^dwuU&L{U4<>);xY%qm{EV8= ztcRVJ&zAzG{yPp@nMHyyspbQjcf?Aw`Cv$!q*MkneTqO>+rahkgqqTF!gbyhZ5EK- z%4$ku0;s5cL}G|&3T}{W3W+nCE1BAe>fptZFvY~!_&dBg)<@YLh!k&x{{}BUL5#T9 z@B4zUbc8ojWFY-6ck1}%OkRv-S7xY7Gg4@yf)idoi!XeZUh*r(K`54_Rc6krOlY4n zr6`j)$@qQ!tj*>O^oeP+P1XAC>H+Q-1PuDXrdo+q7&|C7R>1-m24(z>J-4H-hVoIf6`nfg{g6{DX1*X=627|*d!V0R%+1` z-b0K2D}N_dUL!n58f?ab%iizU)NS5AE>bG1%M=Y=ZVsf0VwT;~IP~isj>1Yz{{O!8 zd-F6E{tT=}U%e-x?F18Z`sprB0IJ z3PN4N17N&$tmrYBrBqMeLjMRy24(02!I0IS{~LHybK}5m8(kgb<_2|c!$xQ!4#^+; ziSW0X@~YH*?%$C+{|~m1ST%_@)vaK#(chsvwrwhzSL5x5DAZ61jxx{e;k%(2y70+q z+qG)%*ZGL{OEMQl674F3r}ssE9C{_UK{yCTj#lsOn&1q&2EqV7Dkx#M0~SFpbkn`OgUJ9yRz%IGNPx|4nAY@b>SA9BsGL#oiRI_OGY8%Wi+p^H=+` zHg~J0BO%fkpm00Eel?Y6SduI5DDPu~DaS>QV3^dUOm{4oq8=b!91-kV zWCxE67l_%m|9M>&48Cuplo_%kZ#hCR6TJAqz=Ec_#q zD`6U=M?_tZo?Z@Bu3{BPUUx>=dO4~O{6&y*5N* ze&Gf&r@~wmqR)VwIxL3kI6BZ})X}^|I$)-$w zP}~wXc{Tf-rTF8{?wI+<x{&FPzXUcCVaJ7xwthJ`+ z;ch=9Cuw|Px8y^ml6UUG`b=F>*xjuv^A)>R|IcdWuRT&O6=6Ke!5f&0+zOeiH=s7B9eQTo$0?ZLgVy0anTxOoRgw8co-NUlTF!mzYG1B=|B zeEGHC-`8*|XeDtVeQ@z3-I#;C9L#`a%7Y=&Ed*PJS!8WxUq4nD0 zOdnN`U#x~q`g4rEfyr#FNkI8kb3dOYsfeV;Joe)ftHy%i!>nEMStZo308bTzDZ;96^JrtOI(XsSA0uNLX; zg4~GX)m-|di`Edw`bL|S&;NPsq88ayX*7E=qe6GR=Q3d2hqtw0^oZL3OU=|J^0m>!;7Zk3|rjoLO~H+Uw8!G+tb??#9scA6Hd`=Vd?OKi27I!pH=N z$3HxDg#hlA8N*TCMN<-514cID@hhBDLh^boroCe^BZdHB9o~mlZCn0b&u9N5u|C^- zB%S!t8OIilZ(sm9V=7cjb|nXT!W%g8wYNy@!#vNR>SigTUBr8c(vQfhUtl5eVxb`B zmjcbTI4#wJM=MIIF@xKTz%tdhPs6MSM8{1MH@Ao~D$fTjTz{bFBZaj~i6+_Ba&b$S zTply%z402-IhUgGGgZf3VVGOE+x5a~=4(>k0O`<)3lMg9T|>xy??lr}HvECQ&#$+e zWL>@Gwo;r~_YL@`#5_8)duL!02nb9!$|RUHDyt8d?xhH93-PE7C{@pyXuj|$Q@vdJ z>37fXDmQaTiF5O(BxrT=qy(gsEz67#%lSTx>&L54%2qA%Qnel`WiR-$CVG0g$^}Zk z>vbqwf>V-96B;BOAs9n9?h)eK%97_0f_|cnO!R|sJY3n7?7Fac!8=_iKD?2KMmho8qzi9alQR&+N-T*-fc0y7jP1vu%Fy zSJ?sSeydXu$j0uchId%|s+ZFF>FFhCa@%a1l*{iun#(#MY>s_Acsr^rnH^k9%$qyJcRBV@@IFWemuQp#9Pf!{BuBpiL`Q*>9Y{8-7TbvD}D~kg955ZQeUd`0P zb*UU{L#shYzwwjP_sW(A=EK}Gqahczr3d0RzKFplmXT7rU!LB9W_rZRhz0o8#tK;;3>ux$63KX?uL<0OcJ3zB zJMiy--_TSh{!$u>Pi+m~{k56xF;mojq;AopfvCGb>egrArH$H|iqfBi7RkPuSX-wQ zvVDQbbub=(<<{N$XOl`#{nT{9#r`6tp6nAJFC%zFOZkp+5Csw0YaiUU`O35=u%vb?R6D8=LW{uS2L|co-@> zE|j_DxrF!;`zDB_c$*^SAF_KgBJpi2$ikwic~*T%xl?hm54F{{7r=n!EG8VoBhK~> z`&ve1?>Xm^IChLZLe_)$5VooE9bM@`HASjk*xk&%#OU&m1FddJr0kt=!(XNx_8VF# z%VeST(?=@y$Mks^{d7%s-ppiVM9GGI9YEi9c1`{uRkgnI~fSf2=26iJ23@Wt~>2=AurM%5U0a# zD82PxgZyI#Nn1ic9)RZi!eOKk10sS=H{>A&spazIUVpfV4xIDAp%?WI+2E7k>jl7r zDqFh&U! z>cI0V%M#tM^G@?Q;;yi(>=&3AJUR#jvC;|?(naTz0$oW^4RWMB%rcH1;>4hb=g^UH zmhT8?-w0}`pNJOFsWx&Vr*#E%c9Y=vXDC`6Y`&j{h zVv3O>;t?UG{*{>a2>0z_GpB#(nc5Q%-3FdEJ8 z)D`s#ohm94d9yE2n$|{(_ANM5f)W_9Ayf`jgnj*E2Y)w zfr#B^j=F(Vd=j5k+#`I(rn#5%Y!b@aho5HJaU6ZVFD>LdUILi0#bVvV96k;7%e2PZ z*Cs;1xg@&R2{Y=7UJRMXGetXlpC$44KyD&qE$4YZQe?*B1|h7}Dk~b6H)i<)8Jj)} z%*klTJvW!v14N+-`8Kmri3qnOT2|SV9=$g`5gnsVOG2&XqNo{V*10!tM@4PC{w!+S zK*2p2MBzk3ZycJufD|kd3X@-9gITj0jO(8L9qxcb9Too{Hn=K1v;~+l30Y*AnExmVOB5rTIM?t8`1K1 zEDuXq7dqQiKMTxcZfcoPgoYk70&qoTrOXG3BtBftVXA{@&Ry4_R6e&N1SD+`Q}5=l z0)KOLz0ew$WW7N)8_ael6ugfCHI(@tG-cL3}3teORv6EGFhm;@Bklee^dTNg5j zEEt{ zd60~4tjR`HUdEUWiv--hjk;%D>&aIgIG7i!Q@g8QQLNySuUFEhM~o1S3)rl?-JBB& vhE+nc9F^Y(fyu)HdU27ZHUH4~rRgfU`Qk{ow_inz;hEJm){B?Vom2ULa>=zG literal 0 HcmV?d00001 diff --git a/GCryptLib/visualizations/output-flip.bmp.png b/GCryptLib/visualizations/output-flip.bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..bf90029ceb53b5264f25bc0930140f3e57e839e8 GIT binary patch literal 442 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index e6fd47a..ca84f5f 100644 --- a/readme.md +++ b/readme.md @@ -49,11 +49,11 @@ const std::string input = "I am a super secret message!"; std::cout << input << std::endl; // Encrypt -const std::string encrypted = GCryptWrapper::EncryptString(input, "password1"); +const std::string encrypted = GWrapper::EncryptString(input, Key::FromPassword("password1")); std::cout << encrypted << std::endl; // Decrypt -const std::string decrypted = GCryptWrapper::DecryptString(encrypted, "password1"); +const std::string decrypted = GWrapper::DecryptString(encrypted, Key::FromPassword("password1")); std::cout << decrypted << std::endl; ``` @@ -62,18 +62,38 @@ std::cout << decrypted << std::endl; using namespace Leonetienne::GCrypt; // Encrypt -GCryptWrapper::EncryptFile("main.cpp", "main.cpp.crypt", "password1"); +GCryptWrapper::EncryptFile("main.cpp", "main.cpp.crypt", Key::FromPassword("password1")); // Decrypt -GCryptWrapper::DecryptFile("main.cpp.crypt", "main.cpp.clear", "password1"); +GCryptWrapper::DecryptFile("main.cpp.crypt", "main.cpp.clear", Key::FromPassword("password1")); ``` -If you want to do more complex stuff, use the cipher-class [`GCrypt::Cipher`](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/Cipher.h) aswell as the conversion methods in [Util.h](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/Util.h). This way you can cipher on bitlevel. Examples on how to do this are in [GCryptWrapper.cpp](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/src/GCryptWrapper.cpp). -This way you could, for example, decrypt an ecrypted file directly into memory. Or use a full-length key instead of a password. +### Prefer keyfiles instead? +```cpp +using namespace Leonetienne::GCrypt; + +// Create a random key +const Key newKey = Key::Random(); // Will create a key from actual randomness (like, hardware events) + +// Use the key +GCryptWrapper::EncryptFile("main.cpp", "main.cpp.crypt", newKey); + +// Save the key to a keyfile +newKey.WriteToFile("/var/stuff/mykeyfile"); + +// ... + +// Load the key +const Key loadedKey = Key::LoadFromFile("/var/stuff/mykeyfile"); +``` + +If you want to do more complex stuff, use the cipher-class [`GCrypt::GCipher`](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/GCipher.h) aswell as the conversion methods in [Util.h](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/Util.h). +This way you can cipher on bitlevel. Examples on how to do this are in [GWrapper.cpp](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/src/GWrapper.cpp). +This way you could, for example, decrypt an ecrypted file directly into memory. Without saying, this is more advanced and not as-easy as the methods supplied in the wrapper. --- -\* A key is always of size `BLOCK_SIZE`. The default block size is 512 (bit), but you can easily change it in [Config.h](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/Config.h) or wherever it'll be put in the INCLUDE/*.cpp. `BLOCK_SIZE` is also the minimal output length! +\* A key is always of size `BLOCK_SIZE`. The default block size is 512 (bit), but you can easily change it in [Config.h](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/master/GCryptLib/include/GCrypt/Config.h) or wherever it'll be put in the INCLUDE/\*.cpp. `BLOCK_SIZE` is also the minimal output length! ## The deets 🍝 @@ -83,23 +103,69 @@ Without saying, this is more advanced and not as-easy as the methods supplied in * [RRKM] Never heard of a mode like this, so i've named it **R**olling**R**ound**K**ey**M**ode. This basically means that the round key extrapolation is carried out continously over EVERY round on EVERY block. So in addition to *Mi* being dependent on *E(Mi-1,Ki-1,0)* due to CBC, so is now *Ki* dependent on *Ki-1,r* with *r* being the maximum number of extrapolated keys within a call of *E()*. This is handled within the feistel network class, as an instance lifecycle sees all blocks. Just in case you want to take a peek. ### Password to key -How does *GC* transform a password to a key? -First up, we have to establish what requirements this transformation must fulfill: -* A full key. Not just *len(passwd)\*8* bits and the rest zero-padded. -* Even if *len(passwd)\*8 > KEY_SIZE*, every bit of the password should affect the key -* Diffusion -* Ideally good collision resistance +How does GCrypt transform a password to a key?.. +Well, it uses the included hash function [GHash](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/feature/relaunch/GCryptLib/include/GCrypt/GHash.h). -Let's be honest, I'm not a cryptographer, I have no idea how collision resistant this is. -This means, it has to be considered *insecure*! -I have tried a few passwords brute-forcibly, experimentally (about 1mil) and have not been able to produce a collision. -Obviously there have to be collisions, since *|P|, len\(p\) ∈ ℵ ≫ |C|, len(c)*. +### Hashing with GHash +GHash is a streaming hash function based on the GCipher. +For all intents and purposes, it does the following: +You have a *Block b*, which is initialized with a static random distribution. +Once you give the GHash instance a data block to digest, it will use the GCipher to encrypt it, with itself as a key, and xor that onto *b*. +(*bi = bi-1 ⊕ E(key=b, data=k)*) -How does it work? Basically, what happens is your password gets recoded to binary. It is then split into blocks of -size KEY_SIZE, and they are combined using *ci+1 = ci ⨁ E(c=blocki, k=blocki)*. *c0* is a static initialization vector. The final *c* is they key corresponding to a password. +The lastest *b* represents the current result of the hash function. -This is a one-way operation. Since the key used for this operation is the cleartext itself, you cannot undo it without already -knowing the password(=cleartext) to begin with. *You could make a hashfunction out of this.* +GHash also supports a do-it-all wrapper method that takes a Flexblock (A block of arbitrary length), and returns a hashsum for it. +This wrapper function adds an additional block including the length of the input. This wrapper function is used to transform Passwords to Keys. + +### GPrng...? +Whilst we're at it, why not implement a pseudo-random number generator based on GHash aswell. So here it is, [GPrng](https://gitea.leonetienne.de/leonetienne/GCrypt/src/branch/feature/relaunch/GCryptLib/include/GCrypt/GPrng.h). +GPrng is really nothing special. I just wanted to implement it, mainly to visualize the GCiphers entropy. + +GPrng basically does the following: It creates a GHash instance, which initially digested the prngs seed. This produces a hash result, which is one block in size. +This block gets eaten up, as pseudo-randomness is used. Once there are no bits left, the GHash instance will digest the result of this block ⊕ seed. +The xor operation ensures that an observer will never know the internal state of the GHash instance. This is important, as to ensure an observer won't be able to predict +future output. + +### Speaking of... Visualizations! +
+ +`"Hello :3"` in binary: +!["Hello :3" in binary](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input.bmp.png) + + + +It's ciphertext: +![Ciphertext 1](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output.bmp.png) + +
+ +Now, let's flip a single bit in the input: + +One bit flipped: +![One bit flipped](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-flip.bmp.png) + +It's ciphertext: +![Ciphertext for flipped bit](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output-flip.bmp.png) + +Let's gif them together, to better see the difference... + +Input: +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input.gif) + +Ciphertext: +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output.gif) + + +What about input longer a single block? + +Input: +![Input](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/input-big.gif) + +Ciphertext: +![Ciphertext](https://gitea.leonetienne.de/leonetienne/GCrypt/raw/branch/feature/relaunch/GCryptLib/visualizations/output-big.gif) + +Notice how the ciphertext doesn't change until the block containing the bitflip is reached. This is a limitation of cipher block chaining. ## Noteworthy: * This is no fixed algorithm. Newer versions may very well be unable to decrypt ciphertexts encrypted with earlier versions.