c语言加密解密算法(c语言加密与解密)

2023-02-02 15:01:49 密语知识 思思

c语言加密算法

看你催就仓促写了个,自我感觉写的不是很好,但是能用了。数据只能是大写字母组成的字符串。

加密的时候,输入Y,然后输入要加密的文本(大写字母)

解密的时候,输入N,然后输入一个整数n表示密文的个数,然后n个整数表示加密时候得到的密文。

/*RSA algorithm */

#include stdio.h

#include string.h

#include stdlib.h

#define MM 7081

#define KK 1789

#define PHIM 6912

#define PP 85

typedef char strtype[10000];

int len;

long nume[10000];

int change[126];

char antichange[37];

void initialize()

{ int i;

char c;

for (i = 11, c = 'A'; c = 'Z'; c ++, i ++)

{ change[c] = i;

antichange[i] = c;

}

}

void changetonum(strtype str)

{ int l = strlen(str), i;

len = 0;

memset(nume, 0, sizeof(nume));

for (i = 0; i l; i ++)

{ nume[len] = nume[len] * 100 + change[str[i]];

if (i % 2 == 1) len ++;

}

if (i % 2 != 0) len ++;

}

long binamod(long numb, long k)

{ if (k == 0) return 1;

long curr = binamod (numb, k / 2);

if (k % 2 == 0)

return curr * curr % MM;

else return (curr * curr) % MM * numb % MM;

}

long encode(long numb)

{ return binamod(numb, KK);

}

long decode(long numb)

{ return binamod(numb, PP);

}

main()

{ strtype str;

int i, a1, a2;

long curr;

initialize();

puts("Input 'Y' if encoding, otherwise input 'N':");

gets(str);

if (str[0] == 'Y')

{ gets(str);

changetonum(str);

printf("encoded: ");

for (i = 0; i len; i ++)

{ if (i) putchar('-');

printf(" %ld ", encode(nume[i]));

}

putchar('\n');

}

else

{ scanf("%d", len);

for (i = 0; i len; i ++)

{ scanf("%ld", curr);

curr = decode(curr);

a1 = curr / 100;

a2 = curr % 100;

printf("decoded: ");

if (a1 != 0) putchar(antichange[a1]);

if (a2 != 0) putchar(antichange[a2]);

}

putchar('\n');

}

putchar('\n');

system("PAUSE");

return 0;

}

测试:

输入:

Y

FERMAT

输出:

encoded: 5192 - 2604 - 4222

输入

N

3 5192 2604 4222

输出

decoded: FERMAT

RSA加密解密算法示例(C语言)

#include stdlib.h

#include stdio.h

#include string.h

#include math.h

#include time.h

#define PRIME_MAX 200   // 生成素数范围

#define EXPONENT_MAX 200 // 生成指数e范围

#define Element_Max 127    // 加密单元的最大值,这里为一个char, 即1Byte

char str_read[100]="hello world !";  // 待加密的原文

int str_encrypt[100];                // 加密后的内容

char str_decrypt[100];              // 解密出来的内容

int str_read_len;                    // str_read 的长度

int prime1, prime2;                  // 随机生成的两个质数

int mod, eular;                      // 模数和欧拉数

int pubKey, priKey;                  // 公钥指数和私钥指数

// 生成随机素数,实际应用中,这两个质数越大,就越难破解。

int randPrime()

{

int prime, prime2, i;

next:

prime = rand() % PRIME_MAX;   // 随机产生数

if (prime = 1) goto next;      // 不是质数,生成下一个随机数

if (prime == 2 || prime == 3) return prime;

prime2 = prime / 2;              // prime=4, prime2 的平方必定大于 prime , 因此只检查小于等于prime2的数

for (i = 2; i = prime2; i++)   // 判断是否为素数

{

if (i * i prime) return prime;

if (prime % i == 0) goto next;  // 不是质数,生成下一个随机数

}

}

// 欧几里德算法,判断a,b互质

int gcd(int a, int b)

{

int temp;

while (b != 0) {

temp = b;

b = a % b;

a = temp;

}

return a;

}

//生成公钥指数,条件是 1 e 欧拉数,且与欧拉数互质。

int randExponent()

{

int e;

while (1)

{

e = rand() % eular; if (e EXPONENT_MAX) break;

}

while (1)

{

if (gcd(e, eular) == 1) return e; e = (e + 1) % eular; if (e == 0 || e EXPONENT_MAX) e = 2;

}

}

//生成私钥指数

int inverse()

