C字符串简易加密解密算法

一、 问题描述
对一个指定的字符串进行加密之后,利用解密函数能后对密文解密显示明文信息,这里定义加密的规则:是将字符串中每个字符加上它在字符串中的位置和一个偏移值。例如:将字符串“mrsoft”为例子第一个字符串中的位置为0,那么它对应的密文应是:“m+0+5”即:‘r’。
因此这里将模拟一次发送信息的加密与解密的过程。便于今后学习哈夫曼编码和MD5方向之一做个铺垫。

二、 算法设计
考虑到使用switch语句过于老套,在main()中构造一个无线循环,每次都要接受用户的模式位选择,操作流程为输入1加密新的密文,输入2对刚才加密的密文进行解密。并将每次加密解密的结果分别存放在L.txt(密文)和M.txt(明文)中。当用户输入3时退出系统,输入其他一切ASCII字符均无效。将提示用户重新选择模式。

三、 代码实现

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd. 
File name:
Author:Jerey_Jobs    Version:0.1    Date: 
Description:
Funcion List: 
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <windows.h>  //原先在windows下试的 没成功 正在查
//当前程序在Linux中的运行结果如下图所示:

int main()
{
	int result;
	int i;
	int count =0;
	char Text[128] = {0};
	char cryptograph[128] = {0};

	FILE *fp1,*fp2;
    char buf1[128],buf2[128];
	
	if((fp1 = fopen("/home/crowbar/Desktop/L.txt","aw+b")) == NULL)
	{
		perror("fopen");
		exit(-1);
	}
	if((fp2 = fopen("/home/crowbar/Desktop/M.txt","aw+b"))== NULL)
	{
		perror("fopen");
		exit(-1);
	}

	printf("输入1加密新的明文\n输入2对刚加密的密文进行解密\n输入3退出系统:\n");
	printf("\n请输入命令符:\n");

	while((scanf("%d",&result))==1)
	{	
		if(result == 1)
		{
			printf("请输入要加密的密文\n");
			getchar();//清空缓冲区
			scanf("%[^\n]",Text);
			count  = strlen(Text);
			
			for(i=0;i<count;i++)
			{
				cryptograph[i] = Text[i]+i+5;
			}
			cryptograph[i] = '\0';
			fwrite(buf1,sizeof(char),count,fp1);

			printf("加密后的密文是:%s\n",cryptograph);
			sleep(0.5);//挂起0.5秒
			printf("\n请输入命令符:\n");
			//result = 3;
		}
		else if(result == 2)
		{
			getchar();
			count = strlen(Text);
			for(i=0;i<count;i++)
			{
				cryptograph[i] = Text[i]-i-5;
			}
			Text[i] = '\0';
			fwrite(buf2,sizeof(char),count,fp2);
			
			printf("解密后的明文是:%s\n",Text);

			sleep(0.5);//挂起0.5秒
			printf("\n请输入命令符:\n");
			//result = 3;
		}
		else if(result == 3)
		{
			break;
		}
		else
		{
			printf("请输入正确的命令符!\n");
		}
	}

	fclose(fp1);
	fclose(fp2);

	return 0;
}

code1code2code3

四、 总结

显然上示代码是是以二进制写打开并追加的,所以vi中看到的是一串二进制字符串,但是我们使用cat命令的时候shell解释器会自动的将其显示化,编程人眼可以识别的文字。

密码是通信双方按约定的法则进行信息特殊变换的一种重要保密手段。依照这些法则,变明文为密文,称为加密变换;变密文为明文,称为脱密变换。密码在早期仅对文字或数码进行加、脱密变换,随着通信技术的发展,对语音、图像、数据等都可实施加、脱密变换。

加密:加密是一种以密码方式发送信息的方法。只有拥有正确密钥的人才能解开这个信息的密码。对于其他人来说,这个信息看起来就像是一系列随机的字母、数字和符号。如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的。
数字签名:数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。 密钥交换:双方使用密钥交换算法确定对称密钥,然后用这个密钥进行加密和解密。这个密钥交换协议/算法只能用于密钥的交换, 而不能进行消息的加密和解密。

2、加密算法
2.1 加密算法的特点
对称加密:加密和解密使用同一个密码
公钥加密: [也可称为非对称加密]
1)每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key)
2)公钥加密算法很少用来加密数据,速度太慢 比对称加密算法加密数据的速度慢上3个数量级,1000倍左右
单向加密即散列加密:提取数据特征码,常用于数据完整性校验
1)雪崩效应,输入的微小改变,将会引起结果的巨大改变。不可逆,无法根据特征码还原原来的数据
2) 定长输出,无论原始数据是多大,结果大小都是相同的。输入一样,输出必然相同
MAC:消息摘要码,单向加密的延伸应用

• 应用:用于实现在网络通信中保证所传输的数据完整性
• 机制:
• CBC-MAC
• HMAC:使用md5和sha1算法

2.2 加密解密技术常用的功能及算法

对称加密:
• 算法:DES, 3DES, AES, Blowfish, Twofish, RC6, CAST5
• 工具:gpg, openssl enc
• 加密算法 + 口令
• 密钥交换
• 用户身份认证
• 数据完整性

非对称加密:
• 算法:RSA, EIGamal, DSA
• 工具:openssl rsautl
• 密钥交换
• 身份认证
• 数据加密

单向加密:

算法:MD5, SHA1, SHA512, CRC-32
•	工具:sha1sum, md5sum, cksum, openssl dgst
•	完整性
密钥交换(IKE: Internet Key Exchange):
•	算法: DH,公钥加密 [并没有在互联网传输,比较安全]
•	Diffie-Hellman

密钥交换的两种机制:

•	1、公钥加密实现:发送方用接收方的公钥加密自己的密钥,接收方用自己的私钥解密得到发送方的密钥,逆过来亦然,从而实现密钥交换。
•	2、使用DH算法:前提发送方和接受方协商使用同一个大素数P和生成数g,各自产生的随机数X和Y。发送方将g的X次方mod P产生的数值发送给接收方,接受方将g的Y次方mod P产生的数值发送给发送方,发送方再对接收的结果做X次方运算,接受方对接收的结果做Y次方运算,最终密码形成,密钥交换完成。
•	DH算法的数学原理

2.3公钥加密的功用

公钥加密、私钥解密;反之亦然,私钥加密、公钥解密
•	公钥:pkey
•	私钥:skey
•	算法:RSA, EIGamal
•	工具:gpg, openssl rsautl
数字签名:电子签名私钥用来加密,公钥用来解密
•	算法: RSA, EIGamal, DSA [DSA只能用来签名,无法用来加密]

数字证书
证书格式:x509、pkcs【x509、pkcs12】
x509格式:

      公钥和有效期限;
*               证书的合法拥有者;(主机名)
*               证书的使用方式;
*               CA的信息;
*               CA的数字签名;(CA签名的校验码)
*       谁给CA发证:自签署证书

X.509:定义了证书的结构以及认证协议标准

	版本号
    序列号
    签名算法ID
    发行者名称
    有效期限
    主体名称
    主体公钥
    发行者惟一标识
    主体的惟一标识
    扩展
    发行者签名

—>参考博客<—

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值