簡體   English   中英

解碼文件C按位運算

[英]Decode File C Bitwise Operations

我有一個文件encode.c,該文件進行一些按位操作以對第一個.txt文件中的文本進行編碼。 它將編碼后的文本放入.txt文件2。 還有一個關鍵字來編碼.txt文件...

ENCODE.c文件如下:

/ * C語言-用於ascii文本文件的UNIX風格的加密程序-(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 */

}

我了解所有內容,也了解單個按位操作的功能...但是現在我需要解密文件,但我必須了解應該使用哪種操作來使這些操作相反:

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

我考慮過這一點,但我不明白其他幾行:

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

首先,您應該看一下Vigenere密碼。 這與您的編碼程序非常相似。

假設您有一個字節存儲在letter ,這是它的二進制表示形式: letter = 0b0100 1000

現在讓我們看一下加密期間發生的情況:

                     // 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]在本文中是一個加密密鑰,但出於示例目的,我們假設argv[3][counter] = 1010 1010

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

當您想要解密消息時,您需要以不同的順序應用步驟。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM