/* * Copyright (c) 2008, mibo@student.math.hr * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY mibo@student.math.hr ''AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL mibo@student.math.hr BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Compile: gcc -o privitak privitak.c */ #include #include #include #include #define M 256 #define SWAP(A, B)(A ^= B ^= A ^= B) unsigned char S[M], K[M]; void inicijaliziraj(unsigned char k[], short n){ register short i, j; for(i = 0; i < M; i++) S[i] = (unsigned char)i; for(i = 0; i < M; i++) K[i] = k[i % n]; for(i = 0, j = 0; i < M; i++){ j = (j + S[i] + K[i]) % M; SWAP(S[i], S[j]); } } unsigned char daj(void){ static short i = 0, j = 0; i = (i + 1) % M; j = (j + S[i]) % M; SWAP(S[i], S[j]); return S[((S[i] + S[j]) % M)]; } void iznimka(char *s){ printf("Iznimka: %s\n:-(\n", s); scanf("%%"); exit(-1); } void zaboravi(void){ short i; for(i = 0; i < M; i++) S[i] = K[i] = 0; } void poziv(void){ printf("Poziv programa: \n"); printf("'privitak p program.exe attachment.txt' za pakiranje datoteke program.exe u datoteku attachment.txt"); printf("\nili\n"); printf("'privitak r attachment.txt program.exe' za raspakiravanje datoteke attachment.txt u datoteku program.exe"); printf("\n"); exit(0); } int main(int argc, char *argv[]){ unsigned char k[M] = {0}; FILE *u, *i; int j; unsigned int z; srand(time(NULL)); if(argc != 4) poziv(); if(strcmp(argv[1], "p") != 0 && strcmp(argv[1], "r") != 0) iznimka("Ne prepoznajem prvi parametar."); if(strcmp(argv[1], "p") == 0){ if((u = fopen(argv[2], "rb")) == NULL) iznimka("Ne mogu otvoriti datoteku."); if((i = fopen(argv[3], "wt")) == NULL) iznimka("Ne mogu otvoriti datoteku za pisanje."); for(j = 0; j < M; j++) fprintf(i, "%.2X ", k[j] = rand() % M); inicijaliziraj(k, M); for(j = 0; j < 2008; j++) daj(); /* :-) */ while(!feof(u)){ if((z = fgetc(u)) == EOF) break; fprintf(i, "%.2X ", ((unsigned char)z) ^ daj()); } fclose(u); fclose(i); } else{ if((u = fopen(argv[2], "rt")) == NULL) iznimka("Ne mogu otvoriti datoteku."); if((i = fopen(argv[3], "wb")) == NULL) iznimka("Ne mogu otvoriti datoteku za pisanje."); for(j = 0; j < M; j++){ if(fscanf(u, "%X ", &z) != 1) k[j] = (unsigned char)z; } inicijaliziraj(k, M); for(j = 0; j < 2008; j++) daj(); /* :-) */ while(!feof(u)){ if(fscanf(u, "%X ", &z) != 1) break; fputc((unsigned char)z ^ daj(), i); } fclose(u); fclose(i); } zaboravi(); return 0; }