Tôi có một tệp Encode.c thực hiện một số thao tác bitwise để mã hóa văn bản trong tệp .txt đầu tiên. Nó sẽ đặt văn bản được mã hóa vào một tệp .txt2. Và có từ khóa mã hóa file .txt...
Tệp ENCODE.c như sau:
/* C - Chương trình mã hóa kiểu UNIX cho các tệp văn bản ascii - (c) Eike Falk Anderson, 2013*/
#include
#include
#include
#define PUSAGE fprintf(stderr,"USAGE: %s [source file] [destination file] [key]\n\n",argv[0]) /* lỗi xác định trước/thông báo sử dụng */
/* biên dịch bằng clang Encode.c -o mã hóa
khi bạn chạy chương trình này, cần có ba đầu vào/tham số:
1. tên tệp văn bản nguồn của bạn (tệp văn bản ASCII bạn muốn mã hóa)
2. tên của tệp văn bản đích của bạn (tệp sẽ có văn bản được mã hóa trong đó)
3. từ khóa ("mật khẩu" cho tệp được mã hóa)
ví dụ:
./encode source.txt bí mật đích.txt
*/
int main(int argc,char *argv[]) /* đối số vector 0 - tên chương trình, argv 1 - chuỗi nguồn, argv 2 - chuỗi đích, argv 3 - chuỗi khóa */
{
int counter; /* biến đếm để đếm qua các ký tự của mật khẩu */
char letter,lo,hi,rev,inv,enc; /* Các biến được sử dụng cho các chữ cái của văn bản trong quá trình mã hóa */
FILE *sfp=NULL; /* con trỏ tệp nguồn */
FILE *dfp=NULL; /* con trỏ tệp đích */
if((sfp=fopen(argv[1],"r"))==NULL) /* mở tệp văn bản (sfp) có tên trong vectơ đối số 1 để đọc - in thông báo lỗi nếu thao tác này thất bại */
{
fprintf(stderr,"KHÔNG THỂ MỞ TỆP\n");
PUSAGE;
return 1; /* kết thúc chương trình có lỗi */
}
if((dfp=fopen(argv[2],"w"))==NULL) /* mở tệp văn bản (dfp) có tên trong vectơ đối số 2 để ghi - in thông báo lỗi nếu thao tác này thất bại */
{
fprintf(stderr,"KHÔNG THỂ MỞ TỆP\n");
PUSAGE;
return 1; /* kết thúc chương trình có lỗi */
}
counter=0; /* đặt bộ đếm ký tự từ khóa thành 0 */
while((letter=fgetc(sfp))!=EOF) /* xử lý tệp nguồn bằng cách đọc chữ cái tiếp theo (mỗi ký tự 1 ký tự/byte) cho đến khi tệp kết thúc, tức là ký tự EOF (cuối tệp) được đọc TRONG */
{
if(counter==strlen(argv[3])) counter=0; /* đặt lại nếu từ khóa tràn, tức là nếu đạt đến cuối (độ dài chuỗi) */
/* làm gì đó để đọc theo ký tự/byte */
lo=chữ>>4;
xin chào=thư<<4;
rev=chào|lo;
inv=~rev;
enc=inv^argv[3][bộ đếm];
counter++; /* tăng bộ đếm, tức là bước tới ký tự tiếp theo của từ khóa */
fputc(enc,dfp); /* ghi ký tự được mã hóa vào tệp đích */
}
fclose(sfp); /* đóng tập tin sfp */
fclose(dfp); /* đóng tập tin dfp */
trả về 0; /* kết thúc thành công */
#
Tôi hiểu mọi thứ, tôi hiểu các thao tác của đơn vị làm gì... nhưng bây giờ tôi cần giải mã tệp, nhưng tôi phải hiểu những thao tác nào tôi nên sử dụng để đảo ngược các thao tác này:
lo=chữ>>4;
xin chào=thư<<4;
rev=chào|lo;
inv=~rev;
enc=inv^argv[3][bộ đếm];
#
Tôi đã tìm ra điều này, nhưng tôi không hiểu một vài dòng khác:
lo=chữ<<4;
xin chào=thư>>4;
rev=??;
inv=~rev;
enc=??;
Đầu tiên, bạn nên biết Mã Vigenère. Nó rất giống với những gì chương trình mã hóa của bạn làm.
Giả sử bạn là thư
Một byte được lưu trữ trong , và đây là biểu diễn nhị phân của nó:chữ cái = 0b0100 1000
.
Bây giờ hãy xem điều gì xảy ra trong quá trình mã hóa:
// chữ cái = 0100 1000
lo = chữ >> 4; // lo = 0000 0100
chào = chữ cái << 4; // chào = 1000 0000
vòng = xin chào | vòng // vòng = 1000 0100
inv = ~rev; // inv = 0111 1011
argv[3]
Trong ngữ cảnh này là khóa mã hóa, nhưng vì mục đích ví dụ, chúng tôi giả sử argv[3][bộ đếm] = 1010 1010
enc = inv ^ argv[3][bộ đếm]; // enc = 1101 0001
Khi muốn giải mã một tin nhắn, bạn cần áp dụng các bước theo thứ tự khác.
tháng mười hai = enc ^ argv[3][bộ đếm]; // tháng mười hai = 0111 1011
tháng mười hai = ~ tháng mười hai // tháng mười hai = 1000 0100
chào = tháng mười hai << 4; // chào = 0100 0000
lo = tháng mười hai >> 4; // lo = 0000 1000
tháng mười hai = chào | lo; tháng mười hai = 0100 1000
Tôi là một lập trình viên xuất sắc, rất giỏi!