古典密码-凯撒密码原理以及代码
⽬录
古典密码--->凯撒密码
⼀⼂凯撒密码
1.1 什么是凯撒密码
凯撒密码,想必很多⼈听说过.没听说过的简单说⼀下.
相传在很久很久以前,有⼀位皇帝,叫做尤利乌斯 · 凯撒为了缩短名字,我们称为凯撒⼤帝.是在公元前100年左右单⾝与古罗马,是⼀名著名的军事统帅.由它发明的密码.叫做凯撒密码
1.2 凯撒密码的加密原理
凯撒密码其实很简单. 需要我们理解平移概念 ,就是将⼀段数据平移多少位, 最后解密的时候进⾏反平移即可得出.
以字母 a-z来说我们将a 进⾏平移3位得出密⽂
如下图:
将a 平移三位,得出 D b则是E 以此类推. 如果到达末尾,则从头开始. 例如Z 是字母的末尾.平移三位则是 C
那么由此得出公式
密⽂ = 函数(明⽂ + 平移位数(key) Mod 26;
明⽂ = 函数(密⽂ - 平移位数(key) mod 26;
其中密⽂明⽂函数平移位数等都是有英⽂含义的.
所以我们很多时候都能看到如下写法
c = E(p + k) mo
d 26
text函数什么意思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
那么我们根据公式来即可
代码
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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论