常见密码的学习(1)

莫尔斯电码

摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号

摩尔斯电码是一种早期的数字化通信形式,但是它不同于现代只使用零和一两种状态的二进制代码,它的代码包括五种: 点、划、点和划之间的停顿、每个字符间短的停顿(在点和划之间)、每个词之间中等的停顿以及句子之间长的停顿。

摩尔斯电码morse code 它由两种基本信号和不同的间隔时间组成:短促的点信号“·”,读“滴”(Di);保持一定时间的长信号“—”,读“嗒”(Da)。间隔时间:滴,1t;嗒,3t;滴嗒间,1t;字符间,3t;字间,7t

在这里插入图片描述

rot13

ROT13(回转13位,rotate by 13 places,有时中间加了个连字符称作ROT-13)是一种简易的替换式密码。它是一种在英文网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13被描述成“杂志字谜上下颠倒解答的Usenet点对点体”。ROT13 也是过去在古罗马开发的凯撒加密的一种变体。

应用ROT13到一段文字上仅仅只需要检查字母顺序并取代它在13位之后的对应字母,有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后串行反转:N换成A、O换成B、最后Z换成M(如图所示)。只有这些出现在英文字母里的字符受影响;数字、符号、空白字符以及所有其他字符都不变。替换后的字母大小写保持不变。
在这里插入图片描述
python实现rot13加密解密源码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/29 18:08
# @File    : rot13.py
import string
result=[]
upperCase=string.ascii_uppercase
lowerCase=string.ascii_lowercase
upperDict={}
lowerDict={}
print("欢迎来到rot13加密解密界面")
inputStr=input("请输入你要加密或解密的字符串")
while True:
    print("请确认%s是否为你想要输入的字符串,如果正确请输入y,否则输入n"%(inputStr))
    flag=input("请输入你的确认结果")
    if (flag=='y') or (flag=='Y'):
	    break
    if (flag=='n') or (flag=='N'):
	    inputStr=input("请重新输入你要加密或解密的字符串")
    else:
	    print("确认方式不合理")
	    break
for i in range(0,len(upperCase)):
    if i<13:
        upperDict[upperCase[i]]=upperCase[i+13]
    else:
        upperDict[upperCase[i]]=upperCase[i-13]
for i in range(0,len(lowerCase)):
    if i<13:
        lowerDict[lowerCase[i]]=lowerCase[i+13]
    else:
        lowerDict[lowerCase[i]]=lowerCase[i-13]
for ch in inputStr:
    if ch in lowerDict:
        result.append(lowerDict[ch])
    elif ch in upperDict:
        result.append(upperDict[ch])
    else:
        result.append(ch)
result=''.join(result)
print("最终加密结果为%s"%(result))
#include<cstdio>
#include<cmath>
#include<cstring>
int main() {
	int n;
	char m[100000];
	//加密
	scanf("%s",m);
	n=strlen(m);
	for(int i=0; i<n; ++i)
		m[i]=(m[i]-'a'+13)%26+'a';
	printf("%s\n",m);
	//解密
	scanf("%s",m);
	for(int i=0; i<n; ++i)
		m[i]=(m[i]-'a'+13)%26+'a';
	printf("%s\n",m);
	return 0;
}

原文链接:https://blog.csdn.net/qq_40491569/article/details/83476351

凯撒加密

Caesar cipher
什么是凯撒密码在这里插入图片描述
凯撒密码的加密过程
(用凯撒密码加密,密钥是3)
在这里插入图片描述
凯撒密码的解密过程
(用凯撒密码解密,密钥也是3)
在这里插入图片描述
暴力破解凯撒密码
(在凯撒密码中,密钥就是字母表平移的数字。由于字母表只有26个字母,因此加密用的密钥只有0到25共26种(平移0个字母实际相对于没有加密)。
按顺序将这26种密钥都尝试一遍。)
在这里插入图片描述
这种密码破译方法,就是将所有可能的密钥全部尝试一遍,这种方法称为暴露破解。由于这种方法的本质就是从所有密钥中找出正确的密钥,因此又称为穷举搜索。

栅栏密码

所谓栅栏密码,就是把明文分成N个组,然后取出每组的第一个,每组的第二个。。接着按顺序排列得出密文。若每个组里有2两个元素的话就叫2栏栅栏密码。
例一

就比如明文为The girl is beautiful,按照2栏栅栏密码的步骤就需要将这个字符串分成9个组(明文中的空格不计数),9个组分别如下:
Th eg ir li sb ea ut if ul
将每个组的第一个元素提出来,Teilseuiu
将每个组的第二个元素提出来,hgribatfl
最后按照顺序排列的密文:Teilseuiuhgribatfl
若要将密文还原为明文,只需将密文分成两半(已知是2栏栅栏密码)
第一个组为Teilseuiu
第二个组为hgribatfl
只需从第一个组读一个元素,第二个元素读一个元素,循环往复即可得到明文
读取如下:Th eg ir li sb ea ut if ul
所以明文为Thegirlisbeautiful

下面来介绍个记空格的例子。
例二

一只小羊跳过了栅栏,两只小样跳过了栅栏,一坨小羊跳过了栅栏…
tn c0afsiwal kes,hwit1r g,npt ttessfu}ua u hmqik e {m, n huiouosarwCniibecesnren.
思路:由于题中提到了栅栏,于是猜这段字符串使用了栅栏密码,去掉空格后一数发现字符串长度为71,因为71是一个素数,所以无法对其进行各很好的分组,所以猜测空格可能是计数的,再看字符串中有些字母中间空格不止一个,就更加肯定空格是计数的了,于是加上空格,字符串长度为85,而85的因子有517,于是乎我们就可以按5个一组或17个一组去试,分别如下:

5个一组:
tn c0
afsiw
al ke
s,hwi
t1r
g,npt
tte
ssfu}
ua u
hmqi
k e {
m, n
huio
uosar
wCnii
beces
nren.

对于这种分法很明显可以看出是不对的,因为这样组成的明文根本读不通

于是需要试一下17个一组的
tn c0afsiwal kes,
hwit1r g,npt tt
essfu}ua u hmqik
e {m, n huiouos
arwCniibecesnren.

由这个分组可得明文为the anwser is wctf{C01umnar},if u is a big new,u can help us think more question,tks.
用来数字符串的长度和找素数

#include<stdio.h>
#include<string.h>
int main(){
	char str[]="tn c0afsiwal kes,hwit1r  g,npt  ttessfu}ua u  hmqik e {m,  n huiouosarwCniibecesnren.";
	printf("%d\n",strlen(str));
	int N=strlen(str);
	for(int i=2;i<N;i++){
		if(N%i==0)
		printf("%d\n",i);
	}
	return 0;
}

培根密码

Baconian Cipher
培根密码,培根所用的密码是一种本质上用二进制数设计的,没有用通常的0和1来表示,而是采用a和b
培根密码加密有两种方式:
A aaaaa B aaaab C aaaba D aaabb E aabaa F aabab G aabba H aabbb I abaaa J abaab K ababa L ababb M abbaa N abbab O abbba P abbbb Q baaaa R baaab S baaba T baabb U babaa V babab W babba X babbb Y bbaaa Z bbaab
方式二:
a AAAAA g AABBA n ABBAA t BAABA
b AAAAB h AABBB o ABBAB u-v BAABB
c AAABA i-j ABAAA p ABBBA w BABAA
d AAABB k ABAAB q ABBBB x BABAB
e AABAA l ABABA r BAAAA y BABBA
f AABAB m ABABB s BAAAB z BABBB
通常加密者只需要两种不同的字体或使用大小写来代替ab即可,例如明文为bling,加密为:aaaab ababb abaaa abbab aabba,此时再随意找句句子,使用大小写来代替ab。密文如下:good GoOd STuDy day DAy Up hAHa

解密代码

#! python3
# -*- coding: utf-8 -*-
# @Time    : 2017/8/26 上午12:07
# @Author  : BlingBling
# @File    : Baconian.py
# @Software: PyCharm Community Edition
import re
class Baconian():
    alphabet = ['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']

    first_cipher = ["aaaaa", "aaaab", "aaaba", "aaabb", "aabaa", "aabab", "aabba", "aabbb", "abaaa", "abaab", "ababa",
                    "ababb", "abbaa", "abbab", "abbba", "abbbb", "baaaa", "baaab", "baaba", "baabb", "babaa", "babab",
                    "babba", "babbb", "bbaaa", "bbaab"]

    second_cipher = ["aaaaa", "aaaab", "aaaba", "aaabb", "aabaa", "aabab", "aabba", "aabbb", "abaaa", "abaaa", "abaab",
                     "ababa", "ababb", "abbaa", "abbab", "abbba", "abbbb", "baaaa", "baaab", "baaba", "baabb", "baabb",
                     "babaa", "babab", "babba", "babbb"]

    def __init__(self, str):
        self.str = str

    def decode(self):
        str = self.str.lower()
        str_array = re.findall(".{5}", str)
        decode_str1 = ""
        decode_str2 = ""
        for key in str_array:
            for i in range(0,26):
                if key == Baconian.first_cipher[i]:
                    decode_str1 += Baconian.alphabet[i]
                if key == Baconian.second_cipher[i]:
                    decode_str2 += Baconian.alphabet[i]

        print(decode_str1)
        print(decode_str2)



if __name__ == '__main__':
    str = input("please input string to decode:\n")
    bacon = Baconian(str)
    bacon.decode()

关键字密码

Keyword Cipher
关键词加密(keyword cipher)也是一种单表替代加密,与凯撒加密不同之处在于密钥可以更为复杂,加密时需要选择一个关键词,如果这个关键词有重复的字母,去除除第一次出现之外的所有的相同的字母。例如,如果选定的关键词为“success”,则使用“suce”。
将该关键词写在字母表的下方,并用字母表的其他字母按标准的顺序填写余下的空间。这样就构建了字母一一对应的关系,加密时用下面一行中的字母对应替换上面一行的字母;解密时用上面一行中的字母对应替换下面一行的字母。
在这里插入图片描述

维吉尼亚密码

Vigenere Cipher
维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码。为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。

加密
TO BE OR NOT TO BE THAT IS THE QUESTION
当选定RELATIONS(重复关键词,直到长度和明文相同时)作为密钥,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下:
密钥:RE LA TI ONS RE LA TION SR ELA TIONSREL
明文:TO BE OR NOT TO BE THAT IS THE QUESTION
密文:KS ME HZ BBL KS ME MPOG AJ XSE JCSFLZSY
在这里插入图片描述
在维吉尼亚(Vigenère)的密码中,发件人和收件人必须使用同一个关键词(或者同一文字章节),这个关键词或文字章节中的字母告诉他们怎么样才能前后改变字母的位置来获得该段信息中的每个字母的正确对应位置。比如如果关键字“BIG”被使用了,发件人将把信息按三个字母的顺序排列。第一个三字母单词的第一个字母将应当向前移动一个位置(因为B是排在A后面的字母),第二个字母需要向前移动8位(I是A后面第8个字母),而第三个字母需要向前移动6位(G是A后面第6个字母)。然后,文字就可以按下面的顺序来进行加密了:
未加密文字:THE BUTCHER THE BAKER AND THE CANDLESTICK MAKER。(屠夫、面包师和蜡烛匠)。
关键密钥: BIG BIGBIGB IGB IGBIG BIG BIG BIGBIGBIGBI GBIGB
加密文字:UPK CCZDPKS BNF JGLMX BVJ UPK DITETKTBODS SBSKS

解密
明文:ATTACKATDAWN
选择关键词:LEMON,重复关键词,直到长度和明文相同,作为密钥:LEMONLEMONLE
通过等长的明文和密钥,依次查表得到密文:LXFOPVEFRNHR
解密的过程则与加密相反。例如:根据密钥第一个字母 L 所对应的 L 行字母表,发现密文第一个字母 L 位于 A 列,因而明文第一个字母为 A 。密钥第二个字母 E 对应 E 行字母表,而密文第二个字母 X 位于此行 T 列,因而明文第二个字母为 T。以此类推便可得到明文。

维吉尼亚加密可以避免直接的词频分析攻击,密文在统计上没有明显的规律,但是仍然有方法可以对其进行破解。
首先提出破解方法的 Frederick Kasiski 是基于这样一个简单的观察“密钥的重复部分与明文中的重复部分的连接,在密文中也产生一个重复部分”。
如果一个字符串在明文中重复,并且被密钥相同的部分加密,那么在密文中也会出现重复的字符串。
例子:
在这里插入图片描述
关键词 “RUN” 的长度为 3,密文串“KIOV”的间距是 9,密文串 “NU”的间距是 6,这些间距都是关键词长度的倍数,这样重复足够多次,可以帮助我们判断关键词的长度。
一旦确定了关键词的长度,余下的问题就只是如何使用该信息去找到真正的关键词了。关键词的长度揭示了密文可以被如何破解成单码加密的一个集合。
关键词的长度为n,那么破解维吉尼亚加密的问题就变成了解决n个单表加密的问题,需要有足够长的密文,然后通过词频分析逐个解决问题。

转轮机加密

直接上例子
在这里插入图片描述
根据密钥提示,将第二行换到第一行,以此类推,第六行换到第十三行。
在这里插入图片描述
然后按照密文,将每一行进行循环移位,使得其首位字母与对应的密文相同
在这里插入图片描述
为了方便,可以把每一列的内容单独拿出来。
在这里插入图片描述

希尔密码

Hill
希尔密码(Hill)的基本思想是利用Z26上的线性变换被n个连续的明文字母替换为n个连续的密文字母。这个替换是由秘钥决定的,而这个秘钥是一个变换矩阵,解密时只需要对密文做一次逆变换即可。

以下是一个Hill密码解密过程:
来自安恒杯的一道题:爬坡道
  一张图片打开是一串字符
  mtt pjp ex fdzc egtdzeanut
  然后图片里面藏着一个矩阵
  3 1
  2 1

(1)先算出这个矩阵的逆矩阵
    逆矩阵求法如下:
在这里插入图片描述
求出此题逆矩阵
在这里插入图片描述
(2)根据字母表顺序将密文换成矩阵数值
在这里插入图片描述
 密文:m t t p j b p e x f d z c e g t d z e a n u t z
明文:13 20 20 16 10 2 16 5 24 6 4 26 3 5 7 20 4 26 5 1 14 21 20 26

(3)将密钥的逆矩阵与密文变换成的矩阵做乘运算
    矩阵乘法计算如下:
  在这里插入图片描述
(4)将得到的矩阵mod26
在这里插入图片描述
在这里插入图片描述
得flag:yunbfdfyltdvslsadvcxxwtf

普莱菲尔密码

Playfair Cipher
1、编制密码表

我们需要一个5×5的方表,而用到的是密钥“culture”与英文字母表:
(1)整理密钥字母culture,去掉后面重复的字母,得到字母串:cultre;
(2)用上一步得到的字母自上而下填补5×5方表的纵列(也可横排),之后空白按照相同的顺序用字母表中剩余的字母依次填补完成,得到如下的方格(也叫棋盘密码):
在这里插入图片描述
这一步需要注意的是:整理密钥字母时,如果出现z,则需要去除,因为在英文里z的使用频率最低。

2、整理明文
我们需要遵循的原则是“两个一组”,得到若干个两两成对的字母段,用到的是明文pishoupideweinasi和字母“x”:
(1)将明文两两一组按顺序排开,得到pi,sh,ou,pi,de,we,in,as,i
(2)对于末尾的单个字母要加上一个“x”使之成对:pi,sh,ou,pi,de,we,in,as,ix
这一步需要注意的是:对于相连字母相同者,每个后面都要加x,如tomorrow,需要写成:to,mo,rx,rx,ow

3、编写密文
我们要得到的密文,对于每个字母对,要严格遵循如下的原则:
(1)如果两个字母在同一行,则要用它右邻的字母替换,如果已在最右边,则用该行最左边的替换,如明文“ce”,按照上表,应替换为“eg”;
(2)如果两个字母在同一列,则要用它下边的字母替换,如果已在最下边,则用该行最上边的替换,如明文“oq”,按照上表,应替换为“pm”;
(3)如果两个字母在不同的行和列,则应在密码表中找到两个字母使四个字母组成一个矩形,明文占据两个顶点,需用另外两个顶点的字母替换,如明文为“hx”,可以替换为“vj”或“jv”。
按照上述规则,将明文加以加密,得到密文:jo gv ln jo fa bs oh ve wj。
该密码的解法只需反其道而行之即可。
相关代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值