我花了一整天时间尝试解密c中的文件。我需要编写一个可以加密和解密文件的程序。我有一个bin文件,我需要解密并从中获取文本。这就是我现在所做的,因为我看到它只加密。请帮帮我。
这是我的代码:
#include <stdio.h>
#include <string.h>
#define MAX 256
int main() {
FILE *fp1, *fp2;
int key, val, ch, i = 0;
char filename[MAX], temp[] = "temp.txt";
/* get the file name from the user */
printf("Enter your file name:");
scanf("%s", filename);
/* open the given file in read mode */
fp1 = fopen(filename, "rb");
/* error handling */
if (!fp1) {
printf("Unable to open the input file!!\n");
return 0;
}
/* open the temporary file in write mode */
fp2 = fopen(temp, "wb+");
/* error handling */
if (!fp2) {
printf("Unable to open the temporary file!!\n");
return 0;
}
/* get the key from the user to create cipher */
printf("Enter the key to create cipher text:");
scanf("%d", &key);
/* converting plain text to cipher text */
while ((ch = fgetc(fp1)) != EOF) {
/* adding key to the ascii value of the fetched char */
val = (ch + key)%256;
fprintf(fp2, "%d ", val);
i++;
if (i % 10 == 0) {
fprintf(fp2, "\n");
}
}
/* closing all opened files */
fclose(fp1);
fclose(fp2);
/* open the file containint cipher text in read mode */
fp2 = fopen(temp, "r");
/* printing the cipher text */
printf("\nCipher text for the given plain text:\n");
while (!feof(fp2)) {
fscanf(fp2, "%d", &ch);
if (!feof(fp2)) {
printf("%c", ch);
}
}
/* moving the file pointer to the start of file */
rewind(fp2);
/*
* converting the cipher text to plain
* text and printing it to console
*/
printf("\n\nConverting the cipher text to plain text:\n");
while (!feof(fp2)) {
fscanf(fp2, "%d", &ch);
if (!feof(fp2)) {
val = (ch - key)%256;
printf("%c", val);
}
}
printf("\n");
/* close all opened files */
fclose(fp2);
return 0;
printf("\n");
}
这是输出:
121 164 152 154 129 133 130 136 94 121
23 248 23 16 23 10 23 243 94 134
116 132 116 195 182 190 94 144 144 131
160 185 194 187 200 188 116 135 116 132
116 166 131 154 189 192 200 185 198 131
154 192 181 200 185 152 185 183 195 184
185 146 146 94 199 200 198 185 181 193
94 204 240 65 111 29 254 127 15 197
211 18 22 63 20 197 120 233 218 194
132 90 163 123 228 49 159 98 184 101
6 31 84 117 93 56 193 70 79 253
126 161 249 194 157 10 67 119 15 196
13 146 193 9 218 238 155 173 113 73
53 147 115 83 146 124 80 59 9 141
216 41 112 210 82 31 27 115 210 201
76 171 112 145 174 89 140 250 226 26
214 218 23 35 211 79 12 210 211 108
89 155 207 92 154 113 53 68 81 59
23 3 19 72 149 79 23 75 179 83
204 166 78 96 123 185 34 243 58 248
212 147 1 198 30 255 244 234 135 210
173 69 35 123 248 173 69 69 22 7
2 59 57 248 194 80 204 163 87 76
69 164 179 72 59 63 80 189 163 174
53 247 42 189 30 243 18 211 79 69
76 82 76 221 212 144 14 89 181 24
19 181 173 96 100 252 181 5 109 168
但它应该是文字,而不是数字
答案 0 :(得分:1)
编写自己的加密/解密算法被广泛认为(由密码学家和安全专业人员)是一个坏主意 - 如果您想要保护您的数据。如果你只是为了好玩而这样做,那就不同了。假设前者,有许多良好的加密算法的开源实现。例如AES。
如果你正在做这个有趣的事情,然后回答你的问题,你看到的输出看起来就像来自第二个while循环。您可以在第二个和第三个while循环之前打印一行,以确定:
printf( "Before second while loop\n");
// second while loop here
printf( "Before third while loop\n");
// third while loop here
如果输出来自第二个while循环,那么问题是,第三个循环的输出发生了什么。如果第三个while循环根本没有执行,因为feof(fp2)在第一次调用时返回true,那么你就不会得到任何输出。您可以在while循环中放置printf来检查:printf("In third while loop\n");
另一种可能性是if语句没有被执行。这几乎肯定不是,但你可以在其中加入printf以确保:printf("In if statement\n");
如果没有执行while循环或if语句,那么rewind()会发生一些事情。但是,如果它们被执行,那么printf("%c", val)
必须打印空白或空值。您可以添加printf("%c:%x ", val, val)
或类似内容以查看val等于。