[CTF]凯撒密码
[CTF]凯撒密码
---------------------
作者:___Blue_H
来源:CSDN
原文:https://blog.csdn.net/qq_37653144/article/details/80773548
概述
著名的凯撒密码是代换密码的一种,据说是罗马共和国末期的军事家、政治家,罗马帝国的奠基者凯撒率先使用加密函,因此这种加密方法被称为凯撒密码。凯撒密码的原理很简单:通过把字母移动一定的位数来实现加解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量为3时,所有的字母(不区分大小写)A被替换成D,B被替换成E,Z被替换成C。其公式定义如下:
加密
解密
综上,凯撒密码的明文空间和密文空间都是26(字母表大小),偏移量就是密钥。当密钥k为3时,凯撒密码的明码表和密码表分别如下:
明码表
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
密码表
D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C |
实现
根据上述,密钥k为3时,明文China被加密成密文FKLQD
void Caesar_E (std::string &s, int k) { //加密
for (char &ch : s)
ch = 'A'+(toupper(ch)-'A'+k)%26;
}
void Caesar_D (std::string &s, int k) { //解密
for (char &ch : s)
ch = 'A'+(toupper(ch)-'A'+26-k%26)%26;
}
特点
·属于单字母简单替换密码
·明文语言集已知(用于英文字母)且易于识别
·结构过于简单,密码分析者只使用很少的信息就可预言加密的整个结构
正因为凯撒密码的上述特点,使得它非常容易破解,甚至无法抵抗唯密文攻击(如统计攻击)。但它作为加密算法的一个基础原理,可以衍生出多种变体,比如可以将字母表的顺序重排,允许密码表是明码表的任意一种重排,密钥就会增加到四千亿亿亿种。而且,它通常被作为其他更复杂加密算法中的一个步骤,如维吉尼亚密码。