密码
凯撒密码
原理:通过偏移(向前or向后)输入的数字作为密钥
凯撒密码的密钥总数为26
例:偏移量为5,A→F,B→G,以此类推
P.S. 在加密中 非字母符号,数字和字母大小 是不变的

ROT13的偏移量是13,(13*2=26),而字母只有26个,意味着当偏移量为26时,结果还是它本身
Or使用rot13加密两次后又会变为原来的字符串
如何破解
1.知道偏移量(密钥)
如果偏移量未知,可以通过从1到26挨个偏移即可得到明文
下面贴上代码(python不会只能用C)
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char small_letter[26]={'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'};
char big_letter[26]={'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'};
char text[1000],result[1000];
int c,count=0,k,p;
char function;
printf("输入文本:");
c=getchar();
while(1)
{
if(c == '\n') break;
text[count]=c;
printf("%c",text[count]);
count++;
c=getchar();
}
printf("\n");
printf("加密输入E,解密输入D:");
scanf("%c",&function);
if (function == 'E'){
printf("输入秘钥:" );
scanf("%d",&k);
for(int i=0;i<count;i++){
if(text[i]>='A'&&text[i]<='Z')
result[i]=big_letter[((text[i]-'A')+k)%26];
else if (text[i]>='a'&&text[i]<='z')
result[i]=small_letter[((text[i]-'a')+k)%26];
else result[i]=text[i];
printf("%c",result[i]);
}
}
if (function == 'D'){
printf("输入秘钥:" );
scanf("%d",&k);
for(int i=0;i<count;i++){
if(text[i]>='A'&&text[i]<='Z')
{
p=((text[i]-'A')-k);
while(p<0)p+=26;
result[i]=big_letter[p];
}
else if (text[i]>='a'&&text[i]<='z')
{
p=((text[i]-'a')-k);
while(p<0)p+=26;
result[i]=small_letter[p];
}
else result[i]=text[i];
printf("%c",result[i]);
}
printf("\n");
}
return 0;
}
移位密码
和凯撒密码的区别就是移位密码更高级些(不仅会移字母),可以处理数字和字符or暴力破解直接把26个可能全部遍历一遍,解密出来的明文肯定有一个是对的,像这种师傅们管这个叫穷举搜索
#include <stdio.h>
#include <stdlib.h>
int main()
{
int key,k;
char plain[100] = {0},cipher[100] = {0};
int i = 0,j;
char a;
printf("Input the ciphertext:");
scanf("%c",&a);
while(a != '\n')
{
cipher[i] = a;
i++;
scanf("%c",&a);
}
j = i;
k = 0;
while(k < 26)
{
key = 26 - k;
i = j - 1;
while(i >= 0)
{
if((cipher[i] + key > 90 && cipher[i] < 97) || cipher[i] + key > 122)
plain[i] = cipher[i] + (key - 26);
else
plain[i] = cipher[i] + key;
i--;
}
printf("Key = %2d,The plaintext is:",k);
while(plain[i+1] != 0)
{
i++;
printf("%c",plain[i]);
}
printf("\n");
k++;
}
system("pause");
return 0;
}
ASCII凯撒
使用ASCII表来对明文进行位移
简单替换密码
依此将明文替换成另一个字母,密钥为替换表
这种加密方式其密码字母表不像凯撒密码一样单是移位,而是随机的对应,并且密钥的个数是26!,破解难度>凯撒,所以一般用词频分析
词频分析法
统计密文中每个字母出现的频率
对比自然英语中字母与单词出现的频率
以文章中频率最高的替换密文中频率最高的字母
寻找反复出现的字符串,对比文章中频率较高的单词,得到其他对应
重复3,4步,直到不能再确定出对应关系,转而对比频率较低的字母,或根据已知字母猜其组成的单词,直到获得完整的替换表
经过简单替换密码加密后不会改变字母的频率,只会使它们的对应关系变得杂乱无章
自然英语的字母频率:

