古典密码-凯撒密码原理以及代码
古典密码--->凯撒密码
一丶凯撒密码
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) 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
那么我们根据公式来即可
代码
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;
}
坚持两字,简单,轻便,但是真正的执行起来确实需要很长很长时间.当你把坚持两字当做你要走的路,那么你总会成功. 想学习,有问题请加群.群号:725864912(收费)群名称: 逆向学习小分队 群里有大量学习资源. 以及定期直播答疑.有一个良好的学习氛围. 涉及到外挂反外挂病毒 司法取证加解密 驱动过保护 VT 等技术,期待你的进入。
详情请点击链接查看置顶博客 https://www.cnblogs.com/iBinary/p/7572603.html
本文来自博客园,作者:iBinary,未经允许禁止转载 转载前可联系本人.对于爬虫人员来说如果发现保留起诉权力.https://www.cnblogs.com/iBinary/p/12773888.html
欢迎大家关注我的微信公众号.不定期的更新文章.更新技术. 关注公众号后请大家养成 不白嫖的习惯.欢迎大家赞赏. 也希望在看完公众号文章之后 不忘 点击 收藏 转发 以及点击在看功能. QQ群: