栅栏易位法。即把将要传递的信息中的字母交替排成上下两行,再将下面一行字母排在上面一行的后边,从而形成一段密码。撒移位密码。也就是一种最简单的错位法,将字母表前移或者后错几位。进制转换密码。比如给你一堆数字,乍一看头晕晕的,你可以观察数字的规律,将其转换为10进制数字,然后按照每个数字在字母表中的排列顺序,拼出正确字母。摩尔斯密码。翻译不同,有时也叫摩尔密码。*表示滴,-表示哒,如下表所示比如滴滴哒就表示字母U,滴滴滴滴滴就表示数字5。另外请大家不要被滴哒的形式所困,我们实际出密码的时候,有可能转换为很多种形式,例如用0和1表示,迷惑你向二进制方向考虑,等等。摩尔斯是我们生活中非常常见的一种密码形式,例如电报就用的是这个哦。下次再看战争片,里面有发电报的,不妨自己试着破译一下电报。维热纳尔方阵。上面所说的频率分析,很容易破解较长篇幅的密文,于是维热纳尔继承前人的经验,创造出了这个维热纳尔方阵,从而克服了词频分析轻易能够破解密码的弊端,成为一种较为强大的密码编译形式。字母频率密码。关于词频问题的密码,词频法其实就是计算各个字母在文章中的出现频率,然后大概猜测出明码表,最后验证自己的推算是否正确。这种方法由于要统计字母出现频率,需要花费时间较长,本人在此不举例和出题了,有兴趣的话,参考《跳舞的小人》和《金甲虫》。
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
加密原理:把将要传递的信息中的字母交替排成上下两行,再将下面一行字母排在上面一行的后边,从而形成一段密码。
栅栏密码加密
比如明文:THERE IS A CIPHER
去掉空格后变为:THEREISACIPHER
两个一组,得到:TH ER EI SA CI PH ER
先取出第一个字母:TEESCPE
再取出第二个字母:HRIAIHR
连在一起就是:TEESCPEHRIAIHR
这样就得到需要的密码了。
解密
而解密的时候,先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
THEREISACIPHER
分出空格,就可以得到原文了:
THERE IS A CIPHER
以上内容参考:百度百科-栅栏密码、百度百科-电码
修改后运行结果:
a. 加密
1.进行栅栏加密
2.进行栅栏解密
请选择: 1
请输入分组数目 2
请输入列排编号 21
请输明文 abcdefgh
b a
d c
f e
h g
b. 解密
1.进行栅栏加密
2.进行栅栏解密
请选择: 2
请输入分组数目 2
请输入列排编号 21
请输密文 b a d c f e h g
abcdefgh
修改后的代码:
def Encrypt(n,col,M):
row=len(M)/n
if len(M)%n0:
row+=1
arr=[[""for x in range(0,n)] for y in range(0,row)]
x=0
for i in range(0,row):
for j in range(0,n):
if xlen(M):
arr[i][j]=M[x]
#print M[x],
x+=1
#print "\r\n"
for i in range(0,row):
for j in range(0,n):
m=int(col[j])-1
print arr[i][m],
print "\r\n"
def Decrypt(n, col, C):
C="".join(C.split())
row=len(C)/n
if len(C)%n0:
row+=1
arr=[[""for x in range(0,n)] for y in range(0,row)]
x=0
for i in range(0,row):
for j in range(0,n):
if xlen(C):
arr[i][j]=C[x]
#print C[x],
x+=1
#print "\r\n"
M=""
for i in range(0,row):
for j in range(0,n):
m=int(col[j])-1
#print arr[i][m],
M+=arr[i][m]
#print "\r\n"
print M
print u"1.进行栅栏加密\r\n2.进行栅栏解密\r\n请选择:".encode("gb2312"),
sel=raw_input()
if int(sel)==1:
print u"请输入分组数目".encode("gb2312"),
n=int(raw_input())
print u"请输入列排编号".encode("gb2312"),
col=raw_input()
print u"请输明文".encode("gb2312"),
M=raw_input()
while len(M)n*3:
print u"明文必须是分组数目的3倍".encode("gb2312")
M=raw_input()
Encrypt(n,col,M)
else :
print u"请输入分组数目".encode("gb2312"),
n=int(raw_input())
print u"请输入列排编号".encode("gb2312"),
col=raw_input()
print u"请输密文".encode("gb2312"),
C=raw_input()
while len(C)n*3:
print u"密文必须是分组数目的3倍".encode("gb2312")
C=raw_input()
Decrypt(n,col,C)
打眼一看 爱老虎油 换成数字 顺序直观些。ILOVEYOU 12345678。
所以IVOLEUOY 14325876
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般不超过30个,也就是一、两句话)
扩展
(1)在选择行数时可以使多行,这样对于加密强度有所提高。
(2)可以在加密之后在使用其他密码进行加密,增加强度
Q:BIG GUINS如何分3栏如何解,求推理过程,答案
A:
1.分析:BIG GUINS共有8个字母,分3行的话,就是1、2行有3个字母,第三行有2个字母.第三行最后一位可空或用其它字母或符号补上(即有两种写法)
2.解密
去掉空格---BIGGUINS
把8个字母按3-3-2的形式分成BIG GUI NS这三组字母
(1).最后一位空:把每组字母的第一位相连,得到BGN;第二位相连得到IUS,第三位相连得到GI,即可得密码为BGN IUS GI.
最后去掉空格得到最终密码BGNIUSGI.
(2)最后一位补上其它字母或符号:把每组字母的第一位相连,得到BGN;第二位相连得到IUS,第三位相连得到GI,也可补一个@使之变为GI@.最后得到最终密码为BGNIUSGI@.