{

int d, x;

while (1)

{

d = rand() % eular;

x = pubKey * d % eular;

if (x == 1)

{

return d;

}

}

}

//加密函数

void jiami()           

{

str_read_len = strlen(str_read);      //从参数表示的地址往后找,找到第一个'\0',即串尾。计算'\0'至首地址的“距离”,即隔了几个字符,从而得出长度。

printf("密文是:");

for (int i = 0; i str_read_len; i++)

{

int C = 1; int a = str_read[i], b = a % mod;

for (int j = 0; j pubKey; j++) //实现加密

{

C = (C*b) % mod;

}

str_encrypt[i] = C;

printf("%d ", str_encrypt[i]);

}

printf("\n");

}

//解密函数

void jiemi()         

{

int i=0;  for (i = 0; i str_read_len; i++)

{

int C = 1; int a = str_encrypt[i], b=a%mod;

for (int j = 0; j priKey; j++)

{

C = (C * b) % mod;

}

str_decrypt[i] = C;

}

str_decrypt[i] = '\0'; printf("解密文是:%s \n", str_decrypt);

}

int main()

{

srand(time(NULL));

while (1)

{

prime1 = randPrime(); prime2 = randPrime(); printf("随机产生两个素数:prime1 = %d , prime2 = %d ", prime1, prime2);

mod = prime1 * prime2; printf("模数:mod = prime1 * prime2 = %d \n", mod); if (mod Element_Max) break; // 模数要大于每个加密单元的值

}

eular = (prime1 - 1) * (prime2 - 1);  printf("欧拉数:eular=(prime1-1)*(prime2-1) = %d \n", eular);

pubKey = randExponent(); printf("公钥指数:pubKey = %d\n", pubKey);

priKey = inverse(); printf("私钥指数:priKey = %d\n私钥为 (%d, %d)\n", priKey, priKey, mod);

jiami(); jiemi();

return 0;

}

c语言加密解密算法(c语言加密与解密) 第1张

C语言设计一个简单的加密解密程序

C语言设计一个简单的加密解密程序如下:

加密程序代码:

#includestdio.h

main()

{

char c,filename[20];

FILE *fp1,*fp2;

printf("请输入待加密的文件名:\n");

scanf("%s",filename);

fp1=fopen(filename,"r");

fp2=fopen("miwen.txt","w");

do

{

c=fgetc(fp1);

if(c=32c=126)

{

c=c-32;

c=126-c;

}

if(c!=-1)

fprintf(fp2,"%c",c);

}

while(c!=-1);

}

解密程序代码:

#includestdio.h

#includestring.h

main()

{

char c,filename[20];

char yanzhengma[20];

FILE *fp1,*fp2;

printf("请输入待解密文件名:\n");

scanf("%s",filename);

printf("请输入验证码:\n");

scanf("%s",yanzhengma);

if(strcmp(yanzhengma,"shan")==0)

{

fp1=fopen(filename,"r");

fp2=fopen("yuanwen.txt","w");

do

{

c=fgetc(fp1);

if(c=32c=126)

{

c=126-c;

c=32+c;

}

if(c!=-1)

fprintf(fp2,"%c",c);

}

while(c!=-1);

}

else

{

printf("验证码错误!请重新输入:\n");

scanf("%s",filename);

}

}

c语言加密解密算法

这里使用的是按位加密,按ASCII码进行加密的算法自己写个,很容易的。

#includestdio.h

#includestdlib.h

#includeconio.h

#includestring.h

void

dofile(char

*in_fname,char

*pwd,char

*out_fname);/*对文件进行加密的具体函数*/

void

usage(char

*name);

void

main(int

argc,char

*argv[])/*定义main()函数的命令行参数*/

