Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <unistd.h>
- #include <fstream>
- #include <cctype>
- #include <cstring>
- #include <sstream>
- #include <string>
- using namespace std;
- string polynomial, seed, message;
- int size = 0;
- void printArray(short *arr){
- for(int i = 0; i < size; i++){
- cout<<arr[i];
- }
- cout<<endl;
- }
- void shiftArray(short *arr, int amount){
- if(amount > 0){
- for(int i = size - 1; i >= amount; i--){
- arr[i] = arr [i - amount];
- }
- for(int i = amount - 1; i >= 0; i--){
- arr[i] = 0;
- }
- }
- else if (amount < 0){
- for(int i = 0; i < size + amount; i++){
- arr[i] = arr[i - amount];
- }
- for(int i = size + amount; i < size; i++){
- arr[i] = 0;
- }
- }
- }
- short generateBit(short *arr){
- short bit = 0;
- for(int i = 0; i < size; i++){
- if(polynomial[i] == '1'){
- bit += arr[i];
- }
- }
- return bit % 2;
- }
- bool compareArrays(short *arr1, short*arr2){
- for(int i = 0; i < size; i++){
- if(arr1[i] != arr2[i])
- return false;
- }
- return true;
- }
- string encryptMessage(string basicString){
- polynomial = polynomial.substr(1,polynomial.length());
- size = polynomial.length();
- short *lfsr = new short [size];
- string outString="";
- for(int i = 0; i<size; i++){
- lfsr[i] = seed[i];
- }
- for(int i = 0; i < basicString.length();i++){
- short temp = generateBit(lfsr);
- short out = temp^basicString[i];
- outString+=out;
- shiftArray(lfsr, 1);
- lfsr[0] = out;
- }
- return outString;
- }
- string decryptMessage(string basicString){
- polynomial = polynomial.substr(1,polynomial.length());
- size = polynomial.length();
- short *lfsr = new short [size];
- string outString="";
- for(int i = 0; i<size; i++){
- lfsr[i] = seed[i];
- }
- for(int i = 0; i < basicString.length();i++){
- short temp = generateBit(lfsr);
- short out = temp^basicString[i];
- outString+=out;
- shiftArray(lfsr, 1);
- lfsr[0] = basicString[i];
- }
- return outString;
- }
- int main(int argc, char **argv){
- string inName;
- string outName;
- char c;
- int o;
- bool encrypt = false;
- bool decrypt = false;
- bool polynomialEntered = false;
- bool seedEntered = false;
- char* arr1;
- while ((o = getopt (argc, argv, "edp:s:i:o:")) != -1) {
- switch (o) {
- case 'e':
- encrypt = true;
- break;
- case 'd':
- decrypt = true;
- break;
- case 'p':
- polynomialEntered = true;
- arr1 = optarg;
- polynomial = string(arr1);
- break;
- case 's':
- seedEntered = true;
- arr1 = optarg;
- seed = string(arr1);
- break;
- case 'i':
- arr1 = optarg;
- inName = string(arr1);
- break;
- case 'o':
- arr1 = optarg;
- outName = string(arr1);
- break;
- }
- }
- ifstream input (inName, ios::binary);
- ofstream output (outName);
- ostringstream ss;
- ss << input.rdbuf();
- string dataFromFile = ss.str();
- if(!input || ! output){
- printf("Unable to open input or output file! \n");
- printf("Input file should be given using flag -i and output -o ");
- return 0;
- }
- if(!encrypt && !decrypt){
- printf("Use flag -e to encrypt and -d to decrypt\n");
- return 0;
- }
- if(!polynomialEntered || !seedEntered){
- printf("Please specify polynomial and seed.");
- cout<<polynomial<<" "<<seed;
- return 0;
- }
- if(polynomial.size()-1 != seed.size()){
- printf("Polynomial size and seed size must be equal.");
- return 0;
- }
- if(encrypt){
- output<<encryptMessage(dataFromFile);
- }
- if(decrypt){
- output<<decryptMessage(dataFromFile);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement