求一段由C语言实现的对文字加密的代码,能插入到这里面的,课程要交,谢谢了。
请将以上代码段插入到你给出的代码中的指定位置,替换原有的注释行。这段代码实现了文字加密的函数和文件加密的函数,并在文件解密部分调用了文件加密函数进行解密操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 函数声明
void encryptText(char* text, char* secretKey);
int encryptFile(const char* sourceFile, const char* secretKey, const char* targetFile);
// 文字加密函数
void encryptText(char* text, char* secretKey) {
int textLen = strlen(text);
int keyLen = strlen(secretKey);
for (int i = 0; i < textLen; i++) {
text[i] ^= secretKey[i % keyLen];
}
}
// 文件加密函数
int encryptFile(const char* sourceFile, const char* secretKey, const char* targetFile) {
FILE* source = fopen(sourceFile, "r");
if (source == NULL) {
printf("无法打开源文件\n");
return 0;
}
FILE* target = fopen(targetFile, "w");
if (target == NULL) {
printf("无法打开目标文件\n");
fclose(source);
return 0;
}
char buffer[1024];
while (fgets(buffer, sizeof(buffer), source) != NULL) {
encryptText(buffer, secretKey);
fputs(buffer, target);
}
fclose(source);
fclose(target);
return 1;
}
// 文件解密部分
case 'b':
while (1) {
printf("输入要解密的文件名(含路径): ");
scanf("%s", sourcefile);
printf("输入密钥: ");
scanf("%s", secretKey);
printf("解密后的文件名(含路径): ");
scanf("%s", targetFile);
if (encryptFile(sourcefile, secretKey, targetFile)) {
printf("文件[%s]解密成功,保存在[%s]\n", sourcefile, targetFile);
printf("是否继续解密文件?(输入 'a' 继续,其他键退出):");
char option;
scanf(" %c", &option);
if (option == 'a') {
system("cls");
} else {
break; // 回到主菜单
}
}
break;
}
仅供参考:
#include <stdio.h>
#include <string.h>
#include <conio.h>
FILE *fi,*fo;
int i;
int main(int argc,char **argv) {
if (argc<3) {
printf("Usage:%s src des\n",argv[0]);
return 1;
}
if (0==stricmp(argv[1],argv[2])) {
printf("Src and des is same!\n");
return 2;
}
fo=fopen(argv[2],"wb");
if (NULL==fo) {
printf("Can not create file %s\n",argv[2]);
return 3;
}
fi=fopen(argv[1],"rb");
if (NULL==fi) {
fclose(fo);
printf("Can not find file %s\n",argv[1]);
return 4;
}
i=0;
fseek(fi,-1L,SEEK_END);
while (1) {
fputc(fgetc(fi)^0x5A,fo);
i++;
if (i%1000000==0) cprintf("\r%dKB",i/1000);
if (fseek(fi,-2,SEEK_CUR)) break;
}
fclose(fi);
fclose(fo);
cprintf("\r%dKB OK.\r\n",i/1000);
return 0;
}
低级语言的一个关键属性是程序员可以很容易地理解语言的抽象机如何映射到底层物理机。在 PDP-11 上肯定是这样的,因为每个 C 语言表达式都映射到一至两个指令。类似地,编译器将局部变量直接降到栈槽,并将原始类型映射成 PDP-11 可以直接操作的元素。
从那时起,为了维护人们对 C 语言可以很容易映射到底层硬件并能够提供快速执行的代码的印象,C 语言的实现变得越来越复杂。2015 年的一份针对 C 语言程序员、编译器开发者和标准委员会成员的调查指出了几个有关 C 语言可理解性的问题。例如,C 语言的实现可以填充结构体(不是数组),以确保所有字段都能够对齐目标。如果将结构体归零,然后设置一些字段,那么填充位是否都为零?根据调查结果,36%的人表示会是零,29%的人表示不知道。事实上,根据编译器(和优化级别)的不同,它可能是也可能不是。
这是一个相当简单的例子,但很大一部分程序员的理解要么是错的,要么不确定。当你在使用指针时,C 语言的语义就会变得更加混乱。BCPL 模型非常简单:值就是单词。每个单词就是某些数据或某些数据的地址。内存是通过地址进行索引的扁平存储单元阵列。
相比之下,C 语言模型允许在各种目标平台上实现,包括分段式架构(指针可能是分段 ID 和偏移量),甚至是基于垃圾回收机制的虚拟机。C 语言规范十分谨慎地限制对指针的操作,以避免此类系统出现问题。人们对 C 语言缺陷报告 260 的反应就包括了指针起源(provenance)的概念。
然而,“起源”这个词根本没有出现在 C11 规范中,所以完全由编译器来决定它的含义。例如,GCC(GNU 编译器集合)和 Clang 在对指针进行强制转换是否保留起源这个问题上存在不同的理解。编译器可以自由决定指向不同 malloc 结果或栈分配的两个指针总是不相等,即使指针的按位比较操作可能显示它们描述的是相同的地址。
这些误解本质上不是纯粹的学术问题。例如,我们已经从有符号整数溢出(C 语言的未定义行为)和一些代码中找到了安全漏洞。对于后者,在进行空值检查之前取消引用指针是在告诉编译器指针不能为空,因为取消引用空指针在 C 语言中是未定义行为,因此可以假定这种情况不会发生(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2009-1897)。
因此,我们很难说程序员可以准确理解 C 语言程序将如何映射到底层架构。