{

char

in_fname[30];/*用户输入的要加密的文件名*/

char

out_fname[30];

char

pwd[10];/*用来保存密码*/

if(argc!=4)

{/*容错处理*/

usage(argv[0]);

printf("\nIn-fname:\n");

gets(in_fname);/*得到要加密的文件名*/

while(*in_fname==NULL)

{

printf("\nIn-fname:\n");

gets(in_fname);

}

printf("Password

6-8:\n");

gets(pwd);/*得到密码*/

while(*pwd==NULL

||

strlen(pwd)8

||

strlen(pwd)6)

{

printf("Password

6-8:\n");

gets(pwd);

}

printf("Out-file:\n");

gets(out_fname);/*得到加密后你要的文件名*/

while(*in_fname==NULL)

{

printf("Out-file:\n");

gets(out_fname);

}

while(!strcmp(in_fname,out_fname))

{

printf("文件名不能和源文件相同\n");

printf("Out-file:\n");

gets(out_fname);

}

dofile(in_fname,pwd,out_fname);

printf("加密成功,解密请再次运行程序\n");

}

else

{/*如果命令行参数正确,便直接运行程序*/

strcpy(in_fname,argv[1]);

strcpy(pwd,argv[2]);

strcpy(out_fname,argv[3]);

while(*pwd==NULL

||

strlen(pwd)8

||

strlen(pwd)6)

{

printf("Password

faied!\n");

printf("Password

6-8:\n");

gets(pwd);

}

while(!strcmp(in_fname,out_fname))

{

printf("文件名不能和源文件相同\n");

printf("Out-file:\n");

gets(out_fname);

while(*in_fname==NULL)

{

printf("Out-file:\n");

gets(out_fname);

}

}

dofile(in_fname,pwd,out_fname);

printf("加密成功,解密请再次运行程序\n");

}

}

/*加密子函数开始*/

void

dofile(char

*in_fname,char

*pwd,char

*out_file)

{

FILE

*fp1,*fp2;

register

char

ch;

int

j=0;

int

j0=strlen(pwd);

fp1=fopen(in_fname,"rb");

if(fp1==NULL)

{

printf("cannot

open

in-file.\n");

exit(1);/*如果不能打开要加密的文件,便退出程序*/

}

fp2=fopen(out_file,"wb");

if(fp2==NULL)

{

printf("cannot

open

or

create

out-file.\n");

exit(1);/*如果不能建立加密后的文件,便退出*/

}

/*加密算法开始*/

while(j0=0)

{

ch=fgetc(fp1);

while(!feof(fp1))

{

fputc(ch^pwd[j=j0?j=0:j++],fp2);/*异或后写入fp2文件*/

ch=fgetc(fp1);

}

j0--;

}

fclose(fp1);/*关闭源文件*/

fclose(fp2);/*关闭目标文件*/

}

void

usage(char

*name)

{

printf("\t=======================File

encryption======================\n");

printf("\tusage:

%s

In-fname

password

out_fname\n",name);

printf("\tExample:

%s

file1.txt

12345678

file2.txt\n",name);

}

用c语言设计一个简单地加密算,解密算法,并说明其中的原理

可能很长 ,这是在我以前一个程序里摘出来的。

原理:用户输入创建密码,机器读取,并把每一位密码进行加密,这里就是把每一位的 ASCII码加一(也可以有其他的加密方式),然后保存在文件里。解密时从文件中读取保存的乱码,然后把它每一位的ascII码减一 在与你输入的密码比较,正确既可以进入。

#define CODE_SIZE 10

int password()

{

FILE *fp;

char s1[CODE_SIZE], s2[CODE_SIZE], s3[CODE_SIZE], fun;

while (1)

{

fp = fopen("password.txt", "r");

if (fp == NULL)

{

printf("第一次运行,请输入初始密码(最多8位):\n");

scanf("%s", s1);

printf("请再次输入初始密码:\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("password.txt", "w+");

if (fp == NULL)

{

printf("创建文件失败退出\n");

getch();

exit(1);

}

else

{

//对s1加密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

printf("初始密码创建完成.\n");

}

}

else

{

printf("两次输入的密码不一致!\n");

}

fclose(fp);

}

else

{

fgets(s1, CODE_SIZE, fp);

fclose(fp);

printf("输入密码:\n");

scanf("%s", s2);

//对s1解密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] - i;

}

loop:

if (strcmp(s1, s2) == 0)

{

printf("-----密码正确-----\n");

printf("-----请选择功能-----\n");

printf("-----1:修改密码-----\n");

printf("-----2:进入通讯录-----\n");

scanf("%d", fun);

switch (fun)

{

case 1: printf("请输入新密码\n");

scanf("%s", s1);

printf("请再次输入新密码\n");

scanf("%s", s2);

if (strcmp(s1, s2) == 0)

{

fp = fopen("password.txt", "w+");

if (fp == NULL)

{

printf("文件错误!\n");

}

else

{ //对s1加密

for (int i = 0; iCODE_SIZEs1[i] != ' '; i++)

{

s1[i] = s1[i] + i;

}

fputs(s1, fp);

fclose(fp);

printf("密码修改成功\n");

}

}

else

{

printf("两次输入的密码不一致,修改失败\n");

}

break;

case 2: return 1;

default: printf("无效指令\n");

}

}

else

{

printf("密码错误\n请重新输入\n");

scanf("%s", s2);

goto loop;

}

}

printf("------------------\n\n\n\n");

}

}