简体   繁体   中英

Decode File C Bitwise Operations

I have a file encode.c that makes some bitwise operation to encode the text from a first .txt file. It will put the encoded text in the .txt file2. And there is a keyword to encode the .txt file...

The ENCODE.c file is the following:

/* C language - UNIX style encryption program for ascii textfiles - (c) Eike Falk Anderson, 2013 */

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define PUSAGE fprintf(stderr,"USAGE: %s [source file] [destination file] [key]\n\n",argv[0]) /* predefined error/usage message */


/* compile with clang encode.c -o encode

   when you run this program it takes three inputs/parameters:
   1. the name of your sourse text file (the ASCII text file you want to encode)
   2. the name of your destination text file (the file that will have the encoded text in it)
   3. the keyword (the "password" for the encoded file)

   example:
   ./encode source.txt dest.txt secret

*/


int main(int argc,char *argv[]) /* argument vector 0 - program-name, argv 1 - source string, argv 2 - dest string, argv 3 - key string */
{
    int counter; /* a counter variable for counting through the characters of the password */
    char letter,lo,hi,rev,inv,enc; /* variables used for the letters of the text during the coding process */
    FILE *sfp=NULL; /* source file pointer */
    FILE *dfp=NULL; /* destination file pointer */

if((sfp=fopen(argv[1],"r"))==NULL) /* open the text file (sfp) named in argument vector 1 for reading - print error message if this operation fails */
{
    fprintf(stderr,"UNABLE TO OPEN FILE\n");
    PUSAGE;
    return 1; /* end program with error */
}
if((dfp=fopen(argv[2],"w"))==NULL) /* open the text file (dfp) named in argument vector 2 for writing - print error message if this operation fails */
{
    fprintf(stderr,"UNABLE TO OPEN FILE\n");
    PUSAGE;
    return 1; /* end program with error */
}

counter=0; /* set the keyword character counter to 0 */
while((letter=fgetc(sfp))!=EOF) /* process the source file by reading in the next letter (as 1 character/byte each) until the file ends, i.e. the EOF (end of file) character is read in */
{
    if(counter==strlen(argv[3])) counter=0; /* reset if the keyword overflows, i.e. if its end (string length) is reached */

    /* do something to the read in characters/bytes */ 
    lo=letter>>4;
    hi=letter<<4;
    rev=hi|lo;
    inv=~rev;
    enc=inv^argv[3][counter]; 

    counter++; /* increase the counter, i.e. step to the next character of the keyword */

    fputc(enc,dfp);           /* write the encoded character to the destination file */ 
}

fclose(sfp); /* close file sfp */
fclose(dfp); /* close file dfp */

return 0; /* end with success */

}

#

I understand everything and I understand what the single bitwise operations do...but now i need to decrypt the file but i have to understand wich operations should I use to make the reverse of these operations:

lo=letter<<4;
hi=letter>>4;
rev=??;
inv=~rev;
enc=??;
#

I thought about this but I don't understand the other lines:

 lo=letter<<4; hi=letter>>4; rev=??; inv=~rev; enc=??; 

Firstly, you should have a look at Vigenere cipher. It is very similar to what your encoding program does.

Imagine you have a byte stored in letter and this is its binary representation: letter = 0b0100 1000 .

Now let's have a look what happens during encryption:

                     // letter = 0100 1000
lo = letter >> 4;    // lo = 0000 0100
hi = letter << 4;    // hi = 1000 0000
rev = hi | lo;       // rev = 1000 0100
inv = ~rev;          // inv = 0111 1011

argv[3] is in this context a crypto key but for the example purposes lets assume argv[3][counter] = 1010 1010

enc = inv ^ argv[3][counter]; // enc = 1101 0001

When you want to decrypt the message you need to apply steps in different order.

dec = enc ^ argv[3][counter]; // dec = 0111 1011
dec = ~dec        // dec = 1000 0100
hi = dec << 4;    // hi = 0100 0000
lo = dec >> 4;    // lo = 0000 1000
dec = hi | lo;    // dec = 0100 1000

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM