sidlglove

Untitled

Nov 7th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 50.94 KB | None | 0 0
  1. #1. Aim: Encrypting and decrypting with a Ceaser Cipher
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int k = 3;
  5. int base = 26;
  6.  
  7. string encrypt(string message){
  8.  
  9.     string en_str = message;
  10.     for(int i=0; i<message.length(); i++){
  11.         int element = en_str[i];
  12.         int ascii = element - 'A';
  13.         int new_element = (ascii + k)%base + 'A';
  14.         en_str[i] = new_element;
  15.     }
  16.    
  17.     return en_str;
  18. }
  19.  
  20.  
  21. string decrypt(string en_str){
  22.  
  23.     string de_str = en_str;
  24.     for(int i=0; i<en_str.length(); i++){
  25.         int element = de_str[i];
  26.         int ascii = element - 'A';
  27.         int new_element = (ascii - k);
  28.         if (new_element < 0)
  29.             new_element = 26 + new_element;
  30.            
  31.         new_element = new_element%base + 'A';
  32.         de_str[i] = new_element;
  33.     }
  34.    
  35.     return de_str;
  36. }
  37.  
  38.  
  39. int main(){
  40.  
  41.     string message = "CRYPTOGRAPHY";
  42.     string en_str = encrypt(message);
  43.     cout<<endl;
  44.     cout<<en_str<<endl;
  45.    
  46.     string de_str = decrypt(en_str);
  47.     cout<<de_str<<endl;
  48.    
  49.     return 0;
  50.  
  51. }
  52.  
  53.  
  54.  
  55. #2: Aim: decrypting a encrypted word to find its original word and key
  56.  
  57. #include<iostream>
  58. #include<bits/stdc++.h>
  59. using namespace std;
  60.  
  61. int base = 26;
  62.  
  63. string encrypt(string message, int k){
  64.  
  65.     string en_str = message;
  66.     for(int i=0; i<message.length(); i++){
  67.         int element = en_str[i];
  68.         int ascii = element - 'A';
  69.         int new_element = (ascii + k)%base + 'A';
  70.         en_str[i] = new_element;
  71.     }
  72.    
  73.     return en_str;
  74. }
  75.  
  76.  
  77. string decrypt(string en_str, int k){
  78.  
  79.     string de_str = en_str;
  80.     for(int i=0; i<en_str.length(); i++){
  81.         int element = de_str[i];
  82.         int ascii = element - 'A';
  83.         int new_element = (ascii - k);
  84.         if (new_element < 0)
  85.             new_element = 26 + new_element;
  86.            
  87.         new_element = new_element%base + 'A';
  88.         de_str[i] = new_element;
  89.     }
  90.    
  91.     return de_str;
  92. }
  93.  
  94.  
  95. int main(){
  96.  
  97.     string en_str = "FQOCUDEM";
  98.     //string en_str = encrypt(message);
  99.     //cout<<endl;
  100.     //cout<<en_str<<endl;
  101.    
  102.     for(int i=0; i<base; i++){
  103.         string de_str = decrypt(en_str, i);
  104.         cout<<i<<". "<<de_str<<endl;
  105.     }
  106.     return 0;
  107.  
  108. }
  109.  
  110. #3: Aim: Encryption using Playfair cipher.
  111.  
  112. #include <bits/stdc++.h>
  113. using namespace std;
  114. map<char, pair<int,int> > reconvert;
  115. map<pair<int,int>, char> convert;
  116. void playfair_matrix(string key){
  117.     map<char, bool> temp;
  118.     int r=0, c=0;
  119.     for(int i=0; i<key.size(); ++i){
  120.         if(isalpha(key[i]) and key[i]!='J' and temp.find(key[i])==temp.end()){
  121.             temp[key[i]] = true;
  122.             reconvert[key[i]] = {r,c};
  123.             convert[{r,c}] = key[i];
  124.             ++c;
  125.             if(c == 5)
  126.                 ++r, c=0;
  127.         }
  128.     }
  129.     for(char ch='A'; ch<='Z'; ++ch){
  130.         if(ch!='J' and temp.find(ch) == temp.end()){
  131.             temp[ch] = true;
  132.             reconvert[ch] = {r,c};
  133.             convert[{r,c}] = ch;
  134.             ++c;
  135.             if(c == 5)
  136.                 ++r, c=0;
  137.         }
  138.     }
  139. }
  140. string cipher_text(string plain_text){
  141.     int n = 0;
  142.     for(int i=0; i<plain_text.size(); ++i){
  143.         if(isalpha(plain_text[i]))
  144.             plain_text[n++] = plain_text[i];
  145.     }
  146.     plain_text.erase(plain_text.begin()+n, plain_text.end());
  147.     int i = 0;
  148.     while(i<plain_text.size() and i+1<plain_text.size()){
  149.         if(plain_text[i] == plain_text[i+1])
  150.             plain_text.insert(plain_text.begin()+i+1, 'X');
  151.         else
  152.             i += 2;
  153.     }
  154.     if(plain_text.size()%2 == 1)
  155.         plain_text.push_back('X');
  156.     string ret(plain_text.size(), ' ');
  157.     pair<int,int> pos1, pos2;
  158.     for(int i=0,j=1; j<plain_text.size(); i+=2,j+=2){
  159.         pos1 = reconvert[plain_text[i]];
  160.         pos2 = reconvert[plain_text[j]];
  161.         if(pos1.first == pos2.first){
  162.             ret[i] = convert[{pos1.first,(pos1.second+1)%5}];
  163.             ret[j] = convert[{pos2.first,(pos2.second+1)%5}];
  164.         }
  165.         else if(pos1.second == pos2.second){
  166.             ret[i] = convert[{(pos1.first+1)%5,pos1.second}];
  167.             ret[j] = convert[{(pos2.first+1)%5,pos2.second}];
  168.         }
  169.         else{
  170.             ret[i] = convert[{pos1.first,pos2.second}];
  171.             ret[j] = convert[{pos2.first,pos1.second}];
  172.         }
  173.     }
  174.     return ret;
  175. }
  176. string decipher_text(string cipher_text){
  177.     string ret(cipher_text.size(), ' ');
  178.     pair<int,int> pos1, pos2;
  179.     for(int i=0,j=1; j<cipher_text.size(); i+=2,j+=2){
  180.         pos1 = reconvert[cipher_text[i]];
  181.         pos2 = reconvert[cipher_text[j]];
  182.         if(pos1.first == pos2.first){
  183.             ret[i] = convert[{pos1.first,(pos1.second+4)%5}];
  184.             ret[j] = convert[{pos2.first,(pos2.second+4)%5}];
  185.         }
  186.         else if(pos1.second == pos2.second){
  187.             ret[i] = convert[{(pos1.first+4)%5,pos1.second}];
  188.             ret[j] = convert[{(pos2.first+4)%5,pos2.second}];
  189.         }
  190.         else{
  191.             ret[i] = convert[{pos1.first,pos2.second}];
  192.             ret[j] = convert[{pos2.first,pos1.second}];
  193.         }
  194.     }
  195.     int n = 0;
  196.     for(int i=0; i<ret.size(); ++i){
  197.         if(ret[i] != 'X'){
  198.             ret[n++] = ret[i];
  199.         }
  200.     }
  201.     ret.erase(ret.begin()+n, ret.end());
  202.     return ret;
  203. }
  204. int main() {
  205.     string key, plain_text,  cipher_text;
  206.     getline(cin,key);
  207.     getline(cin,plain_text);
  208.     transform(key.begin(), key.end(), key.begin(), towupper);
  209.     transform(plain_text.begin(), plain_text.end(), plain_text.begin(), towupper);
  210.     playfair_matrix(key);
  211.     for(int i=0; i<5; ++i){
  212.         for(int j=0; j<5; ++j){
  213.             cout<<convert[{i,j}]<<" ";
  214.         }
  215.         cout<<endl;
  216.     }
  217.     cout<<(cipher_text = cipher_text(plain_text))<<endl;
  218.     cout<<decipher_text(cipher_text)<<endl;
  219.     return 0;
  220. }
  221.  
  222.  
  223. #4: To implement Vignere cipher
  224.  
  225. #include<bits/stdc++.h>
  226. using namespace std;
  227.  
  228. string string1 = "lifeisfullofsurprises";
  229. string keyword = "health";
  230.  
  231. int main(){
  232.  
  233. int keylen = keyword.length();
  234. int plainlen = string1.length();
  235.  
  236. int n = ceil(float(plainlen)/keylen);
  237. string r = "";
  238.  
  239. for(int i=0; i<n; i++){
  240.     r += keyword;
  241. }
  242.  
  243. //string s = r.substr(0, (r.length() - plainlen%keylen));
  244. string encrypted = "";
  245.  
  246. for(int i=0; i<string1.length(); i++){
  247.     int j = (r[i] - 'a') + (string1[i] - 'a');
  248.     j = j%26;
  249.     char ch = j + 'a';
  250.     encrypted += ch;
  251. }
  252.  
  253. cout<<encrypted<<endl;
  254.  
  255. return 0;
  256. }
  257.  
  258.  
  259.  
  260.  
  261. #5: To implement Transposition cipher:
  262.  
  263. #include<bits/stdc++.h>
  264. using namespace std;
  265.  
  266. bool cmp(pair<int,int> a,pair<int,int> b){
  267. if(a.first<b.first)
  268. return true;
  269. return false;
  270. }
  271.  
  272. int main(){
  273. int n=6;
  274. int arr[6] = {3, 2, 6, 1, 5, 4};
  275.  
  276. vector<pair<int,int> > v;
  277.    
  278. for(int i=0;i<n;i++)
  279.     v.push_back(make_pair(arr[i],i));
  280.  
  281. sort(v.begin(),v.end(),cmp);
  282.  
  283. for(int i=0;i<n;i++)
  284.     cout<<v[i].second+1<<" ";
  285.    
  286. cout<<endl;
  287. }
  288.  
  289.  
  290.  
  291.  
  292.  
  293. #6: To implement one-time pad version Vignere cipher:
  294.  
  295. #include<bits/stdc++.h>
  296. using namespace std;
  297.  
  298. string string1 = "sendmoremoney";
  299. string string2 = "cashnotneeded";
  300.  
  301. int arr[13] = {90, 1, 7, 23, 15, 21, 14, 11, 11, 2, 8, 9, 1};
  302.  
  303. int main(){
  304.  
  305. string ciphertext = "";
  306. vector<int> v;
  307.  
  308. for(int i=0; i<string1.length(); i++){
  309.     int j = (string1[i] - 'a' + arr[i])%26;
  310.     char ch = j + 'a';
  311.     ciphertext += ch;
  312. }
  313.  
  314. cout<<ciphertext<<endl;
  315.  
  316. for(int i=0; i<string1.length(); i++){
  317.     int j = (string2[i] - 'a' - ciphertext[i] - 'a')%26;
  318.     if(j < 0) j += 26;
  319.     v.push_back(j);
  320.     cout<<j<<" ";
  321. }
  322.  
  323. cout<<endl;
  324. return 0;
  325.  
  326. }
  327.  
  328.  
  329.  
  330. #7: To implement Autokey cipher:
  331.  
  332. #include<bits/stdc++.h>
  333. using namespace std;
  334.  
  335. int main(){
  336.    
  337. int key = 7;
  338.  
  339. string plain = "thehouseisbeingsoldtonight", enc, dec;
  340.  
  341. enc=(plain[0]+key-'a')%26+'a';
  342.  
  343. for(int i=1;i<plain.length();i++){
  344.     enc+=(plain[i]+plain[i-1]-'a'-'a')%26+'a';
  345. }
  346.  
  347. cout<<enc<<endl;
  348.  
  349. dec=(enc[0]-'a'-key+26)%26+'a';
  350.  
  351. for(int i=1;i<plain.length();i++){
  352.     dec+=(enc[i]-dec[i-1]+26)%26+'a';
  353. }
  354.  
  355. cout<<dec;
  356. cout<<endl;
  357. return 0;
  358. }
  359.  
  360.  
  361. 9. Implement addition, multiplication and inverse operation on GF(2 power 4) with Irreducible polynomial 10011.
  362.  
  363. Code:
  364.  
  365. #include<bits/stdc++.h>
  366. #define N 2
  367. using namespace std;
  368. string MOD;
  369. string dp[N][N],idp[N][N],C[N][N];
  370.  
  371. string stuffZero(string s,int n)
  372. {   while(s.length()<n)
  373.         s='0'+s;
  374.     return s;
  375. }
  376.  
  377. int binaryToInt(string s)
  378. {   int ans=0; 
  379.     reverse(s.begin(),s.end());
  380.     for(int i=0;i<s.length();i++)
  381.         ans+=(1<<i)*(s[i]-'0');
  382.     return ans;
  383. }
  384.  
  385. string intToBinary(int num)
  386. {   string ans="";
  387.     while(num)
  388.     {   char c=num%2;
  389.         ans+=(c+'0');
  390.         num/=2;
  391.     }
  392.     reverse(ans.begin(),ans.end());
  393.     return ans;
  394. }
  395.  
  396. int len(int n){
  397.     int m=0;
  398.     while(n){
  399.         n=n/2;
  400.         m++;
  401.     }
  402.     return m;
  403. }
  404.  
  405. string divide(string m,string MOD) {
  406.     int mod=binaryToInt(MOD),n=binaryToInt(m);
  407.     while(len(n)>=len(mod)){
  408.         n=n^(mod<<(len(n)-len(mod)));
  409.     }
  410.     return intToBinary(n);
  411. }
  412.  
  413. string add( string s, string p ) {
  414.     int n=binaryToInt(s),m=binaryToInt(p);
  415.     return divide(intToBinary(n^m), MOD);
  416. }
  417. string mul( string s, string p){
  418.     int n = binaryToInt(s),m = binaryToInt(p),ans=0;
  419.     for(int i=0;(1<<i)<=n;i++){
  420.         if(n&(1<<i))
  421.             ans=ans^(m<<i);
  422.     }
  423.     return divide(intToBinary(ans), MOD);
  424. }
  425.  
  426. void matrixMul(string A[N][N],string B[N][N]){
  427.     for(int i=0;i<N;i++)
  428.         for(int j=0;j<N;j++){
  429.         C[i][j]="0";
  430.             for(int k=0;k<N;k++)
  431.                 C[i][j]=add(C[i][j],mul(A[i][k],B[k][j]));
  432. }  
  433. }
  434.  
  435.  
  436.  
  437. int main()
  438. {
  439.     int c;
  440.     char t='y';
  441.     string s,p;
  442.     cout<<"Enter Irreducible polynomial : ";
  443.     cin>>MOD;
  444.  
  445.     while(t == 'y'){
  446.     cout<<"\nEnter 1:Addition  2:Multiplication  3:Inverse Operation : ";
  447.     cin>>c;
  448.  
  449.     switch(c){
  450.  
  451.         case 1:{
  452.             cout<<"\nADDITION\nEnter the two polynomials : ";
  453.             cin>>s>>p;
  454.             cout<<"Resultant polynomial : "<<stuffZero(add(s,p),2*N)<<endl;
  455.             break;
  456.         }  
  457.  
  458.         case 2:{
  459.             cout<<"\nMULTIPLICATION\nEnter the two polynomials : ";
  460.             cin>>s>>p;
  461.             cout<<"Resultant polynomial : "<<stuffZero(mul(s,p),2*N);
  462.             break;     
  463.         }
  464.  
  465.         case 3:{
  466.             cout<<"\nINVERSE OF A MATRIX\nEnter the matrix :\n";
  467.             for(int i=0;i<N;i++)
  468.                 for(int j=0;j<N;j++)
  469.                     cin>>dp[i][j];
  470.  
  471.             string det=add(mul(dp[0][0],dp[1][1]),mul(dp[0][1],dp[1][0]));
  472.             cout<<"Result of inverse operation : \n";
  473.             idp[0][0]=divide(dp[1][1],det);
  474.             idp[0][1]=divide(dp[1][0],det);
  475.             idp[1][0]=divide(dp[0][1],det);
  476.             idp[1][1]=divide(dp[0][0],det);
  477.             for(int i=0;i<N;i++){
  478.                 for(int j=0;j<N;j++)
  479.                     cout<<stuffZero(idp[i][j],2*N)<<" ";
  480.                 cout<<endl;
  481.             }
  482.         }
  483.     }
  484.  
  485.     cout<<"\nWant to perform more operations ? (y/n) : ";
  486.     cin>>t;
  487.     }
  488.     return 0;
  489. }
  490.  
  491.  
  492. Output:
  493.  
  494.  
  495.  
  496.  
  497.  
  498. 10. Implement Mix Column and Inverse Mix Column operations in S – AES with previous Matrix as key.
  499.  
  500. Code:
  501.  
  502. #include<bits/stdc++.h>
  503. #define N 2
  504. using namespace std;
  505. string MOD;
  506. string dp[N][N],idp[N][N],C[N][N];
  507. string stuffZero(string s,int n)
  508. {   while(s.length()<n)
  509.         s='0'+s;
  510.     return s;
  511. }
  512. int binaryToInt(string s)
  513. {   int ans=0; 
  514.     reverse(s.begin(),s.end());
  515.     for(int i=0;i<s.length();i++)
  516.         ans+=(1<<i)*(s[i]-'0');
  517.     return ans;
  518. }
  519. string intToBinary(int num)
  520. {   string ans="";
  521.     while(num)
  522.     {   char c=num%2;
  523.         ans+=(c+'0');
  524.         num/=2;
  525.     }
  526.     reverse(ans.begin(),ans.end());
  527.     return ans;
  528. }
  529. int len(int n){
  530.     int m=0;
  531.     while(n){
  532.         n=n/2;
  533.         m++;
  534.     }
  535.     return m;
  536. }
  537. string divide(string m,string MOD)
  538. {   int mod=binaryToInt(MOD),n=binaryToInt(m);
  539.     while(len(n)>=len(mod)){
  540.         n=n^(mod<<(len(n)-len(mod)));
  541.     }
  542.     return intToBinary(n);
  543. }
  544. string add( string s, string p )
  545. {   int n=binaryToInt(s),m=binaryToInt(p);
  546.     return divide(intToBinary(n^m), MOD);
  547. }
  548. string mul( string s, string p)
  549. {   int n = binaryToInt(s),m = binaryToInt(p),ans=0;
  550.     for(int i=0;(1<<i)<=n;i++){
  551.         if(n&(1<<i))
  552.             ans=ans^(m<<i);
  553.     }
  554.     return divide(intToBinary(ans), MOD);
  555. }
  556. void matrixMul(string A[N][N],string B[N][N]){
  557.     for(int i=0;i<N;i++){
  558.         for(int j=0;j<N;j++){
  559.         C[i][j]="0";
  560.             for(int k=0;k<N;k++)
  561.                 C[i][j]=add(C[i][j],mul(A[i][k],B[k][j]));
  562.         }
  563.     }
  564. }
  565. int main()
  566. {
  567.      int t,c;
  568.     string s,p;
  569.     MOD="10011";
  570.     cout<<"\n** S-AES Encryption **\nEnter the matrix\n";
  571.     for(int i=0;i<N;i++)
  572.         for(int j=0;j<N;j++)
  573.             cin>>dp[i][j];
  574.     string det=add(mul(dp[0][0],dp[1][1]),mul(dp[0][1],dp[1][0]));
  575.     idp[0][0]=divide(dp[1][1],det);
  576.     idp[0][1]=divide(dp[1][0],det);
  577.     idp[1][0]=divide(dp[0][1],det);
  578.     idp[1][1]=divide(dp[0][0],det);
  579.     string A[N][N]={{"0110","1111"},{"0110","1011"}};
  580.     matrixMul(A,dp);
  581.     cout<<"\nMIX COLUMN: \n";
  582.     for(int i=0;i<N;i++){
  583.         for(int j=0;j<N;j++)
  584.             cout<<stuffZero(C[i][j],2*N)<<" ";
  585.         cout<<endl;
  586.     }
  587.     cout<<endl;
  588.     matrixMul(A,idp);
  589.     cout<<"\nINVERSE MIX COLUMN: \n";
  590.     for(int i=0;i<N;i++){
  591.         for(int j=0;j<N;j++)
  592.             cout<<stuffZero(C[i][j],2*N)<<" ";
  593.         cout<<endl;
  594.     }
  595.     cout<<endl;
  596.     return 0;
  597. }
  598.  
  599. OUTPUT:
  600.        
  601.    
  602.  
  603.  
  604.  
  605.  
  606. 11. Implement RC4 encryption algorithm
  607.  
  608.  
  609. #include<bits/stdc++.h>
  610. using namespace std;
  611. int main()
  612. {
  613.     string plain;
  614.     string key="01010000";
  615.     int keylength=key.length();
  616.     cin>>plain;
  617.    
  618.     vector<int> S(256);
  619.     vector<int> T(256);
  620.    
  621.    
  622.     for(int i=0;i<=255;i++)
  623.     {
  624.         S[i]=i;
  625.         T[i]=key[i%keylength]-'0';
  626.     }
  627.    
  628.     int j=0;
  629.    
  630.     for(int i=0;i<=255;i++)
  631.     {
  632.         j=(j+S[i]+T[i])%256;
  633.         int temp=S[i];
  634.         S[i]=S[j];
  635.         S[j]=temp;
  636.        
  637.     }
  638.    
  639.     int i=0;
  640.     j=0;
  641.     int k;
  642.     while(true)
  643.     {
  644.         i=(i+1)%256;
  645.         j=(j+S[i])%256;
  646.         int temp=S[i];
  647.         S[i]=S[j];
  648.         S[j]=temp;
  649.         for(int x=0;x<=255;x++)
  650.         cout<<S[x]<<" ";
  651.         cout<<endl;
  652.         k=S[(S[i]+S[j])%256];
  653.         cout<<k<<endl;
  654.         vector<int> bin(8);
  655.         int index=7;
  656.         while(k)
  657.         {
  658.             int x1=k%2;
  659.             bin[index--]=x1;
  660.             k=k/2;
  661.         }
  662.         string cipher="";
  663.         for(int x=0;x<8;x++)
  664.             cipher.push_back(((plain[x]-'0') xor bin[x])+'0');
  665.         cout<<cipher;
  666.         cin>>plain;
  667.     }
  668. }
  669.  
  670.  
  671.  
  672.  
  673.  
  674. RC4 alternate code
  675. #include <bits/stdc++.h>
  676. using namespace std;
  677.  
  678. int main() {
  679.     int n, k;
  680.     cin>>n;
  681.     vector<int> plain_text(n);
  682.     for(int i=0; i<n; ++i)
  683.         cin>>plain_text[i];
  684.     cin>>k;
  685.     vector<int> key(256);
  686.     for(int i=0; i<k; ++i)
  687.         cin>>key[i];
  688.     int s[256];
  689.     for(int i=0; i<256; ++i){
  690.         s[i] = i;
  691.         key[i] = key[i%k];
  692.     }
  693.     int i=0, j=0, t=0;
  694.     for(int i=0; i<256; ++i){
  695.         j = (j + s[i] + key[i])%256;
  696.         swap(s[i],s[j]);
  697.     }
  698.     i = j = 0;
  699.     vector<int> cipher(n), decipher(n);
  700.     for(int p=0; p<n; ++p){
  701.         i = (i + 1)%256;
  702.         j = (j + s[i])%256;
  703.         swap(s[i],s[j]);
  704.         t = s[(s[i]+s[j])%256];
  705.         cipher[p] = plain_text[p] ^ t;
  706.         decipher[p] = cipher[p] ^ t;
  707.     }
  708.     for(int i=0; i<n; ++i)
  709.         cout<<cipher[i]<<" ";
  710.     cout<<endl;
  711.     for(int i=0; i<n; ++i)
  712.         cout<<decipher[i]<<" ";
  713.     cout<<endl;
  714.     return 0;
  715. }
  716.  
  717.  
  718.  
  719.  
  720. //////RC5
  721. #include <bits/stdc++.h>
  722. using namespace std;
  723. typedef unsigned long long ll;
  724. const double e = 2.718281828459;
  725. const double f = 1.61803398875;
  726. ll w, r, b, u, t, c, p, q, MOD;
  727.  
  728. ll odd(double val){
  729.     ll fl = val;
  730.     if(fl & 1)
  731.         return fl;
  732.     return fl+1;
  733. }
  734.  
  735. ll left_circular_Shift(ll num, ll shift){
  736.     shift %= w;
  737.     return ((1ull<<w)-1) & ((num << shift) | (num >> (w-shift)));
  738. }
  739.  
  740. ll right_circular_Shift(ll num, ll shift){
  741.     shift %= w;
  742.     return ((1ull<<w)-1) & ((num >> shift) | (num << (w-shift)));
  743. }
  744.  
  745. int main() {
  746.     cin>>w>>r>>b;
  747.     MOD = 1ull << w;
  748.     t = 2*r+2;
  749.     u = w / 8;
  750.     c = ceil(b*1.0/u);
  751.     p = odd((e-2)*(1ll<<w));
  752.     q = odd((f-1)*(1ll<<w));
  753.     ll plain_text, cipher_text;
  754.     cin>>plain_text;
  755.     vector<ll> key(b), L(c), S(t);
  756.     for(int i=0; i<b; ++i)
  757.         cin>>key[i];
  758.     for(int i=b-1; i>=0; --i)
  759.         L[i/u] = (L[i/u] << 8ull) + key[i];
  760.     S[0] = p;
  761.     for(int i=1; i<t; ++i)
  762.         S[i] = (S[i-1] + q)%MOD;
  763.     ll i=0, j=0;
  764.     ll A=0, B=0;
  765.     for(int z=0; z<3*max(t,c); ++z){
  766.         A = S[i] = left_circular_Shift(((S[i] + A)%MOD + B)%MOD, 3);
  767.         B = L[j] = left_circular_Shift(((L[j] + A)%MOD + B)%MOD, (A + B));
  768.         i = (i + 1)%t;
  769.         j = (j + 1)%c;
  770.     }
  771.     A = plain_text >> w;
  772.     B = ((1ull<<w)-1) & plain_text;
  773.     A = (A + S[0])%MOD;
  774.     B = (B + S[1])%MOD;
  775.     for(int z=1; z<=r; ++z){
  776.         A = (left_circular_Shift((A ^ B), B) + S[2*z])%MOD;
  777.         B = (left_circular_Shift((A ^ B), A) + S[2*z+1])%MOD;
  778.     }
  779.     cipher_text = (A << w) | B;
  780.     cout<<cipher_text<<endl;
  781.     for(int z=r; z>0; --z){
  782.         B = right_circular_Shift(B - S[2*z+1], A) ^ A;
  783.         A = right_circular_Shift(A - S[2*z], B) ^ B;
  784.     }
  785.     B = B - S[1];
  786.     A = A - S[0];
  787.     plain_text = (A << w) | B;
  788.     cout<<plain_text<<endl;
  789.     return 0;
  790. }
  791.  
  792.  
  793. 12. Implement Fast Exponent Method:
  794.  
  795. #include<bits/stdc++.h>
  796. using namespace std;
  797.  
  798. int fast_expo(int base,int power,int mod)
  799. {
  800.     int res=1;
  801.     while(power>0)
  802.     {
  803.         if(power & 1)
  804.             res=(res%mod * base%mod)%mod;
  805.         power=power>>1;
  806.         base=(base%mod * base%mod)%mod;
  807.     }
  808.     return res;
  809. }
  810.  
  811. int main()
  812. {
  813.     int a,b,c;
  814.     cin>>a>>b>>c;
  815.     cout<<fast_expo(a,b,c)<<endl;
  816. }
  817.  
  818.  
  819.  
  820. 13. Implement Euler Totient Function:
  821.  
  822.  
  823. #include<bits/stdc++.h>
  824. using namespace std;
  825.  
  826. int euler_totient(int n)
  827. {
  828.         float ans=n;
  829.         for(int i=2;i*i<=n;i++)
  830.         {
  831.                 if(n%i==0)
  832.                         ans*=(1.0-(1.0/(float)i));
  833.                 while(n%i==0)
  834.                         n=n/i;
  835.         }
  836.         if(n>1)
  837.                 ans*=(1.0-(1.0/(float)n));
  838.         return ans;
  839. }
  840.  
  841. int main()
  842. {
  843.         int n;
  844.         cin>>n;
  845.         cout<<euler_totient(n)<<endl;
  846. }
  847.  
  848.  
  849. #Affine cipher
  850.  
  851.  
  852. #include <bits/stdc++.h>
  853. using namespace std;
  854.  
  855. int extended_euclid(int a, int b, int& x, int& y){
  856.     if(b == 0){
  857.         x = 1;
  858.         y = 0;
  859.         return a;
  860.     }
  861.     int g = extended_euclid(b, a%b, x, y);
  862.     int temp = y;
  863.     y = x - (a/b)*y;
  864.     x = temp;
  865.     return g;
  866. }
  867.  
  868. int modular_inverse(int a, int mod){
  869.     int x, y;
  870.     int g = extended_euclid(a, mod, x, y);
  871.     if(g != 1)
  872.         return 0;
  873.     return (x + mod)%mod;
  874. }
  875.  
  876. string affine_cipher(string p, int a, int b, int mod){
  877.     string ret(p.size(), ' ');
  878.     for(int i=0; i<p.size(); ++i){
  879.         if(p[i] == ' ')
  880.             ret[i] = p[i];
  881.         else
  882.             ret[i] = 'a' + (((p[i]-'a')*a + b)%mod + mod)%mod;
  883.     }
  884.     return ret;
  885. }
  886.  
  887. string affine_decipher(string c, int a, int b, int mod){
  888.     string ret(c.size(), ' ');
  889.     int a_inv = modular_inverse(a,mod);
  890.     for(int i=0; i<c.size(); ++i){
  891.         if(c[i] == ' ')
  892.             ret[i] = c[i];
  893.         else
  894.             ret[i] = 'a' + ((((c[i]-'a') - b)*a_inv)%mod + mod)%mod;
  895.     }
  896.     return ret;
  897. }
  898.  
  899. int main() {
  900.     string p, c;
  901.     int a, b, mod;
  902.     getline(cin,p);
  903.     cin>>a>>b>>mod;
  904.     cout<<(c = affine_cipher(p,a,b,mod))<<endl;
  905.     cout<<affine_decipher(c,a,b,mod)<<endl;
  906.     return 0;
  907. }
  908.  
  909.  
  910. multiplicative cipher
  911.  
  912.  
  913.  
  914. #include <bits/stdc++.h>
  915. using namespace std;
  916.  
  917. int extended_euclid(int a, int b, int& x, int& y){
  918.     if(b == 0){
  919.         x = 1;
  920.         y = 0;
  921.         return a;
  922.     }
  923.     int g = extended_euclid(b, a%b, x, y);
  924.     int temp = y;
  925.     y = x - (a/b)*y;
  926.     x = temp;
  927.     return g;
  928. }
  929.  
  930. int modular_inverse(int a, int mod){
  931.     int x, y;
  932.     int g = extended_euclid(a, mod, x, y);
  933.     if(g != 1)
  934.         return 0;
  935.     return (x + mod)%mod;
  936. }
  937.  
  938. string multiplicative_cipher(string p, int mul){
  939.     string ret(p.size(), ' ');
  940.     for(int i=0; i<p.size(); ++i){
  941.         if(p[i] == ' ')
  942.             ret[i] = p[i];
  943.         else
  944.             ret[i] = 'a' + (((p[i]-'a')*mul)%26 + 26)%26;
  945.     }
  946.     return ret;
  947. }
  948.  
  949. string multiplicative_decipher(string c, int mul){
  950.     string ret(c.size(), ' ');
  951.     int a_inv = modular_inverse(mul,26);
  952.     for(int i=0; i<c.size(); ++i){
  953.         if(c[i] == ' ')
  954.             ret[i] = c[i];
  955.         else
  956.             ret[i] = 'a' + (((c[i]-'a')*a_inv)%26 + 26)%26;
  957.     }
  958.     return ret;
  959. }
  960.  
  961. int main() {
  962.     string p, c;
  963.     int mul;
  964.     getline(cin,p);
  965.     cin>>mul;
  966.     cout<<(c = multiplicative_cipher(p,mul))<<endl;
  967.     cout<<multiplicative_decipher(c,mul)<<endl;
  968.     return 0;
  969. }
  970.  
  971.  
  972.  
  973.  
  974. 14. Implement Modular Multiplicative Inverse using Extended Eucledian method.
  975.  
  976.  
  977. #include<bits/stdc++.h>
  978. using namespace std;
  979.  
  980. int gcdextended(int a,int b,int *x,int *y)
  981. {
  982.         if(a==0)
  983.         {
  984.                 *x=0;
  985.                 *y=1;
  986.                 return b;
  987.         }
  988.         int x1,y1;
  989.         int g=gcdextended(b%a,a,&x1,&y1);
  990.         *x=y1-(b/a)*x1;
  991.         *y=x1;
  992.         return g;
  993. }
  994.  
  995. int mod_inv(int n,int mod)
  996. {
  997.         int x,y;
  998.         int g=gcdextended(n,mod,&x,&y);
  999.         if(g!=1)
  1000.                 cout<<"Inverse doesn't exist"<<endl;
  1001.         else
  1002.         {
  1003.                 int res=(x%mod+mod)%mod;
  1004.                 return res;
  1005.         }
  1006. }
  1007.  
  1008. int main()
  1009. {
  1010.         int n;
  1011.         int mod;
  1012.         cin>>n>>mod;
  1013.         cout<<mod_inv(n,mod)<<endl;
  1014. }
  1015.  
  1016. 15. Find the private key for RSA:
  1017.  
  1018. #include <bits/stdc++.h>
  1019. using namespace std;
  1020.  
  1021. int fast_exponentiation(int a, int b, int MOD){
  1022.     int ret = 1;
  1023.     a = a % MOD;
  1024.     while(b != 0){
  1025.         if(b & 1)
  1026.             ret = (ret * 1ll * a)%MOD;
  1027.         a = (a * 1ll * a)%MOD;
  1028.         b >>= 1;
  1029.     }
  1030.     return ret;
  1031. }
  1032.  
  1033. int extended_euclidean(int a, int b, int& x, int& y){
  1034.     if(a == 0){
  1035.         x = 0;
  1036.         y = 1;
  1037.         return b;
  1038.     }
  1039.     int xx, yy;
  1040.     int g = extended_euclidean(b%a, a, xx, yy);
  1041.     y = xx;
  1042.     x = yy - (b*1ll/a) * xx;
  1043.     return g;
  1044. }
  1045.  
  1046. int modular_inverse(int a, int MOD){
  1047.     int x, y;
  1048.     if(extended_euclidean(a,MOD,x,y) != 1)
  1049.         return 0;
  1050.     return (x + MOD)%MOD;
  1051. }
  1052.  
  1053. int phi(int n){
  1054.     int ret = n;
  1055.     if(n%2 == 0){
  1056.         ret -= ret / 2ll;
  1057.         while(n%2 == 0)
  1058.             n /= 2;
  1059.     }
  1060.     int factor = 3;
  1061.     int max_factor = sqrt(n);
  1062.     while(n!=1 and factor<=max_factor){
  1063.         if(n%factor == 0){
  1064.             ret -= ret / factor;
  1065.             while(n%factor == 0)
  1066.                 n /= factor;
  1067.             max_factor = sqrt(n);
  1068.         }
  1069.         factor += 2;
  1070.     }
  1071.     if(n != 1)
  1072.         ret -= ret / n;
  1073.     return ret;
  1074. }
  1075.  
  1076. int findPrivateKey(int e, int p, int q){
  1077.     int n = p * q;
  1078.     int phi_n = (p-1) * (q-1);
  1079.     int d = modular_inverse(e,phi_n);
  1080.     return d;
  1081. }
  1082.  
  1083. vector<int> RSAEncrypt(vector<int> plain_text, int e, int p, int q){
  1084.     int n = p * q;
  1085.     vector<int> cipher_text(plain_text.size());
  1086.     for(int i=0; i<plain_text.size(); ++i)
  1087.         cipher_text[i] = fast_exponentiation(plain_text[i],e,n);
  1088.     return cipher_text;
  1089. }
  1090.  
  1091. vector<int> RSADecrypt(vector<int> cipher_text, int d, int p, int q){
  1092.     int n = p * q;
  1093.     vector<int> plain_text(cipher_text.size());
  1094.     for(int i=0; i<cipher_text.size(); ++i)
  1095.         plain_text[i] = fast_exponentiation(cipher_text[i],d,n);
  1096.     return plain_text;
  1097. }
  1098.  
  1099. int main() {
  1100.     int p, q, e, d;
  1101.     //cout<<"Enter values of p, q, e: ";
  1102.     cin>>p>>q>>e;
  1103.     d = findPrivateKey(e,p,q);
  1104.     cout<<"Private Key = "<<d<<endl;
  1105.     string str;
  1106.     cin>>str;
  1107.     vector<int> plain_text;
  1108.     for(int i=0; i<str.size(); ++i)
  1109.         plain_text.push_back((int)str[i]);
  1110.     vector<int> cipher_text = RSAEncrypt(plain_text,e,p,q);
  1111.     for(int i=0; i<cipher_text.size(); ++i)
  1112.         cout<<cipher_text[i]<<" ";
  1113.     cout<<endl;
  1114.     plain_text = RSADecrypt(cipher_text,d,p,q);
  1115.     for(int i=0; i<plain_text.size(); ++i)
  1116.         cout<<plain_text[i]<<" ";
  1117.     cout<<endl;
  1118.     return 0;
  1119. }
  1120.  
  1121.  
  1122. elliptic curve
  1123.  
  1124.  
  1125. #include <bits/stdc++.h>
  1126. using namespace std;
  1127.  
  1128. int power(int a, int b, int MOD){
  1129.     int ret = 1;
  1130.     a %= MOD;
  1131.     while(b != 0){
  1132.         if(b & 1)
  1133.             ret = (ret * 1ll * a)%MOD;
  1134.         a = (a * 1ll * a)%MOD;
  1135.         b >>= 1;
  1136.     }
  1137.     return ret;
  1138. }
  1139.  
  1140. int extended_euclidean(int a, int b, int& x, int& y){
  1141.     if(a == 0){
  1142.         x = 0;
  1143.         y = 1;
  1144.         return b;
  1145.     }
  1146.     int x1, y1;
  1147.     int g = extended_euclidean(b%a,a,x1,y1);
  1148.     x = y1 - (b/a) * x1;
  1149.     y = x1;
  1150.     return g;
  1151. }
  1152.  
  1153. int modular_inverse(int a, int n){
  1154.     int x, y;
  1155.     if(extended_euclidean(a,n,x,y) != 1)
  1156.         return 0;
  1157.     return (x + n)%n;
  1158. }
  1159.  
  1160. bool isPrimitive(int x, int p){
  1161.     set<int> hash;
  1162.     for(int e=1; e<p; ++e)
  1163.         hash.insert(power(x,e,p));
  1164.     return hash.size() == p-1;
  1165. }
  1166.  
  1167. void generateKey(int p, int& e1, int& e2, int& d){
  1168.     d = 2 + (rand() % (p-3));
  1169.     vector<int> primitive;
  1170.     for(int i=1; i<p; ++i){
  1171.         if(isPrimitive(i,p))
  1172.             primitive.push_back(i);
  1173.     }
  1174.     int idx = rand() % primitive.size();
  1175.     e1 = primitive[idx];
  1176.     e2 = power(e1,d,p);
  1177. }
  1178.  
  1179. vector< pair<int,int> > elgamalEncrypt(string plain_text, int k, int e1, int e2, int p){
  1180.     vector< pair<int,int> > cipher_text(plain_text.size());
  1181.     for(int i=0; i<plain_text.size(); ++i){
  1182.         int c1 = power(e1,k,p);
  1183.         int c2 = power(e2,k,p);
  1184.         int P = (int)plain_text[i];
  1185.         cout<<P<<" ";
  1186.         c2 = (c2 * 1ll * P)%p;
  1187.         cipher_text[i] = {c1,c2};
  1188.     }
  1189.     cout<<endl;
  1190.     return cipher_text;
  1191. }
  1192.  
  1193. vector<int> elgamalDecrypt(vector< pair<int,int> >& cipher_text, int d, int p){
  1194.     vector<int> plain_text(cipher_text.size());
  1195.     for(int i=0; i<cipher_text.size(); ++i){
  1196.         int c1 = cipher_text[i].first;
  1197.         int c2 = cipher_text[i].second;
  1198.         c1 = power(c1,d,p);
  1199.         c1 = modular_inverse(c1,p);
  1200.         plain_text[i] = (c1 * 1ll * c2)%p;
  1201.     }
  1202.     return plain_text;
  1203. }
  1204.  
  1205. int main() {
  1206.     int p, e1, e2, d, k;
  1207.     string plain_text;
  1208.     getline(cin,plain_text);
  1209.     cin>>p;
  1210.     generateKey(p,e1,e2,d);
  1211.     k = 1 + rand() % (p-1);
  1212.     cout<<"e1 = "<<e1<<" e2 = "<<e2<<" d = "<<d<<" k = "<<k<<endl;
  1213.     vector< pair<int,int> > cipher_text = elgamalEncrypt(plain_text,k,e1,e2,p);
  1214.     cout<<"Encrypted text: ";
  1215.     for(int i=0; i<cipher_text.size(); ++i)
  1216.         cout<<cipher_text[i].first<<" "<<cipher_text[i].second;
  1217.     cout<<endl;
  1218.     vector<int> ptext = elgamalDecrypt(cipher_text,d,p);
  1219.     cout<<"Decrypted text: ";
  1220.     for(int i=0; i<ptext.size(); ++i)
  1221.         cout<<ptext[i]<<" ";
  1222.     cout<<endl;
  1223.     return 0;
  1224. }
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232. Elgamal
  1233.  
  1234.  
  1235.  
  1236. #include <bits/stdc++.h>
  1237. using namespace std;
  1238.  
  1239. int power(int a, int b, int MOD){
  1240.     int ret = 1;
  1241.     a %= MOD;
  1242.     while(b != 0){
  1243.         if(b & 1)
  1244.             ret = (ret * 1ll * a)%MOD;
  1245.         a = (a * 1ll * a)%MOD;
  1246.         b >>= 1;
  1247.     }
  1248.     return ret;
  1249. }
  1250.  
  1251. int extended_euclidean(int a, int b, int& x, int& y){
  1252.     if(a == 0){
  1253.         x = 0;
  1254.         y = 1;
  1255.         return b;
  1256.     }
  1257.     int x1, y1;
  1258.     int g = extended_euclidean(b%a,a,x1,y1);
  1259.     x = y1 - (b/a) * x1;
  1260.     y = x1;
  1261.     return g;
  1262. }
  1263.  
  1264. int modular_inverse(int a, int n){
  1265.     int x, y;
  1266.     if(extended_euclidean(a,n,x,y) != 1)
  1267.         return 0;
  1268.     return (x + n)%n;
  1269. }
  1270.  
  1271. bool isPrimitive(int x, int p){
  1272.     set<int> hash;
  1273.     for(int e=1; e<p; ++e)
  1274.         hash.insert(power(x,e,p));
  1275.     return hash.size() == p-1;
  1276. }
  1277.  
  1278. void generateKey(int p, int& e1, int& e2, int& d){
  1279.     d = 2 + (rand() % (p-3));
  1280.     vector<int> primitive;
  1281.     for(int i=1; i<p; ++i){
  1282.         if(isPrimitive(i,p))
  1283.             primitive.push_back(i);
  1284.     }
  1285.     int idx = rand() % primitive.size();
  1286.     e1 = primitive[idx];
  1287.     e2 = power(e1,d,p);
  1288. }
  1289.  
  1290. vector< pair<int,int> > elgamalEncrypt(string plain_text, int k, int e1, int e2, int p){
  1291.     vector< pair<int,int> > cipher_text(plain_text.size());
  1292.     for(int i=0; i<plain_text.size(); ++i){
  1293.         int c1 = power(e1,k,p);
  1294.         int c2 = power(e2,k,p);
  1295.         int P = (int)plain_text[i];
  1296.         cout<<P<<" ";
  1297.         c2 = (c2 * 1ll * P)%p;
  1298.         cipher_text[i] = {c1,c2};
  1299.     }
  1300.     cout<<endl;
  1301.     return cipher_text;
  1302. }
  1303.  
  1304. vector<int> elgamalDecrypt(vector< pair<int,int> >& cipher_text, int d, int p){
  1305.     vector<int> plain_text(cipher_text.size());
  1306.     for(int i=0; i<cipher_text.size(); ++i){
  1307.         int c1 = cipher_text[i].first;
  1308.         int c2 = cipher_text[i].second;
  1309.         c1 = power(c1,d,p);
  1310.         c1 = modular_inverse(c1,p);
  1311.         plain_text[i] = (c1 * 1ll * c2)%p;
  1312.     }
  1313.     return plain_text;
  1314. }
  1315.  
  1316. int main() {
  1317.     int p, e1, e2, d, k;
  1318.     string plain_text;
  1319.     getline(cin,plain_text);
  1320.     cin>>p;
  1321.     generateKey(p,e1,e2,d);
  1322.     k = 1 + rand() % (p-1);
  1323.     cout<<"e1 = "<<e1<<" e2 = "<<e2<<" d = "<<d<<" k = "<<k<<endl;
  1324.     vector< pair<int,int> > cipher_text = elgamalEncrypt(plain_text,k,e1,e2,p);
  1325.     cout<<"Encrypted text: ";
  1326.     for(int i=0; i<cipher_text.size(); ++i)
  1327.         cout<<cipher_text[i].second<<"  ";
  1328.     cout<<endl;
  1329.     vector<int> ptext = elgamalDecrypt(cipher_text,d,p);
  1330.     cout<<"Decrypted text: ";
  1331.     for(int i=0; i<ptext.size(); ++i)
  1332.         cout<<ptext[i]<<" ";
  1333.     cout<<endl;
  1334.     return 0;
  1335. }
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341. . Implement Elgamal Digital Signature
  1342.  
  1343. #include<bits/stdc++.h>
  1344. using namespace std;
  1345. int modInverse(int a, int m){
  1346.     a = a%m;
  1347.     for (int x=1; x<m; x++)
  1348.         if ((a*x) % m == 1)
  1349.             return x;
  1350. }
  1351. int exp(int b,int e,int m){
  1352.     int r=1;
  1353.     while(e>0){
  1354.         if(e&1)
  1355.             r=(r*b)%m;
  1356.         e/=2;
  1357.         b=(b*b)%m;
  1358.     }
  1359.     return r;
  1360. }
  1361. int main(){
  1362.     int m,p,e1,d,r;
  1363.     cout<<"** Elgamal Digital Signature **\nEnter m, p, e1, d ,r: ";
  1364.     cin>>m>>p>>e1>>d>>r;
  1365.     int e2=exp(e1,d,p);
  1366.     int s1=exp(e1,r,p);
  1367.     int rr=modInverse(r,p-1);
  1368.     int s2=((m-d*s1)*rr)%(p-1);
  1369.     while(s2<0)
  1370.         s2+=p-1;
  1371.     s2=s2%(p-1);
  1372.     int v2=(exp(e2,s1,p)*exp(s1,s2,p))%p;
  1373.     int v1=exp(e1,m,p);
  1374.     cout<<"\nv1 = "<<v1<<endl<<"v2 = "<<v2<<endl;
  1375.     if(v1==v2)
  1376.         cout<<"Accept"<<endl;
  1377.     else
  1378.         cout<<"Reject"<<endl;
  1379.     return 0;
  1380. }
  1381. OUTPUT:
  1382.  
  1383.  
  1384.  . RSA Digital Signature
  1385.  
  1386. #include <bits/stdc++.h>
  1387. using namespace std;  
  1388. int ext_eucl(int p, int m, int *x, int *y) {
  1389. if(p == 0) {
  1390. *x = 0; *y = 1;
  1391. return m;
  1392. }  
  1393. int x1, y1;
  1394. int gcd = ext_eucl(m % p, p, &x1, &y1);  
  1395. *x = y1 ­ (m / p) * x1;
  1396. *y = x1;
  1397. return gcd;
  1398. }
  1399.  
  1400. int gcd(int a, int b) {
  1401. if(a == 0) return b;
  1402. return gcd(b % a, a);
  1403. }
  1404.  
  1405. long long int mod_exp(long long int a, unsigned int p, int n) {
  1406. long long int res = 1;
  1407.  
  1408. while(p > 0) {
  1409. if(p & 1) res = (res * a) % n;
  1410. p = p >> 1;
  1411. a = (a * a) % n;
  1412. }
  1413. return res;
  1414. }
  1415.  
  1416. int coprime(int val) {
  1417. for(int i = val / 2; i < val; i += 1)
  1418. if(gcd(i, val) == 1) return i;
  1419. }
  1420.  
  1421. int main() {
  1422. int p=55243, q=7669, n;
  1423. long long int m=10;  
  1424. n = p * q;  
  1425. int totient = (p ­ 1) * (q ­ 1); int e = coprime(totient);
  1426. cout << "E " << e << endl;  
  1427. int d = 0, y = 0;
  1428. ext_eucl(e, totient, &d, &y);  
  1429. long long int encr = mod_exp(m, e, n);
  1430. long long int decr = mod_exp(encr, d, n);  
  1431. cout << "Cipher: " << decr << endl;
  1432. cout << "Decrypt: " << encr << endl;
  1433. }
  1434.  
  1435.  
  1436. Output:
  1437. E 211797829
  1438. Cipher: 140699680
  1439. Decrypt: 10
  1440.  
  1441. . ELGAMAL SIMULATED BY ELLIPTIC CURVE CRYPTOGRAPHY
  1442.  
  1443. #include<bits/stdc++.h>
  1444. using namespace std;
  1445. struct coord
  1446. {   int x;  int y;   };
  1447. int inverse(int a, int p)
  1448. {
  1449.     for(int i = 1; i < p; i += 1)
  1450.         if((a * i) % p == 1)
  1451.             return i;
  1452. }
  1453. coord generate(int a, int b, int p)
  1454. {
  1455.     vector<int> y_2;
  1456.     vector<int> x;
  1457.     for(int i = 0; i < p; i += 1)
  1458.     {
  1459.         y_2.push_back((i * i * i + a * i + b) % p);
  1460.         x.push_back(i);
  1461.     }
  1462.     for(int i = 0; i < p; i += 1)
  1463.     {          
  1464.         for(int j = 0; j < x.size(); j += 1)
  1465.         {
  1466.             if(y_2[j] == ((i * i) % p))
  1467.             {
  1468.                 coord res;
  1469.                 res.x = x[j];
  1470.                 res.y = i;
  1471.                 return res;
  1472. }   }   }   }
  1473. int find_lambda(struct coord a, struct coord b, int p)
  1474. {
  1475.     int lambda;
  1476.     if((a.x == b.x) && (a.y == b.y))
  1477.     {
  1478.         int nr = (p + 3 * a.x * a.x + 1);int dr = (p + 2 * a.y);
  1479.         lambda = (p + nr * inverse(dr, p)) % p;
  1480.     }
  1481.     else
  1482.     {
  1483.         int nr = (b.y - a.y);       int dr = (b.x - a.x);
  1484.         lambda = (p + nr * inverse(dr, p)) % p;
  1485.     }
  1486.     return lambda;
  1487. }
  1488. struct coord addn(struct coord a, struct coord b, int p)
  1489. {
  1490.     struct coord res;   int lambda = find_lambda(a, b, p); 
  1491.     res.x = (p + lambda * lambda - a.x - b.x) % p;
  1492.     res.y = (p + lambda * (a.x - res.x) - a.y) % p;
  1493.     return res;
  1494. }
  1495.  
  1496. struct coord mult(int d, struct coord e1, int p){
  1497.     coord e2;   int v = d;
  1498.     struct coord temp;
  1499.     temp.x = e1.x;  temp.y = e1.y;
  1500.     for(int i = 0; i < v; i += 1){
  1501.         if(temp.x < 0) temp.x += p;
  1502.         if(temp.y < 0) temp.y += p;
  1503.         if(temp.x == e1.x && (temp.y != e1.y)){
  1504.             temp = e1;
  1505.             i += 2;
  1506.         }
  1507.         else    temp = addn(temp, e1, p);
  1508.     }
  1509.     e2.x = ((temp.x >= 0) ? (temp.x) : (p + temp.x));
  1510.     e2.y = ((temp.y >= 0) ? (temp.y) : (p + temp.y));
  1511.     return e2;
  1512. }
  1513.  
  1514. int main(){
  1515.     int p, a, b, d; cout<<"** ELLPTIC CURVE SIMULATING ELGAMAL **\nEnter p, a, b, d: ";
  1516.     cin >> p >> a >> b >> d;
  1517.     struct coord plain;
  1518.     struct coord e1 = generate(a, b, p);    struct coord e2 = mult(d, e1, p);
  1519.     cout << "E1 " << e1.x << " " << e1.y << endl;
  1520.     cout << "E2 " << e2.x << " " << e2.y << endl;
  1521.     int r = 27;
  1522.     struct coord c1 = mult(r, e1, p);
  1523.     cout << "C1 " << c1.x << " " << c1.y << endl;
  1524.     cout<<"\n Enter the number of test case: "; int t;  cin>>t;
  1525.     for(int i=0;i<t;i++){
  1526.     cout<<"\nENter Coordinates: ";
  1527.     cin >> plain.x >> plain.y;
  1528.     struct coord c2 = addn(plain, mult(r, e2, p), p);
  1529.     cout << "C2 " << c2.x << " " << c2.y << endl;
  1530.     struct coord decr = addn(c2, mult(-1, mult(d, c1, p), p), p);
  1531.     cout << "Decrypted " << ((decr.x >= 0) ? (decr.x) : (p + decr.x)) << " " << ((decr.y >= 0) ? (decr.y) : (p + decr.y)) << endl;
  1532.     }
  1533.     return 0;
  1534. }
  1535. OUTPUT:
  1536.  
  1537.  
  1538.  . Generate keys and Implement 4 basic operations of MD5
  1539.  
  1540. #include<bits/stdc++.h> using namespace std;
  1541. map<char,string> m;
  1542. map<string,char> m1;
  1543.  
  1544. string no(string x)
  1545. {
  1546. for(int i=0;i<x.length();i++)
  1547. { if(x[i]=='1') x[i]='0'; else
  1548. x[i]='1';
  1549. }
  1550. return x;
  1551. }
  1552.  
  1553. string xo(string a,string b)
  1554. { string r="";
  1555. for(int i=0;i<a.length();i++)
  1556. {if(a[i]==b[i]) r='0'+r; else r='1'+r;
  1557. } return r;
  1558. }
  1559.  
  1560. string oR(string a,string b)
  1561. { string r=""; for(int i=0;i<a.length();i++) {if((a[i]=='1')||(b[i]=='1')) r='1'+r; else r='0'+r;
  1562. } return r;
  1563. }
  1564.  
  1565. string an(string a,string b)
  1566. { string r=""; for(int i=0;i<a.length();i++) {if(a[i]==b[i]) r=a[i]+r; else r='0'+r;
  1567. }
  1568. return r;
  1569. }
  1570.  
  1571. string hex(string a)
  1572. {
  1573. string hex="",temp;
  1574. for(int i=0;i<a.length();)
  1575. {
  1576. temp=""; for(int k=0;k<4;k++,i++)
  1577. {
  1578. temp+=a[i];
  1579.     }    
  1580. hex+=m1[temp];
  1581. }
  1582. return hex;
  1583. }
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595. int main() {
  1596.  
  1597. m['0']="0000";m['1']="0001";m['2']="0010";m['3']="0011";m['4']="0100"
  1598. ;m['5']="0101";m['6']="0110";m['7']="0111";m['8']="1000";m['9']="1001";
  1599. m['A']="1010";m['B']="1011";m['C']="1100";m['D']="1101";
  1600. m['E']="1110";m['F']="1111";
  1601. m1["0000"]='0';m1["0001"]='1';m1["0010"]='2';
  1602. m1["0011"]='3';m1["0100"]='4';m1["0101"]='5';m1["
  1603. 0110"]='6';m1["0111"]='7';m1["1000"]='8';m1["1001"]='9';
  1604. m1["1010"]='A';m1["1011"]='B';m1["1100"]='C';
  1605. m1["1101"]='D';m1["1110"]='E';m1["1111"]='F';
  1606.  
  1607.  
  1608. long long k[65]; cout<<"Keys:\n";
  1609. for(int i=1;i<=64;i++)
  1610. {
  1611. k[i]=abs(sin(i+1))*pow(2,32); cout<<k[i]<<" ";
  1612. }
  1613.  
  1614. string a="",b="",c="",d="";
  1615. string s1="67452301",s2="EFCDAB89",s3="98BADCFE",s4="10325476";
  1616. for(int i=0;i<s1.length();i++)
  1617. {
  1618. a=m[s1[i]]+a; b=m[s2[i]]+b; c=m[s3[i]]+c;
  1619. d=m[s4[i]]+d;
  1620. }
  1621.  
  1622. //Operation A
  1623. string ans=oR(an(b,c),an(no(b),d));
  1624.     cout<<endl<<"Op A: "<<hex(ans)<<endl;   
  1625. //B
  1626. ans=oR(an(d,b),an(no(d),c));
  1627. cout<<"Op B: "<<hex(ans)<<endl;
  1628. //C
  1629. ans=xo(b,xo(c,d));
  1630. cout<<"Op C: "<<hex(ans)<<endl;
  1631. //D
  1632. ans=xo(c,oR(b,no(d)));
  1633. cout<<"Op D: "<<hex(ans)<<endl;
  1634. }
  1635.  
  1636. Output:
  1637. Keys:
  1638. 3905402710 606105819 3250441966 4118548399 1200080426 2821735955 4249261313
  1639. 1770035416 2336552879 4294925233 2304563134 1804603682 4254626195 2792965006
  1640. 1236535329 4129170786 3225465664 643717713 3921069994 3593408605 38016083
  1641. 3634488961 3889429448 568446438 3275163606 4107603335 1163531501 2850285829
  1642. 4243563512 1735328473 2368359562 4294588738 2272392833 1839030562 4259657740
  1643. 2763975236 1272893353 4139469664 3200236656 681279174 3936430074 3572445317
  1644. 76029189 3654602809 3873151461 530742520 3299628645 4096336452 1126891415
  1645. 2878612391 4237533241 1700485571 2399980690 4293915773 2240044497 1873313359 4264355552 2734768916 1309151649 4149444226 3174756917 718787259 3951481745
  1646. 3551202137  
  1647. Op A: EFCDAB89
  1648. Op B: 88888888
  1649. Op C: F7B3D591
  1650. Op D: 096F6F09
  1651.  
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657.  . MD5 hash function
  1658.  
  1659. #include<bits/stdc++.h> using namespace std;
  1660. map<string,char> m;
  1661.  
  1662. int main()
  1663. {
  1664. m['0']="0000";m['1']="0001";m['2']="0010";m['3']="0011";m['4']="0100"
  1665. ;m['5']="0101";m['6']="0110";m['7']="0111";m['8']="1000";m['9']="1001";
  1666. m['A']="1010";m['B']="1011";m['C']="1100";m['D']="1101";
  1667. m['E']="1110";m['F']="1111";
  1668. m1["0000"]='0';m1["0001"]='1';m1["0010"]='2';
  1669. m1["0011"]='3';m1["0100"]='4';m1["0101"]='5';m1["
  1670. 0110"]='6';m1["0111"]='7';m1["1000"]='8';m1["1001"]='9';
  1671. m1["1010"]='A';m1["1011"]='B';m1["1100"]='C';
  1672. m1["1101"]='D';m1["1110"]='E';m1["1111"]='F';
  1673. string input="hello";
  1674. string pad="",temp="";
  1675. int i;
  1676. for(i=0;i<input.size();i++) {
  1677. int x=(int)(input[i]); temp=""; for(int j=0;j<8;j++)
  1678. {
  1679. temp=(char)(x%2+'0')+temp;
  1680. x=x/2;
  1681. }
  1682. pad=pad+temp;  
  1683. }
  1684.  
  1685. i=pad.length();
  1686.  
  1687. if(i<=447) {
  1688. pad+='1';
  1689. i++;
  1690. }
  1691.  
  1692. while(i<448) {
  1693. pad+='0';
  1694. i++;
  1695. }
  1696.  
  1697. int tmp=input.length()*8;
  1698. temp="";
  1699.  
  1700. for(i=0;i<64;i++) {
  1701.  temp=(char)(tmp%2+'0')+temp;
  1702.  tmp=tmp/2;
  1703. }
  1704. pad=pad+temp; string hex=""; temp="";
  1705.  
  1706. for(i=0;i<pad.length();) {
  1707. temp=""; for(int k=0;k<4;k++,i++)
  1708. {
  1709. temp+=pad[i];
  1710.     }    
  1711. hex+=m[temp];
  1712. }
  1713. cout<<hex<<endl;
  1714. }  
  1715. Output:
  1716. 68656C6C6F80000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000028
  1717.    . Append bits to the given input according to SHA-1 and print results in Hexadecimal Representation.
  1718. Input: hello.
  1719.  
  1720. #include<bits/stdc++.h>
  1721. using namespace std;
  1722.  
  1723. int main(){
  1724.     string msg = "hello";
  1725.     int data[512] = {0};
  1726.     int i;
  1727.     for(int j=0; j<msg.length(); j++){
  1728.         int bin = msg[j];
  1729.         i = (j+1)*8;
  1730.         while(i>j*8){
  1731.             data[i-1] = (bin)%2;
  1732.             bin = bin>>1;
  1733.             //cout<<".";
  1734.             i--;
  1735.         }
  1736.     }
  1737.  
  1738.     data[8*msg.length()] = 1;
  1739.     int len = 511;
  1740.     int num = 8*msg.length();
  1741.     while(num>0){
  1742.         data[len] = num%2;
  1743.         num = num>>1;
  1744.         len--;
  1745.     }
  1746.  
  1747.     /*for(int j=0; j<512; j++){
  1748.         cout<<data[j];
  1749.     }
  1750.     cout<<endl;*/
  1751.  
  1752.     for(int j=0; j<512; j+=4){
  1753.         int n = 0;
  1754.         n = pow(2, 3)*data[j] + pow(2, 2)*data[j+1] + pow(2, 1)*data[j+2] + pow(2, 0)*data[j+3];
  1755.         if(n==15) cout<<'F';
  1756.         else if(n==14) cout<<'E';
  1757.         else if(n==13) cout<<'D';
  1758.         else if(n==12) cout<<'C';
  1759.         else if(n==11) cout<<'B';
  1760.         else if(n==10) cout<<'A';
  1761.         else cout<<n;  
  1762.     }
  1763.     cout<<endl;
  1764.  
  1765.     return 0;
  1766. }
  1767.  
  1768. Output:
  1769. 68656C6C6F80000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000028
  1770.   . Implement 4 major operations/processes with give below input and print result in hexadecimal representation.
  1771.  
  1772. #include<bits/stdc++.h>
  1773. using namespace std;
  1774.  
  1775. int main(){
  1776.  
  1777.     /*long long int q = pow(2, 32);
  1778.     for(int i=1; i<=64; i++){
  1779.         long long int k_i = abs(sin(i))*(float)q;
  1780.         cout<<k_i<<endl;
  1781.     }      
  1782.     cout<<endl;*/
  1783.  
  1784.     int a[8] = {0, 1, 2, 3, 4, 5, 6, 7};
  1785.     int b[8] = {8, 9, 10, 11, 12, 13, 14, 15};
  1786.     int c[8] = {15, 14, 13, 12, 11, 10, 9, 8};
  1787.     int d[8] = {7, 6, 5, 4, 3, 2, 1, 0};
  1788.     int e[8] = {12, 3, 13, 2, 14, 1, 15, 0};
  1789.  
  1790.     int A[8], B[8], C[8], D[8];
  1791.  
  1792.     for(int i=0; i<8; i++){
  1793.         int n = A[i] = (b[i]&c[i]) | (~b[i]&d[i]&15);
  1794.         if(n==15) cout<<'F';
  1795.         else if(n==14) cout<<'E';
  1796.         else if(n==13) cout<<'D';
  1797.         else if(n==12) cout<<'C';
  1798.         else if(n==11) cout<<'B';
  1799.         else if(n==10) cout<<'A';
  1800.         else cout<<n;
  1801.     }
  1802.     cout<<endl;
  1803.  
  1804.     for(int i=0; i<8; i++){
  1805.         int n = B[i] = (b[i]^c[i]^d[i]);
  1806.         if(n==15) cout<<'F';
  1807.         else if(n==14) cout<<'E';
  1808.         else if(n==13) cout<<'D';
  1809.         else if(n==12) cout<<'C';
  1810.         else if(n==11) cout<<'B';
  1811.         else if(n==10) cout<<'A';
  1812.         else cout<<n;
  1813.     }
  1814.     cout<<endl;
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.     for(int i=0; i<8; i++){
  1825.         int n = C[i] = ((b[i]&c[i]) | (b[i]&d[i]) | (c[i]&d[i]));
  1826.         if(n==15) cout<<'F';
  1827.         else if(n==14) cout<<'E';
  1828.         else if(n==13) cout<<'D';
  1829.         else if(n==12) cout<<'C';
  1830.         else if(n==11) cout<<'B';
  1831.         else if(n==10) cout<<'A';
  1832.         else cout<<n;
  1833.     }
  1834.     cout<<endl;
  1835.  
  1836.     for(int i=0; i<8; i++){
  1837.         int n = D[i] = (b[i]^c[i]^d[i]);
  1838.         if(n==15) cout<<'F';
  1839.         else if(n==14) cout<<'E';
  1840.         else if(n==13) cout<<'D';
  1841.         else if(n==12) cout<<'C';
  1842.         else if(n==11) cout<<'B';
  1843.         else if(n==10) cout<<'A';
  1844.         else cout<<n;
  1845.     }
  1846.     cout<<endl;
  1847.  
  1848.     return 0;
  1849. }
  1850.  
  1851.  
  1852. OUTPUT:
  1853.  
  1854. FEDCBA98
  1855. 01234567
  1856. FEDCBA98
  1857. 01234567
  1858.  
  1859.   . Implement 2 round of SHA-1 with given 2 inputs respectively.
  1860.  
  1861. #include<bits/stdc++.h>
  1862. using namespace std;
  1863.  
  1864. void print_hex(int n){
  1865.     if(n==15) cout<<'F';
  1866.         else if(n==14) cout<<'E';
  1867.         else if(n==13) cout<<'D';
  1868.         else if(n==12) cout<<'C';
  1869.         else if(n==11) cout<<'B';
  1870.         else if(n==10) cout<<'A';
  1871.         else cout<<n;
  1872. }
  1873.  
  1874. long long int convert_num(int* a){
  1875.  
  1876.     long long int n = 0;
  1877.     for(int i=0; i<8; i++){
  1878.         n += pow(a[i], 7-i);
  1879.     }
  1880.  
  1881.     return n;
  1882. }
  1883.  
  1884. string convert_hex(long long int n){
  1885.  
  1886.     string hexdec_num="";
  1887.     char hex[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
  1888.  
  1889.     while(dec_num>0)
  1890.         {
  1891.             r = dec_num % 16;
  1892.             hexdec_num = hex[r] + hexdec_num;
  1893.             dec_num = dec_num/16;
  1894.         }
  1895.  
  1896.      return hexdec_num;
  1897.  
  1898. }
  1899.  
  1900. int convert_hex_n(char c){
  1901.     int n; 
  1902.     if(c =='F') n = 15;
  1903.     else if(c =='E') n = 14;
  1904.     else if(c =='D') n = 13;
  1905.     else if(c =='C') n = 12;
  1906.     else if(c =='B') n = 11;
  1907.     else if(c =='A') n = 10;
  1908.     else return c-48;
  1909. }
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915. int main(){
  1916.  
  1917.     string msg = "hello";
  1918.     int data[512] = {0};
  1919.     int i;
  1920.     for(int j=0; j<msg.length(); j++){
  1921.         int bin = msg[j];
  1922.         i = (j+1)*8;
  1923.         while(i>j*8){
  1924.             data[i-1] = (bin)%2;
  1925.             bin = bin>>1;
  1926.             //cout<<".";
  1927.             i--;
  1928.         }
  1929.     }
  1930.  
  1931.     data[8*msg.length()] = 1;
  1932.     int len = 511;
  1933.     int num = 8*msg.length();
  1934.     while(num>0){
  1935.         data[len] = num%2;
  1936.         num = num>>1;
  1937.         len--;
  1938.     }
  1939.  
  1940.     int w[128];
  1941.     for(int j=0; j<512; j+=4){
  1942.         int n = 0;
  1943.         n = pow(2, 3)*data[j] + pow(2, 2)*data[j+1] + pow(2, 1)*data[j+2] + pow(2, 0)*data[j+3];
  1944.         w[j/4] = n;    
  1945.     }
  1946.  
  1947.     long long int q = pow(2, 32);
  1948.  
  1949.     int a[8] = {0, 1, 2, 3, 4, 5, 6, 7};
  1950.     int b[8] = {8, 9, 10, 11, 12, 13, 14, 15};
  1951.     int c[8] = {15, 14, 13, 12, 11, 10, 9, 8};
  1952.     int d[8] = {7, 6, 5, 4, 3, 2, 1, 0};
  1953.     int e[8] = {12, 3, 13, 2, 14, 1, 15, 0};
  1954.  
  1955.     int kt[8] = {15, 14, 13, 12, 11, 10, 9, 8};
  1956.  
  1957.     int A[8], B[8], C[8], D[8], E[8], F[8];
  1958.  
  1959.     for(int i=0; i<8; i++){
  1960.         int n = F[i] = (b[i]&c[i]) | (~b[i]&d[i]&15);
  1961.         A[i] = a[i]; B[i] = b[i]; C[i] = c[i]; D[i] = d[i]; E[i] = e[i];
  1962.  
  1963.     }
  1964.     cout<<endl;
  1965.  
  1966.     int n;
  1967.     int temp[8], data_temp[8];;
  1968.     long long int m = (convert_num(F) + convert_num(E))%q;
  1969.     string hex_m = convert_hex(m);
  1970.  
  1971.  
  1972.     for(int i=0; i<8; i++){
  1973.         temp[i] = convert_hex_n(hex_m[i]);
  1974.         data_temp[i] = w[i];
  1975.     }
  1976.  
  1977.     m = (convert_num(temp) + convert_num(data_temp))%q;
  1978.     string hex_m = convert_hex(m);
  1979.     for(int i=0; i<8; i++){
  1980.         temp[i] = convert_hex_n(hex_m[i]);
  1981.         data_temp[i] = w[i];
  1982.     }
  1983.  
  1984.     m = (convert_num(temp) + convert_num(kt))%q;
  1985.     string hex_m = convert_hex(m);
  1986.     for(int i=0; i<8; i++){
  1987.         temp[i] = convert_hex_n(hex_m[i]);
  1988.         data_temp[i] = w[i];
  1989.     }
  1990.  
  1991.     for(int i=0; i<8; i++){
  1992.         int n = C[i] = (b[i]^c[i]^d[i]);
  1993.  
  1994.     }
  1995.     cout<<endl;
  1996.  
  1997.     for(int i=0; i<8; i++){
  1998.         int n = D[i] = (c[i]^(b[i]|~d[i]&15));
  1999.  
  2000.     }
  2001.     cout<<endl;
  2002.  
  2003.     return 0;
  2004. }
  2005.  
  2006. OUTPUT:
  2007. Round1: 9cf5caf6c36f5cccde8c73fad8894c958f4983da
  2008. Round2: 1eec5eecf3ddf2d401205eb87055d6595a9bceaf
  2009.  
  2010.  
  2011.   . PRIMITIVE ROOTS OF A MULTIPLICATIVE GROUP
  2012.  
  2013. #include<bits/stdc++.h>
  2014. #include<time.h>
  2015. using namespace std;
  2016. int gcd(int a,int b){
  2017.     if(!b)
  2018.         return a;
  2019.     return gcd(b,a%b);
  2020. }
  2021. int fastexp(int x,int y, int mod){
  2022.     int res=1;
  2023.     while(y){
  2024.         if(y&1)
  2025.             res=(res*x)%mod;
  2026.         x=(x*x)%mod;
  2027.         y=y>>1;
  2028.     }
  2029.     return res;
  2030. }
  2031. vector<int> find_generator(int prime){
  2032.     int i;
  2033.     vector<int> elements, primitives;
  2034.     for(i=0;i<prime;i++){
  2035.         if(gcd(prime,i)==1)
  2036.             elements.push_back(i);
  2037.     }
  2038.     int order=elements.size();
  2039.     for(i=0;i<order;i++){
  2040.         int j;
  2041.         vector<bool> p(prime,0);
  2042.         for(j=0;j<prime;j++){
  2043.             int t=fastexp(elements[i],j,prime);
  2044.             p[t]=1;
  2045.         }
  2046.         for(j=1;j<prime;j++)
  2047.             if(p[j]==0)
  2048.                 break;
  2049.         if(j==prime)
  2050.             primitives.push_back(elements[i]);
  2051.     }
  2052.     return  primitives;
  2053. }
  2054. int main(){
  2055.     int prime;
  2056.     cout<<"Enter the value of p"<<endl;
  2057.     cin>>prime;
  2058.     vector<int> generators=find_generator(prime);
  2059.     cout<<"The generators of prime "<<prime<<" are: "<<endl;
  2060.     for(auto generator:generators)
  2061.         cout<<generator<<" ";
  2062.     return 0;
  2063. }
  2064. OUTPUT:
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.   . Implement Elgamal Digital Signature
  2075.  
  2076. #include<bits/stdc++.h>
  2077. using namespace std;
  2078. int modInverse(int a, int m){
  2079.     a = a%m;
  2080.     for (int x=1; x<m; x++)
  2081.         if ((a*x) % m == 1)
  2082.             return x;
  2083. }
  2084. int exp(int b,int e,int m){
  2085.     int r=1;
  2086.     while(e>0){
  2087.         if(e&1)
  2088.             r=(r*b)%m;
  2089.         e/=2;
  2090.         b=(b*b)%m;
  2091.     }
  2092.     return r;
  2093. }
  2094. int main(){
  2095.     int m,p,e1,d,r;
  2096.     cout<<"** Elgamal Digital Signature **\nEnter m, p, e1, d ,r: ";
  2097.     cin>>m>>p>>e1>>d>>r;
  2098.     int e2=exp(e1,d,p);
  2099.     int s1=exp(e1,r,p);
  2100.     int rr=modInverse(r,p-1);
  2101.     int s2=((m-d*s1)*rr)%(p-1);
  2102.     while(s2<0)
  2103.         s2+=p-1;
  2104.     s2=s2%(p-1);
  2105.     int v2=(exp(e2,s1,p)*exp(s1,s2,p))%p;
  2106.     int v1=exp(e1,m,p);
  2107.     cout<<"\nv1 = "<<v1<<endl<<"v2 = "<<v2<<endl;
  2108.     if(v1==v2)
  2109.         cout<<"Accept"<<endl;
  2110.     else
  2111.         cout<<"Reject"<<endl;
  2112.     return 0;
  2113. }
  2114. OUTPUT:
  2115.  
  2116.  
  2117.  
  2118.   . ELGAMAL SIMULATED BY ELLIPTIC CURVE CRYPTOGRAPHY
  2119.  
  2120. #include<bits/stdc++.h>
  2121. using namespace std;
  2122. struct coord
  2123. {   int x;  int y;   };
  2124. int inverse(int a, int p)
  2125. {
  2126.     for(int i = 1; i < p; i += 1)
  2127.         if((a * i) % p == 1)
  2128.             return i;
  2129. }
  2130. coord generate(int a, int b, int p)
  2131. {
  2132.     vector<int> y_2;
  2133.     vector<int> x;
  2134.     for(int i = 0; i < p; i += 1)
  2135.     {
  2136.         y_2.push_back((i * i * i + a * i + b) % p);
  2137.         x.push_back(i);
  2138.     }
  2139.     for(int i = 0; i < p; i += 1)
  2140.     {          
  2141.         for(int j = 0; j < x.size(); j += 1)
  2142.         {
  2143.             if(y_2[j] == ((i * i) % p))
  2144.             {
  2145.                 coord res;
  2146.                 res.x = x[j];
  2147.                 res.y = i;
  2148.                 return res;
  2149. }   }   }   }
  2150. int find_lambda(struct coord a, struct coord b, int p)
  2151. {
  2152.     int lambda;
  2153.     if((a.x == b.x) && (a.y == b.y))
  2154.     {
  2155.         int nr = (p + 3 * a.x * a.x + 1);int dr = (p + 2 * a.y);
  2156.         lambda = (p + nr * inverse(dr, p)) % p;
  2157.     }
  2158.     else
  2159.     {
  2160.         int nr = (b.y - a.y);       int dr = (b.x - a.x);
  2161.         lambda = (p + nr * inverse(dr, p)) % p;
  2162.     }
  2163.     return lambda;
  2164. }
  2165. struct coord addn(struct coord a, struct coord b, int p)
  2166. {
  2167.     struct coord res;   int lambda = find_lambda(a, b, p); 
  2168.     res.x = (p + lambda * lambda - a.x - b.x) % p;
  2169.     res.y = (p + lambda * (a.x - res.x) - a.y) % p;
  2170.     return res;
  2171. }
  2172.  
  2173. struct coord mult(int d, struct coord e1, int p)
  2174. {
  2175.     coord e2;   int v = d;
  2176.     struct coord temp;
  2177.     temp.x = e1.x;  temp.y = e1.y;
  2178.     for(int i = 0; i < v; i += 1)
  2179.     {
  2180.         if(temp.x < 0)
  2181.             temp.x += p;
  2182.         if(temp.y < 0)
  2183.             temp.y += p;
  2184.         if(temp.x == e1.x && (temp.y != e1.y))
  2185.         {
  2186.             temp = e1;
  2187.             i += 2;
  2188.         }
  2189.         else    temp = addn(temp, e1, p);
  2190.     }
  2191.     e2.x = ((temp.x >= 0) ? (temp.x) : (p + temp.x));
  2192.     e2.y = ((temp.y >= 0) ? (temp.y) : (p + temp.y));
  2193.     return e2;
  2194. }
  2195.  
  2196. int main()
  2197. {
  2198.     int p, a, b, d; cout<<"** ELLPTIC CURVE SIMULATING ELGAMAL **\nEnter p, a, b, d: ";
  2199.     cin >> p >> a >> b >> d;
  2200.     struct coord plain;
  2201.     struct coord e1 = generate(a, b, p);    struct coord e2 = mult(d, e1, p);
  2202.     cout << "E1 " << e1.x << " " << e1.y << endl;
  2203.     cout << "E2 " << e2.x << " " << e2.y << endl;
  2204.     int r = 27;
  2205.     struct coord c1 = mult(r, e1, p);
  2206.     cout << "C1 " << c1.x << " " << c1.y << endl;
  2207.     cout<<"\n Enter the number of test case: "; int t;  cin>>t;
  2208.     for(int i=0;i<t;i++){
  2209.     cout<<"\nENter Coordinates: ";
  2210.     cin >> plain.x >> plain.y;
  2211.     struct coord c2 = addn(plain, mult(r, e2, p), p);
  2212.     cout << "C2 " << c2.x << " " << c2.y << endl;
  2213.     struct coord decr = addn(c2, mult(-1, mult(d, c1, p), p), p);
  2214.     cout << "Decrypted " << ((decr.x >= 0) ? (decr.x) : (p + decr.x)) << " " << ((decr.y >= 0) ? (decr.y) : (p + decr.y)) << endl;
  2215.     }
  2216.     return 0;
  2217. }
  2218.  
  2219. S-DES
  2220. #include <bits/stdc++.h>
  2221. using namespace std;
  2222.  
  2223. vector<int> permute(vector<int>& key, vector<int>& permutation_key){
  2224.     vector<int> ret(permutation_key.size());
  2225.     for(int i=0; i<permutation_key.size(); ++i)
  2226.         ret[i] = key[permutation_key[i] - 1];
  2227.     return ret;
  2228. }
  2229.  
  2230. vector<int> circular_shift(vector<int>& permutation_key, int shift){
  2231.     int n = permutation_key.size();
  2232.     int lim = n / 2;
  2233.     vector<int> ret(n);
  2234.     for(int i=0; i<lim; ++i)
  2235.         ret[(i-shift+lim)%lim] = permutation_key[i];
  2236.     for(int i=0; i<lim; ++i)
  2237.         ret[lim + (i-shift+lim)%lim] = permutation_key[lim + i];
  2238.     return ret;
  2239. }
  2240.  
  2241. vector<int> expand(vector<int>& plain_text){
  2242.     vector<int> expansion_key = {4, 1, 2, 3, 2, 3, 4, 1};
  2243.     vector<int> ret(expansion_key.size());
  2244.     int lim = plain_text.size() / 2;
  2245.     for(int i=0; i<expansion_key.size(); ++i)
  2246.         ret[i] = plain_text[lim + expansion_key[i] - 1];
  2247.     return ret;
  2248. }
  2249.  
  2250. vector<int> apply_xor(vector<int>& lhs, vector<int>& rhs, int lim){
  2251.     vector<int> ret(lhs);
  2252.     for(int i=0; i<lim; ++i)
  2253.         ret[i] = lhs[i] ^ rhs[i];
  2254.     return ret;
  2255. }
  2256.  
  2257. void apply_swap(vector<int>& text){
  2258.     int n = text.size();
  2259.     int lim = n / 2;
  2260.     for(int i=0; i<lim; ++i)
  2261.         swap(text[i],text[lim+i]);
  2262. }
  2263.  
  2264. int value(int bit1, int bit2){
  2265.     int ret = 0;
  2266.     if(bit2)
  2267.         ret |= 1;
  2268.     if(bit1)
  2269.         ret |= 2;
  2270.     return ret;
  2271. }
  2272.  
  2273. vector<int> f_output(vector<int>& key, vector<vector<int> >& s0, vector<vector<int> >& s1){
  2274.     vector<int> ret;
  2275.     int r = value(key[0],key[3]);
  2276.     int c = value(key[1],key[2]);
  2277.     int val = s0[r][c];
  2278.     ret.push_back((int)(val>>1 & 1));
  2279.     ret.push_back((int)(val & 1));
  2280.     r = value(key[4],key[7]);
  2281.     c = value(key[5],key[6]);
  2282.     val = s1[r][c];
  2283.     ret.push_back((int)(val>>1 & 1));
  2284.     ret.push_back((int)(val & 1));
  2285.     return ret;
  2286. }
  2287.  
  2288. void fkey(vector<int>& plain_text, vector<int>& key){
  2289.     vector<vector<int> > s0 = {{1, 0, 3, 2}, {3, 2, 1, 0}, {0, 2, 1, 3}, {3, 1, 3, 2}};
  2290.     vector<vector<int> > s1 = {{0, 1, 2, 3}, {2, 0, 1, 3}, {3, 0, 1, 0}, {2, 1, 0, 3}};
  2291.     vector<int> p4 = {2, 4, 3, 1};
  2292.     int n = plain_text.size();
  2293.     vector<int> temp = expand(plain_text);
  2294.     vector<int> fkey = apply_xor(temp,key,n);
  2295.     vector<int> f = f_output(fkey,s0,s1);
  2296.     f = permute(f,p4);
  2297.     plain_text = apply_xor(plain_text,f,n/2);
  2298. }
  2299.  
  2300. int main() {
  2301.     int n = 8;
  2302.     int k = 10;
  2303.     vector<int> plain_text(n);
  2304.     vector<int> cipher_text;
  2305.     vector<int> decipher_text;
  2306.     vector<int> cipher_key(k);
  2307.     for(int i=0; i<n; ++i)
  2308.         cin>>plain_text[i];
  2309.     for(int i=0; i<k; ++i)
  2310.         cin>>cipher_key[i];
  2311.     // Initial Permutation
  2312.     vector<int> ip = {2, 6, 3, 1, 4, 8, 5, 7};
  2313.     plain_text = permute(plain_text,ip);
  2314.  
  2315.     // Key Generation
  2316.     vector<int> p10 = {3, 5, 2, 7, 4, 10, 1, 9, 8, 6};
  2317.     vector<int> p8 = {6, 3, 7, 4, 8, 5, 10, 9};
  2318.     vector<int> key_1, key_2;
  2319.     key_1 = permute(cipher_key,p10);
  2320.     key_1 = circular_shift(key_1,1);
  2321.     key_2 = circular_shift(key_1,2);
  2322.     key_1 = permute(key_1,p8);
  2323.     key_2 = permute(key_2,p8);
  2324.     cout<<"KEY1 = ";
  2325.     for(int i=0; i<key_1.size(); ++i)
  2326.         cout<<key_1[i]<<" ";
  2327.     cout<<endl;
  2328.     cout<<"KEY2 = ";
  2329.     for(int i=0; i<key_1.size(); ++i)
  2330.         cout<<key_2[i]<<" ";
  2331.     cout<<endl;
  2332.  
  2333.     // Apply f_k1
  2334.     fkey(plain_text,key_1);
  2335.  
  2336.     // Swap left and right parts
  2337.     apply_swap(plain_text);
  2338.  
  2339.     // Apply f_k2
  2340.     fkey(plain_text,key_2);
  2341.    
  2342.     // Final Permutation
  2343.     vector<int> fip = {4, 1, 3, 5, 7, 2, 8, 6};
  2344.     plain_text = permute(plain_text,fip);
  2345.  
  2346.     // Print final output
  2347.     for(int i=0; i<plain_text.size(); ++i)
  2348.         cout<<plain_text[i]<<" ";
  2349.     cout<<endl;
  2350.  
  2351.     plain_text = permute(plain_text,ip);
  2352.     fkey(plain_text,key_2);
  2353.     apply_swap(plain_text);
  2354.     fkey(plain_text,key_1);
  2355.     plain_text = permute(plain_text,fip);
  2356.     for(int i=0; i<plain_text.size(); ++i)
  2357.         cout<<plain_text[i]<<" ";
  2358.     cout<<endl;
  2359.     return 0;
  2360. }
  2361.  
  2362. //END OF FILE
  2363.  
  2364.  
  2365. /////////////////////////////////////////////ALL THE BEST//////////////////////////////////////////////////////////////
Add Comment
Please, Sign In to add comment