From 06de0d900bf233f20d28b9fd6b62a905e3b6897c Mon Sep 17 00:00:00 2001 From: sherlock Date: Tue, 7 Oct 2025 10:11:34 +0530 Subject: [PATCH] IS Lab8_ProMax Update: This version adds multifile format compatibility for documents --- IS/Lab/Lab8_ProMax/PKSE/documents/doc1.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc10.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc2.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc3.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc4.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc5.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc6.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc7.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc8.md | 5 + IS/Lab/Lab8_ProMax/PKSE/documents/doc9.md | 5 + IS/Lab/Lab8_ProMax/PKSE/encrypted_index.pkl | Bin 0 -> 18227 bytes IS/Lab/Lab8_ProMax/PKSE/pkse.py | 208 ++++++++++++++++++++ IS/Lab/Lab8_ProMax/SSE/documents/doc1.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc10.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc2.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc3.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc4.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc5.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc6.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc7.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc8.md | 5 + IS/Lab/Lab8_ProMax/SSE/documents/doc9.md | 5 + IS/Lab/Lab8_ProMax/SSE/encrypted_index.bin | Bin 0 -> 3152 bytes IS/Lab/Lab8_ProMax/SSE/sse.py | 177 +++++++++++++++++ 24 files changed, 485 insertions(+) create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc1.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc10.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc2.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc3.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc4.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc5.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc6.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc7.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc8.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/documents/doc9.md create mode 100644 IS/Lab/Lab8_ProMax/PKSE/encrypted_index.pkl create mode 100644 IS/Lab/Lab8_ProMax/PKSE/pkse.py create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc1.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc10.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc2.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc3.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc4.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc5.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc6.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc7.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc8.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/documents/doc9.md create mode 100644 IS/Lab/Lab8_ProMax/SSE/encrypted_index.bin create mode 100644 IS/Lab/Lab8_ProMax/SSE/sse.py diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc1.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc1.md new file mode 100644 index 0000000..2643df4 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc1.md @@ -0,0 +1,5 @@ +# Introduction to Cryptography + +Cryptography is the practice and study of techniques for secure communication. +It involves encryption, decryption, and various security protocols. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc10.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc10.md new file mode 100644 index 0000000..f519336 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc10.md @@ -0,0 +1,5 @@ +# Blockchain and Cryptography + +Blockchain technology relies heavily on cryptographic hash functions. +Bitcoin and other cryptocurrencies use encryption for security. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc2.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc2.md new file mode 100644 index 0000000..fae8fba --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc2.md @@ -0,0 +1,5 @@ +# Symmetric Encryption + +Symmetric encryption uses the same key for encryption and decryption. +AES is a popular symmetric encryption algorithm used worldwide. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc3.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc3.md new file mode 100644 index 0000000..00c1383 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc3.md @@ -0,0 +1,5 @@ +# Asymmetric Encryption + +Asymmetric encryption uses a pair of keys: public and private. +RSA and ECC are examples of asymmetric encryption algorithms. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc4.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc4.md new file mode 100644 index 0000000..49ac46d --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc4.md @@ -0,0 +1,5 @@ +# Hash Functions + +Hash functions create fixed-size outputs from variable-size inputs. +SHA-256 and MD5 are commonly used hash functions in cryptography. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc5.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc5.md new file mode 100644 index 0000000..ef14b12 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc5.md @@ -0,0 +1,5 @@ +# Digital Signatures + +Digital signatures provide authentication and non-repudiation. +They use asymmetric encryption to verify the sender's identity. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc6.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc6.md new file mode 100644 index 0000000..1ccf6ae --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc6.md @@ -0,0 +1,5 @@ +# Paillier Cryptosystem + +Paillier is a probabilistic asymmetric algorithm for public key cryptography. +It provides homomorphic encryption properties for secure computation. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc7.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc7.md new file mode 100644 index 0000000..6118304 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc7.md @@ -0,0 +1,5 @@ +# Public Key Infrastructure + +PKI manages digital certificates and public-key encryption. +It provides a framework for secure communication over networks. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc8.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc8.md new file mode 100644 index 0000000..14a5c5c --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc8.md @@ -0,0 +1,5 @@ +# Cryptographic Protocols + +Protocols like TLS and SSL ensure secure communication. +They combine encryption, authentication, and data integrity. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/documents/doc9.md b/IS/Lab/Lab8_ProMax/PKSE/documents/doc9.md new file mode 100644 index 0000000..27be380 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/PKSE/documents/doc9.md @@ -0,0 +1,5 @@ +# Quantum Cryptography + +Quantum cryptography uses quantum mechanics for secure communication. +It provides theoretically unbreakable encryption using quantum key distribution. + diff --git a/IS/Lab/Lab8_ProMax/PKSE/encrypted_index.pkl b/IS/Lab/Lab8_ProMax/PKSE/encrypted_index.pkl new file mode 100644 index 0000000000000000000000000000000000000000..e074766906f2c817cac60d139dbb6609d3e04668 GIT binary patch literal 18227 zcmbunWn7d|*Y-_!Hwx0--Q6WAEim*DGsrM>gEXkLG)PNHNrMPTcXx;a(ybED;C0{E z?=g7Z53hVVnGyJ(2ghD}t+m%lAW{;u65OwUeu>O6NcI4Ted65}jt$7l)yu`r#@hVX zYcW_Z_BNa@0HBi-(8e_}23O&K-+v5swuHTskjN7B>nkx_pq5TRD|1I1uS9#K7<{e& z`5LWXFRQ^`{qKK;w@ZwY@n*U}_Z-+B92ne;Ri#;SY7Z-S=`oIhB#XxO8>;T}>*f~|Li|8# z3--p!mMP4A4OE`*ZnA4?LsF*0k85mVP@Msu=0K2JVw5x!_I3HV+?&_?`?;K5pNU_u z3U6m8GxCV)^`BH!R5cL?UWT?!<s{J(Hy%-s=^BTEb3LM0KjH*5U!{rXN@8x?!zH!PBToC6a z8E;hbaVQ5Jhh?@hskJk%oDPub%W^4|TCTW16*Xq;vYEXR04k{j{E&%3v+;BRgKS{; zs|FWC^*1dLVh*;ng+i%dG^K=a4@Uq_=8Biz`H$=;aL%L-<$pL%g_~P7Rukf@AWDDx6Z+rdRMJ&oVR^QdRV&`TZ{#37+%X z6RN@46T$Aro)~r)_N4Y?FlZDjR~y(}{+pOKpm8hbb^rL5E+Zz@?Te0M8YGF&JeAi= zW`pz>%bhX69KNgXT+Nb}F9u4n63NB7N53NDsk^o)@T-!dqItaA6mu#Gk@2f+TVQ)= zPscM(m%0#o%11lj8nuw`z8+#I{f(V-Oqp~hO6POn_3V)>oYwKR--4CZl@L6QdVvP@ zZ^ZVbfIE$Wo;KDHp!Yq*GJX5uCC%gf2cq1*yjZjaf=ogQT}LBOrz}T0iE28U5vw1i}TYc2a^^P`@WVX2%JeeD~snuqPLS6&)FnrF1gz#QqOlIM6_ z>c<4=0Wn51pjt?D8k2ONHh8XwUsdW%5%!kHe4Up~0&D+ZWVNXy`kNRP40UsXy4~Z6 z-pl2Epeht?v$hIO5nZ(udy1uBr*R%qbp<>B+YVQ675md0D~7E_q#Ydu6zLvP zVZYsN(JW{=WHuVx!T+JcDdXfpAkK<&OygYOFE6Zlo2ZY&n=z04fMK-#XS43|CDzy@ z*&6hR$EBy@t}oZUa11=iBLqGitp=D)6!E*!OUo<>XEYqSMjG)xT5w_1tmV7# z*I7_o7P!7dDBUwsqmVc{#RH+8nTO-cu%hLU7iJTBe_VaK8(!C(lPbg~$G|Im+xt`v zUZE>v4PkShQYUy-r^N&L2X0&tTKb7l-J0K2a<;Y{I{ZXwOgZV*HYMjpA^hLaC_vEt zhL~^rAo?k;TsBe3czYrZx!9cY2kBx0USrbQ7i5PpQzBgjz1@TC+V|00Vm`u$I@$3| z)8&r|^pP+T9Oh;M`yO28s0tIMacZ5_D0SE!MF;;-v8m*zS4cn3q1bU$c%7j_R7Vr` zEm$i|+G&f5UElh|$_YULHL7e&vElTnAxh;RxDa~)uYlmcEkUoft|RKYO`+zx!=<%s zNH3f;H2}%-rq}1R>bhX0+KLrz`eq|7^e}D^y)R4LkRO%P?L6FA&iO#*0gxbR$bhpF zz^#?PLh97SH5Ji7w~fxZxp5dti)t-790c!KE!zNO%hGkLJE+{j-t;E8V8M8@?_tV& zeopXnjo9w3l9Kjv-4FM zIjmXAE56f;mQ-8*GO?4I10JPQbg9IW@9ugvmn!|F8+VJK(}KAxyyh~;NnFr+Tdr*! z+F>avTWv(fCa^1){9Q%j_232E2D~}XE@EW%y0l>=8e5ZeCWV+I~@>Xk>?MoLF`zs<;QP7R6Tv0`z#tnsM6i9lYnRg z!2x)?>nD~Dn*VmIzXCVnU8eKTZSkghIolBPCN%P+q06?e|IpmB0>%T6(@3E3#fIpz z%i3s4(~O4v74@?KT6Thr$q2B(U>*Z~;&o=2XU3vwo#%zGqBvqvTs$fi_)Kounvr03#%w<_`hZF+ zYH^&!iHVm*$8UP)D;Y(efF5g~6CWD*LI-2@(y^G&!>7TN4mG9#+w~g-?sUX~)}$kY ztbw?U0UkRObqR!Bby)vf=d-siw~Fo?F@Z`IHtQ4gx3E zr-A`z>R$53m&`5eJ>O9Zhzp=jYJBv&8Se59C78enK+wNwYy2O$SZ6*qLSCluleG&x zb=`Brk&siJLQD3p!YHc4CiLoH@0h}$e0?e<9XSUw&{CZ7?fBY{{CS-j1JSjjE6skh z?)BL&r2!dE$xlR2LYw-@K(j1ckGG@nAG%J$A`IiaX3Vw=bs5Os8{0LvXDwbrh@MNN zK{rqQCVJY8<^Gly>sMt0wsQrz*x%!aS4T-KrM>L-`$3G;F#8|7``h-GqyhYl&r?bmfHDLe&oQ0?)bQARAYO>es~~$_*u62afH-N){|k; z22<`wE%;=}$ZwphOp3_ucc~bDlE03;vTEc?Xw{_rCZqWJGnwn_a=EEA_MjWZ3bWs! zng1t@2>v&Ci2Mp3s=u6#Y7Mjlx&fU2tv*v__Bm}r+u++q$CMiZ>jljXE4$X~!Tbkb zVic#%w?(9JAw!?6jIIpb9F;I5IWgi-RM4vIt1}%e+aQ%WFYzh5#Jgf~rrWz1u^zS0 zTo89>cl2WMsk~Gs40Ks&YRK=}%Gct5Ll7cCXND~T$VB{) z8&R}ZgLwr50<;4G+@P*D_heD1G$%nGhYHZ>BhpRxAMekDArX%e`uvr{UdkZ4rhYb4 zLp$KI35#EUj2ydoMSaDbni|f}NuQ`)lN=>$(F*+1yg{HA-giD(l9-~LgUP3HICTsXBo#D9*zG006K ziC@po$%`waRc|!-ib8SXPKBtsq#9`YB;uAGODNVkYDHP$p;{QN-EsA?bs?|gSq-A& z#E!eUqV%xn9sqy&@U+3pYBC#M!71H-Nh2` zt9Qc7@p}CnHp(C$C+;>XHScW=J1Gz3->{kO)$EmF=D-1gL9R9~P;21-gIvBcJ%%B( z(QVRvNV{G(X0j(`q@u;b9GCo9)R@M@E#%m3;=}CK}C}(f@XnjnG z+O3d~TQnRqT4CV~M%DX7Cfwi1e;EV`CigwTgdwPam-mX7!XThogiH4c;f37$P)D-_ zbF)m5#wEavK|-LW-;VoAkW-$e3BzU`dDJ>mwB{EoE7QY9WQEyC|2&KIl!=pdpUl%}Od#n$N{yR=OT`3;&#u8EkNxE_K~I}vH6bv~Vmwd_E(#N#W%bR$uI zCEU;rB@uzTCkj}Osnl)#9(e-}Cfn{%01K2TRiF^7hfOO%>@VEAvK9jX@p5*yadQP) z{hJyXS}dP|T%j9KXoa?&RL+m^WGHBuqs=h7E93kiSmWz~_2*q!U%_1F@n=`6_kP5) zFL>;bHSxswj-tNI&U<+>k04M4q&B^SY~2Jktz1fcd3+@Db-$3<%gD>4DyLBm^XJ|b z)uKLjA?ei3Lb(1ny{7M{-803K4QX+jL-rt*wgH?;;C?puI{j__Gs~RSNg0= zStBHGZw=K!M0Vx))+vp#YCYflxHZt!lI_!O!1o7C; z+H&J+8vibmW(cq6GXN(1gIm#F$)3z!8J0CU*gM**{tDL!Zs31wF1y8#HiU+=&B@Mi zQ@itm;wAk#eOKvFS&t7p%4(D0!}FCsf;C=jy7NY8mzQAxrjC z?U9+YcZOjE>`Z=T!LLIC+Hi z*xo@Wdu1rZ9KW&qM943atl1`y$Jf_(v&b4%)VJAP9*g$;TK4qOo z`4`2E{zh;l#!&s*o-3*)lS*Z! z)ckIGsW$0Knt-Ybx|PSr?F94w%3#dy={KKpVhaf2=Su9f*O-1|y$c&kzw||g*nq5U zT<_VrlT1K-^BFn*aOnG33X=&9AkZ|j2udH2HA!uS)Sm zk}u}e+c8Cn9-VQbXk4c6e2#5GZX7yg3K8{_tf@eiBnn^G)<<;KKBksfy`YIZRXz#_ z*c0OWKzgK*a5E^og2M71RinO?7p{!;*)RL@4}sBOyEbeebi2n9lbUhQ-t`KHX~{+9 z5B5pZUnslGv$CDfvf1aTQg%Gr#P65R9*+iYs zDYB(R_ggJHKVcs){88}Ur5aeUzO5_R8v3jC_-|{B9eo8c{BV@J%|y?1C5;YPNx{1u zdU)vNRno)m&OWj_#$uDZ9b`3}i1!+vAP!^9v#zQ@`{$Bi}YRjG7PRhZosxB|S2?Nx|P%F4~S_!0n7`?bH0_#zo9b2qS}94jOOAB zfC+4M&)VxdDg4s@MwEu;qxAjw|VYOeUnq2uI$(RgaVXDJxi?w^eM1N(@8zGdaNG>9HZc@KWqzsqQ0$b zmbQDQ=jj)Vd-;Ru>2+Du{>b7=0iiQ@F*$LEZ$gCjZ`8j8MuxaSt?%)$PjVL2DS2l1 z5uWh!tn8_CJ|-H)WWbLweF^NA7en9q@L!l3YHQ_bE~02=(4rcf30&lZh&PZgmkGM} zG;kbRqjn-Pn6|_(8wl6^77mCvYMkgUEG6lz#K)2ZR9atyUo$Fsw`fB*xK!Qw`5*~7 z93IsE1*b&LaTe7r1)(??f72p>ZU60Dl((pP+A0ll8s6zMo7F0-^v%QM?3EofShLIN zQxJQ{1Gd^}$ZLR$5mEDdHDha?jN5di(FSjPO8o}5wV4XuvgtP z!Ow1080#xf+=8ghwwEnD`pSn45%j|QvIw@^ynHyvHHO-JVo;>%SFl zd$T_GqmCueOu=tc1K0)ddpqE;7^Ad?%jEfBa7Z;^w}_k|=|e*+@MF4tIu-qNZ_)}M zKWk5Q{H+WVYr@+zdOfrjBmKuW8?smd3f;Xk1_Ul+O7bY4-i3+7EJknw99gniU2pLwq%9X{kB)rFN%{l>~{|DS~7S2A(8IYVr$U}fLG$-{5F1Q6V( zQ%0W-v7_#U@|}L>3XFZ!48=lRKlUW3jM&U4WUSst`*P7i#OpCTdRhAokQ!A6_azqoG=*hKcl+n2*VD29fEku4GR%(kwN@EZZkiAQ$NFbH&TeeY zaHs1`jESDYU-*u&Jnqik2tc=g3;t9{>8G7bx8e+;^}*NCY%zOe zr@Dg#;YAeYtpm}gDCV0l1w@nL3nmCGy`vMiRMI-lKq8sd?LA!rjY<*Q~sUv^7h6`L|8+h z+r}S?x;vUazPC!jynH<7T5+`A+{6`&*FPwk3_^;)NVQurPsdR6e-<;d2 z9nR4#vac=}X^Xq;{9H34_%TrECW+ewnXB&=6aJu-+rCumBpRZ8zz(9LQUXH=J@V(F zxy6$OM(19jkWQBA^4^z+CdQ#rFCJc>$$_jNV8&l2^XAg@UVWz&D$Iy4c7-z#MAMeR zk2&Wkc+!k9TDf?!6?g7SQXVvbD*A^x{wI~YJ8c0&@7cKpc|UUaI3i5n%2{Z=vfU9x zUlrWg^}@;f;9&j{n}Tbrn-TGHw0Q*z&k&A>_ht&m5ASuu&I;dUs8ZdK&gYffn6{kv zFT~cD;ecWkPvIG`>`)%pznrhl*_R+kH4(g>YB7i?y#XAje;OSh>y0g`HnuNZp5^B} z%h>5*^f4D={tfw;%4ol$$GxeXbod9m_s2yib1eyE(FdKq8@h0#uaC=anD*xi)&f6x z_0cdy-Xaa>_!$O1?9VKDP@BHDg6R=0>RPg;1B8E1@Ks}|f*u|_WxMvrx8V+I0@mo% zk%*K-qZ9owYyut8W?klzaw0A4ea?5QSk2Lt>QV{rTzQ5cnuQl1W@^sc{(e>nYuf!< zeCV*oksH_w>~xRH>Jd`9GkdWo;oElBvOfY8k_5wMg-bN6Ql3lOh7))|@VCQmnbove ztnk>t-r(+>eVJAKG%5MFPDyCeHM}oKC@e*x;uxGO1U*7k%%cvtJP1=Aqj45NJ8ha- z)8q~DLDs9#>PELicYY?xD;u0La?07i{AguBwG3 zjf+$;u);TWK7%aQ-c9vGp%^?D(B>6|q>~NPe|EHx3@q)P7+;iCZOp3cG&iS*Y$CsFZ zo5`2?;XfY@z8sj1H?xU|i~AU!>v=#CvRWkj#9-(lKd&b3Zhd_!7d|>Y#UmlBa=s~d z`({cbw!NHuGg2&Khj&DF`{-}>pn-;rErfhpdCM=mUGVDHT}QZ}2rR+%^;EA`CN9NN z`#XMiLJIcxNX0(1|K5eMzk`Mc{5veCF|LxecXd2@3g4CW>8bT6S1>aNzW96*B8@c} zmUxZ2^IYkmsP z{%Qu?_4u)2UbX~S0-b;mSnB+5cvEf+5o$@YO#{ss_{{T9Ii%A!?ku<3yj2Wr4?Z2> z)>t+#X{&%LMj-HZ2ur^4hm9@02AY9rPiFHNAhu6p9CdCApZ~0f(DJ=%z2*&)`N2#v zOq1r^C*P9NYbNW($bm&8>CMPsyWyiJL1Xatr7eR*Rsco?WAsR>g|tHm!teczUoxWu zob14^KsWn)jG_9}(W!$pW^Uki=cTzf<8QHoVlvM>=u@BXE zpyES~xLeXZ6St7f`Ajo1-kMGi$uqR9!-_J^t{n(AcW7ufDyB?ZepWORWuymse@Q7C zitGtfQ^Sxu<#%HPob8j*QK&rbcAbBw9#=X}@q|p>?(fFUHk!VQ%Eu=@U=w4&`;s~o zgWR&bFudrEL!_cHjh_Bhvj#YH(jU{|PEg_|EPY-?A0{TdRt&n;SQC0LJ1f11r`0rd z@j~pZq`L7W4nB*r+7=cBAz?3OK;>BK;q@O4Be|Jp1}F)~pKWP3aG+{8n9)DMd=!1I zFsKq+_AH%NrA&v7Pc=`9XM!iue?ijZH?4mK4oq0m4;$?Ge;h*~XXB1s2H+zEu6@4f zgPXZzXNWxTw_SglSt!!;*%)8BIxOfFXG*zT)YI^%i#D3C@(5aKy;NEQp1wu9UQChX zCqc&g02l20Eab!ZL?Msfg6=`a&b~$E2H2B-5&%`rjV8HLsdy92^<1f`CLf+mc`Hnt zeCOdqv(EArMscB9qraKa|3BK~w#?;#7jIt7wE2dFv`qSSo+=+7>4Jz0FIsdKtfjOf zC*5Om`?LXMpbaV@TBBC`79SjVMF>5L3Uo|?b`cWo*j;l4u!R_^j_g;wdnFU4^gFQ<%oukE z-S;d%iMbo(JiAw#4((kBF*`E1D9#PoD2>FiLxYb!ARBZOcC{nP&vOm1fKZ_H-lBMDGgb6+Kgj^Y2#^3Ie7s2jy-&uu3-;O z?MI}yaVm5AH#uu+?_KKhJmZcv5Rb;>DOp>xfnMM8919)C6tkgKC)I!;=JdlYYmj=} zQT2D@H?Q<*_pf@td+IEr|1B>f;68Qh3+AgH(1BE$XNbD%L*JpTnc%d}yu)?Dha)c5 zP_^kgd4?>Yt{zt;^Yu+J<(cJTENbzP7)rrZZ9?Pa$y`qexJ4gv0iWF?lDo45kr2ofIzSn))(*0glZ&n^)2|fa#GwN!M_AgDQ$~xRi6?L22M=#1?PS*QlvKroZm2 zfa(HvfjR;1X>2$lH2ObpG<9p4T37|rW!4pGzj1MSo?i2q_(M>$X|JC(-54aC5x6f% zM$?*|t1S~HT@Bxq6xh!6ML6<<2}_&$7hSL*4V8@+Bsieuc1aw}t{puB`O?Czh*2lq zruU{c=S&BsBQp2EC@y*h>rYwQb~xfA=bUXuugq;WeF*AT zb}1;^bx4qxEai1FlQXd==_HbW7?7usMr1MwZLIlIz6vuPv{LQ{zt=*J8-9wG_Kz8ZK z$|jspp;z!KS+cpq^~cxlS~_MTLVQbn61&b%LuID+iO#A!Z1f+ar<82PwVn~w0sz{& ze{2~lcaZ^>Puvq3zD=)(oLLyvAb)B+A&5_lf~(@mY}#p5au}(Z z?IRWZWG+dgX(tA`v4a$LOy|bdGaj*$bMc>U@~`j&&{iCvCcbR0ix8f;1;fPGy>(n=1`HNd-X-{#7$R3%}wY_^8KPIknxZ!%P zW+PHy#QF?ZF6&h7X+MVsjmnBk#l9mX16Zw8+G;`rOVQ} z6F#sTH%|*^dGd%f@OiTT7(-0#N!A|&4R^eVu8@1m576LkQ=gEA^{i9GAOq_Ite<*( z{GIJ5^VN}a>oEv&O#?ll`z_4fv8BY_%^%{_OwO>U*GArjxdt}%XRFtCgz}J`bp__& zN7RY%*7n^tzlY3|%~4MfaFJ|^e@9I$%%)j+8?Qpi`1qqp7WKgPZfPM_@&?z~m7%u& zbp-i)L(RXnMYOTHr`qVat%jPP8rTRYslFBk<}Qjk9ogw?6rRwpIwGo z_{I|Fm|1FR1LEdXtv4P~yUVTsCK0K0N zdPkH;T`afO-6G&XHg6|I?fSDpSLn6RiJg{V+y$q16<>VVv$LMKXI8Vi-+c+(DTO@* zw+-^rpM%L6%Y4tGT*bqhX{M@FTRS{lWA^ZBx1Z;!Cl4Tdj4oBSG!z$CTBP=Nj=-1Z zFPwLf6iWCMiNTKh{;x52`#X(sfFN5}0L0A|c1Ct@H(5&({GDoWj`73oxa?QXc~Izf zua6C~yV5DF;3DAiAR(nsWjTMv+DzvSwzlhgOv@;7Ng!inZ_R&+Cm2c+sh*z)S+8mjo>pZ_6Ht-kP%2M}OK67P(4!P{RC#H|~0T#?JB9xL>>r!eOd) zVu<&6JCH6;wd1tzq#4znVY;8%?e);7!=$*e9kcy_Vmi`l59WsB@lgZX-zC0dg*`w5 z0@&T>;;eI3HY7+~17xswVF|W>q7N7}efPMafFlNatUSv2DHuSd(im2XY?w&*Vf2GB zr#i%-r#}YWP}};GB*qBAs@Zc>!Kba_V|u!frJg zdBxtZxrP{zY8HOKT0~fvL1Q~)*AXs^mL6q!N|7m~W|Fd*kz=|D$L%Z2S5iy^n8Nxw zIQ#lNff&i=hEF!Bzj(lAMmtCE+P2w)Y6*dNrf@?CEm%vvP9xX%3%IeA}wZM~%Z#7c;oBby( zi?N`HPbogo8Md?Y8sNO*70G^SLLO1S@SAq*2~enmf?*tS(}i_Md2tmuY5 zS5$rFAzo>F>$eB5AUV$-kh4c{v?Rs%u@TZ%ndp_rPubcC{4p_>;8KX6Z6K|-qSfC6 zxReC3T~n}7#mwiTS3X&!(6i)x$MHu(c_%L#$j0qX+cDY-lYXYW~bL63Y*o|}cR56cK%$<9rqRLaTMc-{b7m@*@(r5uk(m$9Fc zC+)0W4B$N3Mv&kDU90)L@yZkVbo{v~eyuamMa5K=;z?~`c-_a(AH3+QhZH>`FZ`Bp zBvGk6!9>U?dVi~nVd(_6a*&cDiE_LS-5*+fk!WGAP4ax|$Q{huFfl!{X0*j&5dhfr)L6O&W{oV` zn53j~`!HPNsWZ4Qz27*vLLA_(8?w;$Fnrq{vuJeA;@%2cpB16l8g&qSjgu#IEKQz1DKlOv|8hFkFTmWFhZ{A_Br(60ZC4TjrTaEH=u>!;2kC zh`z#8yozFN?0#ec@@!!)Q6mvYw=|m~RIUvQo^p!GL^jNW`x_a>)du#|cAzv74+Pm6A|Xn9nAf;zU%Ws?m}jC!-w!)02+8wFJRdA-G3d=U|!fDE}`j z)ydBlm2P%RL^$Pb1{K`hm7fyg3xxwTIlhkQHJ z*EG6^@o4ano>+}NcF$cJem9cV@BoV5()!u_ASiOMI*2j2rXvo8iE7&epCmCNJAeh# z^wR_MKW10%9D#7(d@Rna;-HrtIl)QtPK;q!R3&YC10I7)@5|b~J(rTwAM;Vt0S7!~ zv!AGJPkT9@uD?BoYpVPNpy--#B75i`$X?T%6?#-J9bo>qwAlaG==y!VKLAi~ zE(kN^yjwoaU+xN=$>^NGBS9H$_xKBGT%e=wWWWeb&f+cb4lOB)%vUT3s6s{|F2C)t9K}gf0eM5;xng z#yQlWJtxh1`}~y`>9KsO;4B^T8qIIicgJ9NQ@yB`KsPJ!eNp14Omve3FE#H0pT)Ry zU*4ykRsgn6B$6mPZgi~qBCQAq2g|O`%vQ3H%6RfbMxMkX5AU%uHYBr3ck;_uS6aJ_ zV??i@Bjiu%m|YS?Dfw?#vsoYrQ%2LL@myMy0zH-!j}=YiMIP*%Q2 zu}9Hb{@#xOea*`j#M7^P)dxbct7zxSUUDVw(pat%vHQs%*nCAAF9Az&`_W5wb9 z#}=^B3Rl>?>Aj(%!HS2$z|(VZRkVjPEM&AaH`X_7_^-IJy1*tIQ_4*(=2=&`T0JRx)O&)HEwvsrr~APmMcG$D~b&Wa&H-z z#sI%RDC0eih+gmrj{-x1tnH(9ME=*xVd+hF-$JS-=ysjGLRtPWucB0Y34W!<_g$=d z0F!u_OvPr$r{_jVav=qpv35LdBNmD~YSQer)eS&_w;zQ&+qaC66*i3<7K4$QV(`B^ zkJQkzE_5eZG^;Z9B`5m%fZ93T5=P}v zgHuL{s9{a}jpo+bo4MW$cox6-J*R8xYB&wn#f<1FzlsAz;jiz*)E_p=QEXgC%(`Du)jijKA3~HVqwOgsmeoJB%c+pbIoN5tE3ER@;%DK*ui854kFcdmu+z?s=7usi z2f#usgohZp%J|fKS9pM`K73Fr5i;vo&lu`pUAZY)z^wumxwh_ek4#^(s!r-3oiYLT zBQv67qRsC=>z-@U3M(t5J*C_JeZ0fo@lIi9*svo2Hp+HSK8Y1!NAGVf;~cVp+BjDh z{BA}ef>C!$2HNl8k^6E&g4B9w8l;`8mL7{{6#fQlWO13{9{KxhmQ=j5VIos#lfO5l%OS+vw#V6>El95&v2Z8yWH> z?{BVQ{9KTQxH(0zE5xp0khPFrEBWF}>>?#Erk1W40(Uy8OZJ#hHpNV2th4E z87CJL^`;VWE9S3^6SBh|crEP+_c?Rs4Skv|dR!_(VlLo=So_Pdwwn316n zAjt0Dv}bW8k?!hTqaXM`EKrw6C4^NYG>xb)>JbRdy)N^4`Vx!nNOhdFuB)BE?8nHU z6bEM`+@rRs^fj@R;{oiDi@0iKi1Q)v8c>yac%;O zREnRlj89upsEO2u6A*4oe`p0Sct`&9vT;tk#wP9&4Ir+$J{}G-=W_S-5!MpJV_Gd$xhQlnKDXX%c7K>Pek!0wiqOxD!9R$JKfqr9Ko0qvQSy991M6fB;`c|fcyRjK#v cM4hgDut$D}<~{OvMM|HSe list of doc IDs + inverted_index = defaultdict(set) + + for doc_id, content in documents.items(): + words = content.lower().replace('\n', ' ').split() + words = [''.join(c for c in word if c.isalnum()) for word in words] + words = [w for w in words if w] + + for word in words: + inverted_index[word].add(doc_id) + + inverted_index = {word: list(doc_ids) for word, doc_ids in inverted_index.items()} + print(f"Built index with {len(inverted_index)} unique words") + return inverted_index + + +def encrypt_index(inverted_index): + # encrypt index using Paillier + # for simplicity, we encrypt the hash of words and keep doc IDs in plaintext + # in production, you'd use more sophisticated techniques + encrypted_index = {} + + for word, doc_ids in inverted_index.items(): + # create a numeric representation of the word + word_hash = hash(word) % (10**6) # keep it manageable + encrypted_word = encrypt_number(word_hash) + encrypted_index[word] = { + 'encrypted_hash': encrypted_word, + 'doc_ids': doc_ids + } + + # save to file + with open("encrypted_index.pkl", "wb") as f: + pickle.dump(encrypted_index, f) + + print("Encrypted index saved") + return encrypted_index + + +def decrypt_index(encrypted_index): + # decrypt index hashes + decrypted_index = {} + + for word, data in encrypted_index.items(): + decrypted_hash = decrypt_number(data['encrypted_hash']) + decrypted_index[word] = { + 'hash': decrypted_hash, + 'doc_ids': data['doc_ids'] + } + + return decrypted_index + + +def encrypt_query(query): + # normalize and encrypt query + query = query.lower().strip() + query = ''.join(c for c in query if c.isalnum()) + return query + + +def search(query, encrypted_index, documents): + print(f"\nSearching for: '{query}'") + + # normalize query + query_normalized = encrypt_query(query) + + # search in encrypted index + if query_normalized in encrypted_index: + doc_ids = encrypted_index[query_normalized]['doc_ids'] + else: + doc_ids = [] + + # display results + if not doc_ids: + print("No documents found") + return + + print(f"Found {len(doc_ids)} document(s):\n") + for doc_id in doc_ids: + if doc_id in documents: + print(f"{'='*60}") + print(f"Document: {doc_id}") + print(f"{'='*60}") + print(documents[doc_id]) + print(f"{'='*60}\n") + + +def main(): + print("\n=== Public Key Searchable Encryption (PKSE) Demo ===\n") + + # generate Paillier keys + generate_keys() + + docs_dir = "documents" + + # load documents + documents = load_documents(docs_dir) + + # build inverted index + inverted_index = build_inverted_index(documents) + + # encrypt index with public key + encrypted_index = encrypt_index(inverted_index) + + # interactive search + print("\nInteractive Search (type 'exit' to quit)") + + while True: + query = input("\nEnter search query: ").strip() + + if query.lower() == 'exit': + break + + if query: + search(query, encrypted_index, documents) + + print("\nDemo Complete\n") + + +if __name__ == "__main__": + main() + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc1.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc1.md new file mode 100644 index 0000000..2643df4 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc1.md @@ -0,0 +1,5 @@ +# Introduction to Cryptography + +Cryptography is the practice and study of techniques for secure communication. +It involves encryption, decryption, and various security protocols. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc10.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc10.md new file mode 100644 index 0000000..f519336 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc10.md @@ -0,0 +1,5 @@ +# Blockchain and Cryptography + +Blockchain technology relies heavily on cryptographic hash functions. +Bitcoin and other cryptocurrencies use encryption for security. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc2.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc2.md new file mode 100644 index 0000000..fae8fba --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc2.md @@ -0,0 +1,5 @@ +# Symmetric Encryption + +Symmetric encryption uses the same key for encryption and decryption. +AES is a popular symmetric encryption algorithm used worldwide. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc3.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc3.md new file mode 100644 index 0000000..00c1383 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc3.md @@ -0,0 +1,5 @@ +# Asymmetric Encryption + +Asymmetric encryption uses a pair of keys: public and private. +RSA and ECC are examples of asymmetric encryption algorithms. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc4.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc4.md new file mode 100644 index 0000000..49ac46d --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc4.md @@ -0,0 +1,5 @@ +# Hash Functions + +Hash functions create fixed-size outputs from variable-size inputs. +SHA-256 and MD5 are commonly used hash functions in cryptography. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc5.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc5.md new file mode 100644 index 0000000..ef14b12 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc5.md @@ -0,0 +1,5 @@ +# Digital Signatures + +Digital signatures provide authentication and non-repudiation. +They use asymmetric encryption to verify the sender's identity. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc6.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc6.md new file mode 100644 index 0000000..169f546 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc6.md @@ -0,0 +1,5 @@ +# AES Encryption Standard + +AES stands for Advanced Encryption Standard. +It supports key sizes of 128, 192, and 256 bits for encryption. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc7.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc7.md new file mode 100644 index 0000000..6118304 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc7.md @@ -0,0 +1,5 @@ +# Public Key Infrastructure + +PKI manages digital certificates and public-key encryption. +It provides a framework for secure communication over networks. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc8.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc8.md new file mode 100644 index 0000000..14a5c5c --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc8.md @@ -0,0 +1,5 @@ +# Cryptographic Protocols + +Protocols like TLS and SSL ensure secure communication. +They combine encryption, authentication, and data integrity. + diff --git a/IS/Lab/Lab8_ProMax/SSE/documents/doc9.md b/IS/Lab/Lab8_ProMax/SSE/documents/doc9.md new file mode 100644 index 0000000..27be380 --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/documents/doc9.md @@ -0,0 +1,5 @@ +# Quantum Cryptography + +Quantum cryptography uses quantum mechanics for secure communication. +It provides theoretically unbreakable encryption using quantum key distribution. + diff --git a/IS/Lab/Lab8_ProMax/SSE/encrypted_index.bin b/IS/Lab/Lab8_ProMax/SSE/encrypted_index.bin new file mode 100644 index 0000000000000000000000000000000000000000..821847860f35437426be107cbfe7ff53bdd7bdfa GIT binary patch literal 3152 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 literal 0 HcmV?d00001 diff --git a/IS/Lab/Lab8_ProMax/SSE/sse.py b/IS/Lab/Lab8_ProMax/SSE/sse.py new file mode 100644 index 0000000..b7a8e9c --- /dev/null +++ b/IS/Lab/Lab8_ProMax/SSE/sse.py @@ -0,0 +1,177 @@ +import os +import json +from collections import defaultdict +from Crypto.Cipher import AES +from Crypto.Random import get_random_bytes +from Crypto.Util.Padding import pad, unpad +from bs4 import BeautifulSoup +from docx import Document +from pypdf import PdfReader + +AES_KEY = get_random_bytes(32) # 256-bit key + + +def encrypt_data(data): + cipher = AES.new(AES_KEY, AES.MODE_CBC) + iv = cipher.iv + if isinstance(data, str): + data = data.encode('utf-8') + encrypted = cipher.encrypt(pad(data, AES.block_size)) + return iv + encrypted + + +def decrypt_data(encrypted_data): + iv = encrypted_data[:16] + encrypted = encrypted_data[16:] + cipher = AES.new(AES_KEY, AES.MODE_CBC, iv) + decrypted = unpad(cipher.decrypt(encrypted), AES.block_size) + return decrypted + + +def extract_text(path): + # extract + ext = os.path.splitext(path)[1].lower() + if ext in [".md", ".txt"]: + with open(path, "r", errors="ignore") as f: + return f.read() + if ext == ".pdf": + try: + reader = PdfReader(path) + return "\n".join([(p.extract_text() or "") for p in reader.pages]) + except Exception: + return "" + if ext == ".docx": + try: + doc = Document(path) + return "\n".join([p.text for p in doc.paragraphs]) + except Exception: + return "" + if ext in [".html", ".htm"]: + with open(path, "r", errors="ignore") as f: + soup = BeautifulSoup(f.read(), "html.parser") + return soup.get_text(" ") + return "" + + +def convert_all_to_md(docs_dir): + # convert + for name in os.listdir(docs_dir): + path = os.path.join(docs_dir, name) + if os.path.isdir(path): + continue + base, ext = os.path.splitext(name) + ext = ext.lower() + if ext == ".md": + continue + text = extract_text(path) + if not text: + continue + md_path = os.path.join(docs_dir, base + ".md") + with open(md_path, "w") as f: + f.write(text) + + +def load_documents(docs_dir): + documents = {} + convert_all_to_md(docs_dir) + for filename in os.listdir(docs_dir): + if filename.endswith(".md"): + filepath = os.path.join(docs_dir, filename) + with open(filepath, "r") as f: + documents[filename] = f.read() + print(f"Loaded {len(documents)} documents") + return documents + + +def build_inverted_index(documents): + # word -> list of doc IDs + inverted_index = defaultdict(set) + + for doc_id, content in documents.items(): + words = content.lower().replace('\n', ' ').split() + words = [''.join(c for c in word if c.isalnum()) for word in words] + words = [w for w in words if w] + + for word in words: + inverted_index[word].add(doc_id) + + inverted_index = {word: list(doc_ids) for word, doc_ids in inverted_index.items()} + print(f"Built index with {len(inverted_index)} unique words") + return inverted_index + + +def encrypt_index(inverted_index): + # serialize and encrypt + serialized = json.dumps(inverted_index).encode('utf-8') + encrypted = encrypt_data(serialized) + with open("encrypted_index.bin", "wb") as f: + f.write(encrypted) + print("Encrypted index saved") + return encrypted + + +def decrypt_index(encrypted_index): + decrypted = decrypt_data(encrypted_index) + inverted_index = json.loads(decrypted.decode('utf-8')) + return inverted_index + + +def search(query, encrypted_index_data, documents): + print(f"\nSearching for: '{query}'") + + # decrypt index + inverted_index = decrypt_index(encrypted_index_data) + + # normalize query + query_normalized = query.lower().strip() + query_normalized = ''.join(c for c in query_normalized if c.isalnum()) + + # search + doc_ids = inverted_index.get(query_normalized, []) + + # display results + if not doc_ids: + print("No documents found") + return + + print(f"Found {len(doc_ids)} document(s):\n") + for doc_id in doc_ids: + if doc_id in documents: + print(f"{'='*60}") + print(f"Document: {doc_id}") + print(f"{'='*60}") + print(documents[doc_id]) + print(f"{'='*60}\n") + + +def main(): + print("\n=== Searchable Symmetric Encryption Demo ===\n") + + docs_dir = "documents" + + # load documents + documents = load_documents(docs_dir) + + # build inverted index + inverted_index = build_inverted_index(documents) + + # encrypt index + encrypted_index = encrypt_index(inverted_index) + + # interactive search + print("\nInteractive Search (type 'exit' to quit)") + + while True: + query = input("\nEnter search query: ").strip() + + if query.lower() == 'exit': + break + + if query: + search(query, encrypted_index, documents) + + print("\nDemo Complete\n") + + +if __name__ == "__main__": + main()