Guest User

enkripcija_datoteke_xtea

a guest
Jan 20th, 2013
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. /* Ovaj program modifikacija je programa koji sam napravio u kolovozu 2012.
  2.  * u okviru završnog rada na temu kriptovirologija.
  3.  * Svrha programa bila je demonstracija rada XTEA algoritma.
  4.  * Sam algoritam za sifriranje i desifriranje (funkcije encipher i decipher)
  5.  * bile si preuzete sa: http://en.wikipedia.org/wiki/XTEA
  6.  *
  7.  * Datoteka se kriptira na način da se prilikom pokretanja programa iz komandne
  8.  * linije kao argument navede naziv/putanja datoteke koju se želi kriptirati.
  9.  * (Datoteka se može kriptirati i na način da se drag & drop-a na .EXE file
  10.  * ovog programa)
  11.  *
  12.  * Autor: Josip Žemberi
  13.  * Fakultet Organizacije i Informatike, siječanj 2013.
  14.  */
  15. #include <iostream>
  16. #include <fstream>
  17. #include <stdint.h>
  18.  
  19. using namespace std;
  20.  
  21. unsigned int kljuc[4]={0xACB5,0x1344,0xEC90,0x285C};              
  22. char red[1000];
  23. char txt[10000];
  24.  
  25. #define BLOCK_SIZE 8
  26.  
  27. void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const kljuc[4]){
  28.     unsigned int i;
  29.     uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
  30.     for (i=0; i < num_rounds; i++){
  31.         v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + kljuc[sum & 3]);
  32.         sum += delta;
  33.         v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + kljuc[(sum>>11) & 3]);
  34.     }
  35.     v[0]=v0; v[1]=v1;
  36. }
  37.  
  38. void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const kljuc[4]){
  39.      unsigned int i;
  40.      uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
  41.      for (i=0; i < num_rounds; i++){
  42.         v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + kljuc[(sum>>11) & 3]);
  43.         sum -= delta;
  44.         v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + kljuc[sum & 3]);
  45.      }
  46.      v[0]=v0; v[1]=v1;
  47. }
  48.  
  49. void crypto(char nazivDat[] ,bool naredba){
  50.       fstream dat(nazivDat,ios::in | ios::out | ios::binary);
  51.       if(!dat) cout << "Datoteku nije bilo moguce otvoriti" << endl;
  52.  
  53.       unsigned size;
  54.    
  55.       dat.seekg(0,ios::end);
  56.       size=dat.tellg();
  57.       dat.seekg(ios::beg);
  58.    
  59.       dat.clear();
  60.    
  61.       unsigned pos;
  62.    
  63.       int n_blocks=size/BLOCK_SIZE;
  64.       if(size%BLOCK_SIZE!=0)
  65.           ++n_blocks;
  66.    
  67.       for(int i=0;i<n_blocks;i++){
  68.           unsigned char data[BLOCK_SIZE];
  69.           pos=dat.tellg();
  70.      
  71.           dat.read((char*)data,BLOCK_SIZE);
  72.      
  73.           if(naredba) encipher(32,(uint32_t*)data,kljuc);
  74.           else decipher(32,(uint32_t*)data,kljuc);
  75.        
  76.           dat.seekp(pos);
  77.           dat.write((char*)data,BLOCK_SIZE);
  78.  
  79.           memset(data,0,BLOCK_SIZE);
  80.       }
  81.       dat.close();
  82. }
  83.  
  84. int main(int argc, char *argv[]){
  85.     if (argc < 2) {
  86.         fprintf(stderr, "Koristenje: %s naziv_datoteke_za_enkripciju\n", argv[0]);
  87.         return 1;
  88.     }
  89.     crypto(argv[1], true);
  90.     //crypto(argv[1], false); //dekripcija
  91.     cout << "Datoteka " << argv[1] << " je kriptirana!!" << endl;
  92.    system("pause");              
  93.    return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment