谁帮我看看这段加密解密的代码哪里错了,解密的时候发现数据丢失!

libinden71 2016-10-08 01:50:20
int prin_size1()
{
FILE *p = fopen("F:\\cs.txt", "rb");
int size = 0;
int ch;
if (p != NULL)
{
while ((ch = getc(p)) != EOF)
{
size++;
}
}
fclose(p);
return size;
}

//int prin_size2()
//{
// FILE *p = fopen("F:\\cs.txt", "rb");
// int size = -1;
// if (p != NULL)
// {
// while (!feof(p))
// {
// fgetc(p);
// size++;
// }
// }
// fclose(p);
// return size;
//}

void mains()//分段加密
{
FILE *pf = fopen("F:\\cs.txt", "rb");
FILE *pfw = fopen("F:\\cs(加密).txt", "wb");
char str[100] = { 0 };

if (pf == NULL || pfw == NULL)
{
printf("文件打开失败\n");
}
else
{
int size = 0;
int length = 0;
printf("请输入加密的密码:");
scanf("%s", str);
length = strlen(str);
size = prin_size1();
printf("size=%d\n", size);

if (size%length == 0)
{
for (int i = 0; i < size / length; i++)
{
for (int j = 0; j < length; j++)
{
fputc(fgetc(pf) ^ str[j], pfw);
}
}
}
else
{
for (int i = 0; i < size / length - 1; i++)
{
for (int j = 0; j < length; j++)
{
fputc(fgetc(pf) ^ str[j], pfw);
}
}
}

}


fclose(pf);
fclose(pfw);
system("pause");
}

void main()//分段解密
{

FILE *pf = fopen("F:\\cs(加密).txt", "rb");
FILE *pfw = fopen("F:\\cs(解密).txt", "wb");
char str[100] = { 0 };

if (pf == NULL || pfw == NULL)
{
printf("文件打开失败\n");
}
else
{
int size = 0;
int length = 0;
printf("请输入解密的密码:");
scanf("%s", str);
length = strlen(str);
size = prin_size1();

if (size%length == 0)
{
for (int i = 0; i < size / length; i++)
{
for (int j = 0; j < length; j++)
{
fputc(fgetc(pf) ^ str[j], pfw);
}
}
}
else
{
for (int i = 0; i < size / length - 1; i++)
{
for (int j = 0; j < length; j++)
{
fputc(fgetc(pf) ^ str[j], pfw);
}
}

for (int i = 0; i < size%length; i++)
{
fputc(fgetc(pf) ^ str[i], pfw);
}
}
}


fclose(pf);
fclose(pfw);
system("pause");
}
...全文
111 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinden71 2016-10-08
  • 打赏
  • 举报
回复
从调试秘钥时 发现 原来正真原因 是循环多了-1 去掉之后就可以了
libinden71 2016-10-08
  • 打赏
  • 举报
回复
引用 7 楼 ipqtjmqj 的回复:
[quote=引用 6 楼 libinden71 的回复:] 我看了好多遍了 没发现哪里逻辑有错误啊!
不要光看,要多输出中间变量,一开始测试的文件可以小一点,比如只包含5个字符,密钥的长度为2,加密后用二进制查看器看一下对不对,如果对了就排除了加密的代码,再调试解密的[/quote] 知道了 秘钥长度问题
libinden71 2016-10-08
  • 打赏
  • 举报
回复
谁快帮我看看啊!
ipqtjmqj 2016-10-08
  • 打赏
  • 举报
回复
引用 6 楼 libinden71 的回复:
我看了好多遍了 没发现哪里逻辑有错误啊!
不要光看,要多输出中间变量,一开始测试的文件可以小一点,比如只包含5个字符,密钥的长度为2,加密后用二进制查看器看一下对不对,如果对了就排除了加密的代码,再调试解密的
libinden71 2016-10-08
  • 打赏
  • 举报
回复
我看了好多遍了 没发现哪里逻辑有错误啊!
libinden71 2016-10-08
  • 打赏
  • 举报
回复
引用 4 楼 libinden71 的回复:
[quote=引用 3 楼 ipqtjmqj 的回复:] 你在主楼发的代码,只有解密时有吧,加密时没有
不好意思 复制少了 还是一样 还是丢失 [/quote] 我重新发下吧! #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <string.h> int prin_size1() { FILE *p = fopen("F:\\cs.txt", "rb"); int size = 0; int ch; if (p != NULL) { while ((ch = getc(p)) != EOF) { size++; } } fclose(p); return size; } void mainasd()//分段加密 { FILE *pf = fopen("F:\\cs.txt", "rb"); FILE *pfw = fopen("F:\\cs(加密).txt", "wb"); char str[100] = { 0 }; if (pf == NULL || pfw == NULL) { printf("文件打开失败\n"); } else { int size = 0; int length = 0; printf("请输入加密的密码:"); scanf("%s", str); length = strlen(str); size = prin_size1(); printf("size=%d\n", size); if (size%length == 0) { for (int i = 0; i < size / length; i++) { for (int j = 0; j < length; j++) { fputc(fgetc(pf) ^ str[j], pfw); } } } else { for (int i = 0; i < size / length - 1; i++) { for (int j = 0; j < length; j++) { fputc(fgetc(pf) ^ str[j], pfw); } } for (int i = 0; i < size%length; i++) { fputc(fgetc(pf) ^ str[i], pfw); } } } fclose(pf); fclose(pfw); system("pause"); } void main()//分段解密 { FILE *pf = fopen("F:\\cs(加密).txt", "rb"); FILE *pfw = fopen("F:\\cs(解密).txt", "wb"); char str[100] = { 0 }; if (pf == NULL || pfw == NULL) { printf("文件打开失败\n"); } else { int size = 0; int length = 0; printf("请输入解密的密码:"); scanf("%s", str); length = strlen(str); size = prin_size1(); if (size%length == 0) { for (int i = 0; i < size / length; i++) { for (int j = 0; j < length; j++) { fputc(fgetc(pf) ^ str[j], pfw); } } } else { for (int i = 0; i < size / length - 1; i++) { for (int j = 0; j < length; j++) { fputc(fgetc(pf) ^ str[j], pfw); } } for (int i = 0; i < size%length; i++) { fputc(fgetc(pf) ^ str[i], pfw); } } } fclose(pf); fclose(pfw); system("pause"); }
libinden71 2016-10-08
  • 打赏
  • 举报
回复
引用 3 楼 ipqtjmqj 的回复:
你在主楼发的代码,只有解密时有吧,加密时没有
不好意思 复制少了 还是一样 还是丢失
ipqtjmqj 2016-10-08
  • 打赏
  • 举报
回复
你在主楼发的代码,只有解密时有吧,加密时没有
libinden71 2016-10-08
  • 打赏
  • 举报
回复
引用 1 楼 ipqtjmqj 的回复:
加密时如果不刚好整除,没有然后了吗
for (int i = 0; i < size / length - 1; i++) { for (int j = 0; j < length; j++) { fputc(fgetc(pf) ^ str[j], pfw); } } for (int i = 0; i < size%length; i++) { fputc(fgetc(pf) ^ str[i], pfw); } 后面这段 就是处理 else 的啊
ipqtjmqj 2016-10-08
  • 打赏
  • 举报
回复
加密时如果不刚好整除,没有然后了吗

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