/*编译环境:xp3 32位 编译工具:vc6.0*/
/*第一次运行输入密码#deabc
运行加密后在同目录下生成连个文件
num.txt和word.txt
解密时这连个文件需要和exe文件在同一个目录下才行
ps:一个无知的c爱好者..时不时弄点东西..记录自己走过的路
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void input (void);
void finput (void);
void conversion (void);
int random_number(void);
void print (void);
char ch[50];
int num[50];
int i; // 写入文本的字节数
int main (void)
{
char ch;
char ch2[10]; //初始运行的口令
puts ("请输入运行密码:");
gets (ch2);
if (strcmp (ch2,"#deabc") == 0)
{
puts ("******************************************");
puts ("加密文本输入(a) 解密文本输入(b)");
puts ("******************************************");
fflush (stdin);
while ((ch = getchar()) != '\n')
{
puts ("******************************************");
fflush (stdin);
if (ch == 'a')
{
input ();
conversion ();
finput ();
puts ("******************************************");
}
else if (ch == 'b')
print ();
else
{
puts ("输入的不是 a或b 请重新输入字母 a或b.");
puts ("******************************************");
}
puts ("******************************************");
puts ("加密文本输入(a) 解密文本输入(b)");
puts ("******************************************");
}
}
else
{
puts ("密码错误.");
getchar();
}
puts ("Bye !");
return 0;
}
/*****************************************************************/
// 加密
void input (void) // 输入
{
puts ("请输入账号和密码(回车结束输入):");
gets (ch);
fflush (stdin);
}
void conversion (void) // 字符串转换成数字
{
for (i=0; ch[i] != '\0'; i++)
num[i] = (int)ch[i] + random_number();
num[i] = '\n'+ random_number();//添加换行符
}
void finput (void) // 保存到文件
{
FILE * fp;
if ((fp = fopen ("word.txt", "a+b")) == NULL)
{
fputs ("打开word.txt失败.\n", stderr);
exit (EXIT_FAILURE);
}
fwrite (num,(i+1)*sizeof(int), 1, fp);// 写入文件
if (ferror (fp) != 0)
fputs ("写入文件失败.\n", stderr);
if (fclose (fp) != 0)
fputs ("关闭文件失败.\n", stderr);
}
int random_number(void) // 获取随机数
{
static unsigned long int next, num;
static int i=0;
FILE * fp;
int number;
if(i==0) //只调用一次time();
{
next=time(0);
i++;
}
next=next*123456789+9871345;
num =(unsigned int)(next/445566)%349;
number = (int)num;
// 保存随机数到文件
if ((fp = fopen ("num.txt", "a+b")) == NULL)
{
fputs ("打开word.txt失败.\n", stderr);
exit (EXIT_FAILURE);
}
fwrite (&number, sizeof(number), 1, fp);
if (ferror (fp) != 0)
fputs ("写入文件失败.\n", stderr);
if (fclose (fp) != 0)
fputs ("关闭文件失败.\n", stderr);
return number;
}
/*****************************************************************/
// 解密
void print (void) // 数字转换成字符并输出到屏幕
{
unsigned long int num;
int num2, ch2;
int ch; //结束标志
FILE * fp;
FILE * fp2;
if ((fp = fopen ("num.txt", "r")) == NULL)
{
fputs ("打开word.txt失败.\n", stderr);
exit (EXIT_FAILURE);
}
if ((fp2 = fopen ("word.txt", "r")) == NULL)
{
fputs ("打开word.txt失败.\n", stderr);
exit (EXIT_FAILURE);
}
fread (&num, sizeof(int), 1, fp);
fread (&num2, sizeof(int), 1, fp2);
ch = getc (fp);// 使用之后 指针自动前移1
fseek (fp, -1, SEEK_CUR);// 指针后移1
while (ch != EOF )
{
ch2 = num2 - num;
printf ("%c", ch2);
fread (&num, sizeof(int), 1, fp);
fread (&num2, sizeof(int), 1, fp2);
ch = getc (fp);// 使用之后 指针自动前移1
fseek (fp, -1, SEEK_CUR);// 指针后移1
}
ch2 = num2 - num;
printf ("%c", ch2);
puts ("******************************************");
if (ferror (fp) != 0)
fputs ("读取文件失败.\n", stderr);
if (fclose (fp) != 0)
fputs ("关闭文件失败.\n", stderr);
if (ferror (fp2) != 0)
fputs ("读取文件失败.\n", stderr);
if (fclose (fp2) != 0)
fputs ("关闭文件失败.\n", stderr);
}
/*****************************************************************/
加密.文本.
最新推荐文章于 2024-05-17 19:02:36 发布