前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >古典密码-凯撒密码原理以及代码

古典密码-凯撒密码原理以及代码

作者头像
IBinary
发布2020-05-04 21:43:52
3K0
发布2020-05-04 21:43:52
举报
文章被收录于专栏:逆向技术逆向技术

目录

  • 古典密码--->凯撒密码
    • 一丶凯撒密码
      • 1.1 什么是凯撒密码
      • 1.2 凯撒密码的加密原理
      • 1.3 凯撒密码的破解
    • 二丶凯撒密码代码编写
      • 2.1 C/C++代码,编写加解密函数

古典密码--->凯撒密码

一丶凯撒密码

1.1 什么是凯撒密码

凯撒密码,想必很多人听说过.没听说过的简单说一下.

相传在很久很久以前,有一位皇帝,叫做 尤利乌斯 · 凯撒 为了缩短名字,我们称为凯撒大帝.是在公元前100年左右单身与古罗马,是一名著名的军事统帅.由它发明的密码.叫做凯撒密码

1.2 凯撒密码的加密原理

凯撒密码其实很简单. 需要我们理解 平移概念 ,就是将 一段数据 平移多少位, 最后解密的时候进行反平移即可得出.

以字母 a-z来说 我们将a 进行平移3位得出密文

如下图:

a 平移三位,得出 D b则是E 以此类推. 如果到达末尾,则从头开始. 例如Z 是字母的末尾.平移三位则是 C

那么由此得出公式

密文 = 函数(明文 + 平移位数(key) Mod 26;

明文 = 函数(密文 - 平移位数(key) mod 26;

其中 密文 明文 函数 平移位数 等都是有英文含义的.

所以我们很多时候都能看到如下写法

代码语言:javascript
复制
c = E(p + k) mod 26

p = D(c - k) mod 26

C  = Ciphertext    英文意思 是密码密文的意思
p =  plainttext    英文意思 是明文的意思,也就是未加密之前的数据
E =  encrypt       英文的意思是加密的意思. 放在我们编程中则可以理解为是一个方法.专门用于加密的方法
D =  Decrypt       英文意思是 解密的意思  同加密一样
k  = key           英文意思是钥匙的意思. 也就是解密的钥匙或者加密的钥匙
mod  数学上  取余数的意思  10 % 2 == 0 取得余数为0

综上所述,大概是了解以下基本的术语

密文 = 加密函数(明文 + key) % 26

明文 = 解密函数(密文 - key) % 26

1.3 凯撒密码的破解

其实凯撒密码是非常好破解的. 假设你不知道明文.只知道密文.那么总是可以尝试出来的. 总共是26次.依次破解. 我们常听的暴力破解就是这个意思. 也称为穷举

那怎么知道凯撒密码破解出来是否正确. 是这样的. 明文一般都是有意义的.当你用密文破解的时候会出现很多无意义的数据.而有些数据是很有意义的.所以我可推断以下.假设不是.那么总过26组破解密码.一个一个尝试也能知道的.

二丶凯撒密码代码编写

2.1 C/C++代码,编写加解密函数

既然我们知道了公式

c = e(p + k) % 26

那么我们根据公式来即可

代码

代码语言:javascript
复制
void Entrypt(IN char* PlaintText, IN int PlaintTextSize, OUT char* CipText)
{
	//加密PlaintText

	for (auto i = 0; i < PlaintTextSize; i++)
	{
		/*
		1.首先字符 - 字符'a'得出下标.
		2.下标 + 则是代表假面
		3.如果是加密,怎么下标不能超过26. 所以 % 26
		4.计算完的结果 加上'a' 就等于实际加密的密文了
		*/
		char ch = (PlaintText[i] - 'a' + 3);  //得出下标
		char ch1 = ch  % 26 + 'a';          //得出实际密文

		//接受的密文数组
		CipText[i] = ch1;

	}
	return;
}

//解密数据,与加密相反
void Detrypt(IN char* CipText, IN int CipTextSize, OUT char* PlaintText)
{
	//加密PlaintText

	for (auto i = 0; i < CipTextSize; i++)
	{
		/*
		1.首先字符 - 字符'a'得出下标.
		2.下标 - 则是代表解密
		3.如果是- 则会出现复数情况, 如 a的下标为0  a - 3  = 负数. 那么需要加26进行调整. 调整之后是绝对不会超过26的
		4.虽然不会超过.但是也要 % 26.因为如果是正数的情况,如果你加26那么还是会超过26
		*/
		char ch = (CipText[i] - 'a' - 3);  //得出下标
		char ch1 = (ch + 26);         //负数调整,
		char ch3 = ch1 % 26 + 'a';   //正数 % 26得出下标,下标 + 'a'
		//接受的密文数组
		PlaintText[i] = ch3;

	}
	return;
}
int main()
{
	//c = entrypt(p + k) % 26
	//char szBuffer[] = "ibinary";
	char PlaintText[] = "ibinary";
	char CipText[8] = { 0 };
	char PlanitText1[8] = { 0 };

	Entrypt(PlaintText, strlen(PlaintText), CipText);
	printf("加密明文后的密文 = %s \r\n", CipText);


	Detrypt(CipText, strlen(CipText), PlanitText1);
	printf("解密密文后的明文 = %s \r\n", PlanitText1);

	system("pause");
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 古典密码--->凯撒密码
    • 一丶凯撒密码
      • 1.1 什么是凯撒密码
      • 1.2 凯撒密码的加密原理
      • 1.3 凯撒密码的破解
    • 二丶凯撒密码代码编写
      • 2.1 C/C++代码,编写加解密函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档