例
明文:hello world
密钥:zyxwvutsrqponmlkjihgfedcba
加密: svool dliow
例:BUUCTF 凯撒?替换?呵呵!
MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
Atbash Cipher
埃特巴什码(Atbash Cipher)
A→Z,B箭头Y,以此类推
| 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| z | y | x | w | v | u | t | s | r | q | p | o | n | m | l | k | j | i | h | g | f | e | d | c | b | a |
base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法
Base64要求把每三个8Bit的字节转换为四个6Bit的字节(38 = 46 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
base64索引表
字母or数字→转为16进制or转为对应的ASCII码→对应的二进制(38=46)→6字节的二进制转为数字→对应的base64索引表的字符
ASCII码表
ASCII码一览表,ASCII码对照表 (biancheng.net)
栅栏密码
把要加密的明文分成N个一组,然后把每组的第1个字连起来
例:123456789 每组字数:3
123
456
789
加密:147258369
W型栅栏密码
HELLO WORLD TODAY IS A GOOD DAY key=5 #栅栏的栏数
H L S Y 1
E R D I A A 2
L O T Y G D 3
L W O A O D 4
O D O 5
HLSYERDIAALOTYGDLWOAODODO
栅栏暴力破解
from railfence import *
newobj = Railfence()
string = 'Wnb.r.ietoeh Fo"lKutrts"znl cc hi ee ekOtggsnkidy hini cna neea civo lh'
for i in range(2,10):
print(i,newobj.Vdecipher(string,i))
培根密码
第一种密码表
第二种密码表
#I与J、U与V皆有不同编号
ex.
明文是WHATEVER
写出与表对应的AB字母
BABAA AABBB AAAAA BAABA AABAA BAABB AABAA BAAAA
这时任意选取一段英文句子,(whatever有8个字母,选取的句子长度应为5*8=40)
This is the best day ever i knew this is gonna work
A是大写,B是小写对应到句子上
tHiS IS The bEST DAy EVeR I KnEW tHIs iS GoNNa WORK
or也可以用加粗代表大写
this is the best day ever i knew this is gonna work
ccehgyaefnpeoobe{lcirg}epriec_ora_g
猪圈密码
(亦称朱高密码、共济会暗号、共济会密码或共济会员密码)
一种以格子为基础的简单替代式密码


Vigenere 维吉尼亚密码
维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码中的一种
ex.
HELLOEGGY
选取密钥:JOEY(密钥长度要和明文长度一样)
KEY=JOEYJOEYJ
查表可知(明文竖着读,密钥横着读)
明文:HELLOEGGY
密钥:JOEYJOEYJ
密文:QSPJXSKEH
Vigenere Solver - www.guballa.de
Polybius棋盘密码
| 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|
| 1 | A | B | C | D | E |
| 2 | F | G | H | I/J | K |
| 3 | L | M | N | O | P |
| 4 | Q | R | S | T | U |
| 5 | V | W | X | Y | Z |
例
JOEY
加密:24 34 15 54
另一种密码表
| A | D | F | G | X | |
|---|---|---|---|---|---|
| A | b | t | a | l | p |
| D | d | h | o | z | k |
| F | q | f | v | s | n |
| G | g | j | c | u | x |
| X | m | r | e | w | y |
playfair加密
playfair是一个5*5的字母矩阵,按顺序填入明文字母,然后填入剩余字母(出去重复字母)
i和j视为同一字母
ex.明文epiphany
e p i/j h a
n y b c d
f g k l m
o q r s t
u v w x z
加密则把明文按两个字母一组ep ip ha ny
if两个相同字母在一组,则在中间加一个字母(这里设z)分隔然后重新分组(ex.tell te lz lz)
if最后一组是单数,补z
if同一组在矩阵中同行,则取同一行中下一个字母作为密钥
#同列同理
if不同行不同列,则取行列交叉点的字母作为密钥
md5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现
其他密码
Rabbit加密
Rabbit加密-Rabbit解密-在线Rabbit加密解密工具 (jsons.cn)
U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI
社会主义密码

浙公网安备 33010602011771号