密码

凯撒密码

原理:通过偏移(向前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步,直到不能再确定出对应关系,转而对比频率较低的字母,或根据已知字母猜其组成的单词,直到获得完整的替换表

经过简单替换密码加密后不会改变字母的频率,只会使它们的对应关系变得杂乱无章

自然英语的字母频率:

img

明文: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索引表

img 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))

培根密码

第一种密码表
img
第二种密码表
#I与J、U与V皆有不同编号
img

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


猪圈密码

(亦称朱高密码、共济会暗号、共济会密码或共济会员密码)

一种以格子为基础的简单替代式密码

猪圈密码

在这里插入图片描述

猪圈密码-在线解密加密工具 (xiao84.com)


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

社会主义密码

posted @ 2022-07-16 14:42  HeadmasterEggy  阅读(795)  评论(0)    收藏  举报