私は、不十分な暗号化アルゴリズムで暗号化されたPDFを暗号化分析することになっている割り当てに取り組んでいます。
教授によって提供されたコードは、で暗号化されたファイルを作成しますfd=open(filename, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR)
。
復号化を試みるコードで、そのファイルを。で開きますfd_in=open(file, O_RDONLY)
。
問題は、ファイルから読み込もうとすると、「不正なファイル記述子」エラーが発生することです。statを使用して、開かれたファイルについてファイル記述子が「考えた」ことに関する詳細情報を取得しようとしました。実際には数百KBの場合、ファイルの長さは0であることが示されています。
私が使用しているデバッグコードは次のとおりです。
if (0 > (len = read(fd_in, (char*)&read_buff, BITE))) { // BITE is defined as 8
printf("Error occured grabbing first bite of %s.\n", file);
printf("%s.\n", strerror(errno));
struct stat fileStat;
int stat = fstat(fd_in, &fileStat);
printf("fstat returned: %d.\n", stat); // Consistently printing 0
printf("Information for %s\n",file);
printf("---------------------------\n");
printf("File Size: \t\t%d bytes\n",fileStat.st_size);
printf("Number of Links: \t%d\n",fileStat.st_nlink);
printf("File inode: \t\t%d\n",fileStat.st_ino);
printf("File Permissions: \t");
printf( (S_ISDIR(fileStat.st_mode)) ? "d" : "-");
printf( (fileStat.st_mode & S_IRUSR) ? "r" : "-");
printf( (fileStat.st_mode & S_IWUSR) ? "w" : "-");
printf( (fileStat.st_mode & S_IXUSR) ? "x" : "-");
printf( (fileStat.st_mode & S_IRGRP) ? "r" : "-");
printf( (fileStat.st_mode & S_IWGRP) ? "w" : "-");
printf( (fileStat.st_mode & S_IXGRP) ? "x" : "-");
printf( (fileStat.st_mode & S_IROTH) ? "r" : "-");
printf( (fileStat.st_mode & S_IWOTH) ? "w" : "-");
printf( (fileStat.st_mode & S_IXOTH) ? "x" : "-");
printf("\n\n");
return 1;
}
私が得ている結果は次のとおりです。
Error occured grabbing first bite of enc.pdf.
Bad file descriptor.
Information for enc.pdf
---------------------------
File Size: 0 bytes
Number of Links: 1
File inode: 16441996
File Permissions: -rw-------
lsはファイルを次のように報告します
-rw------- 1 matt matt 157887 Oct 29 03:01 enc.pdf
ファイルを開くことに関連するコード:
int fd_in=open(file, O_RDONLY);
if(fd_in<0) {
printf("Failed to open the input file %s.\n", file);
return 1;
} else {
printf("File open, descriptor is: %d.\n", fd_in);
}
これにより、フィールド記述子の値3が一貫して出力されます。
read_buffについていくつか質問がありました。暗号化/復号化プロセスには、読み取られた値のXORが含まれます。このため、バッファはとして宣言され、unsigned long long
それを読み込むために、アドレスを取得して(char *)にキャストします。この戦術は、暗号化されたファイルを作成するための教授のコードから直接出たものです。
ファイル記述子が有効になっていることを確認するために、printfでelseを追加しました。現時点では一貫しているようです3
が、間違いなくそうではありません-1