if(lowerCiphertext.charAt(i)>'z'||lowerCiphertext.charAt(i)<'a'){
System.out.print(lowerCiphertext.charAt(i));
}else{
inttemp=getInt(lowerCiphertext.charAt(i));
temp=(temp+s)%26;
System.out.print(getString(temp));
}
}
System.out.println();
}
publicstaticvoidmain(String[]args){
for(inti=0;i<26;i++){
shift(Ciphertext,i);
}
}
}
可参考的代码B
/**
*程序名称:
凯撒密码加密解密程序
*程序功能:
输出凯撒密码所有偏移结果,可应用于解密和加密
*程序思路:
遍历char组元素判断ASCII编码是否在英文字母范围内,然后偏移。
*@authorYeungKc
*@version1.0
*/
classCaesarCipher{
publicstaticvoidcaesarCipherShift(Stringciphertext){
System.out.println("密文:
\t"+ciphertext+"\n\t\t开\t始\t输\t出\t明\t文");
char[]ciphertextArray=ciphertext.toCharArray();//Stringtochar
//array
for(inti=1;i<26;i++){//循环次数
System.out.print("第"+i+"次:
\t");
for(charplainText:
ciphertextArray){//开始遍历
plainText=determine(plainText,'A','Z',i);//A~Z判断区
plainText=determine(plainText,'a','z',i);//a~z判断区
System.out.print(plainText);//输出明文结果结束遍历
}
System.out.println();//循环换行
}
}
//判定函数
privatestaticchardetermine(charplainText,chara,charz,inti){
if(a<=plainText&&plainText<=z)//判定是否符合英文范围
plainText=(char)(plainText+i>z?
plainText+i-26
:
plainText+i);//判定偏移后是否会超界并修正
returnplainText;
}
publicstaticvoidmain(String[]args){
Stringciphertext="Uibolzpv.";//密文
caesarCipherShift(ciphertext);//执行凯撒密码偏移
}
4.摩斯电码
Key:
5.四方密码
6.希尔密码
【相关知识、概述】
名称:
HillCipher[注1]
中译名:
希尔密码
发明者:
希尔[注2]
[注1]网上也有HillPassword的说法,但是应该是中式英语的误传。
[注2]莱斯特·S·希尔(LesterS.Hill,1891–1961),美国数学家、教育家。
1911年于哥伦比亚大学读完学士学位,1926年在耶鲁大学读完博士学位,于1926年发明希尔密码。
【加密方法】
由于这种密码涉及一点专业知识,所以我们尽量绕开复杂的部分(其实是我自己也没弄明白),直接讲如何加密。
就我理解的正常的加密方法是:
1、先数出来需要加密的文字有多少个字母,我们假设字母长度为n;
2、然后随机选择一串字母长度为n的平方的字母串;
3、将原文和密钥的字母替换为数字:
A=0,B=1,C=2……Z=25(这里值得注意的是替换的数字要从0开始);
4、将原文的矩阵与密钥形成的n*n矩阵相乘;
5、将得出的结果除以26,得出的余数就是我们要求的密文。
解密的话只要通过密钥逆运算回去就可以了(由于线性代数微难,具体算法请自行研究……)
听起来很复杂吧……
我们看到第4步的计算量相当大,如果原文有5个字母,用手算的话要算25个,如果原文有10个字母,就要算10×10=100次之多的四则运算了……
如果用编程来实现的话还算简单,可是对于我们手算的来说工作量太大了……
【变种加密】
为此我们需求一种易于操作的变种方法。
例如我们加密这样一句话:
Mr.Hillisclimbingahill.(希尔先生爬小山)
这一小短句有21个字母,用常规的方法的话,我们需要21×21,也就是441个字长的密钥……这显然是手算的噩梦……
这时我们可以利用希尔密码求余的思想建立一种简易的加密方法。
我们先选择任意的一个整数(不能与26有倍数关系,0、1、2、13等都不可以),例如此处我们选择数字5。
我们先做基本的整理,此时由于不做矩阵的运算了,我们就没有必要从0开始了。
原文:
mrhillisclimbingahill(我习惯把原文统一为小写,把密文统一为大写,这样比较容易区分)
密钥:
5
原文转数字:
1318891212919312913291471891212
数字乘以密钥求余:
131214190808191715081913101918090514190808
求得密文:
MLNSHHSQOHSMJSRIENSHH
利用这种方法加密的好处是利用密钥数字将原有的序列发散出去,利用求余收敛,但是究其根本还是替换密码。
解密的时候,已知密钥是5,密文为:
MLNSHHSQOHSMJSRIENSHH
先将密文转换为数字:
131214190808191715081913101918090514190808
然后把其中所有不能被5整除的数都加上26,看能否被5整除,不能的话继续加26,直到能被5整除为止:
659040456060459515604565104570350540456060
所有数除以5,得出来的就是原文的字母表数字。
至于破解这种密码的方法,可以简单的将之等同于单表替换密码来解,也可以穷举密钥来解,在此就不举例了。
【扩展阅读】
WJ百科关于希尔密码的讲解(密码吧的同志们,你们懂的)
iuuq:
//fo.xjljqfejb.psh/xjlj/Ijmm_djqifs
7.ROT13
简单的移位密码
套用ROT13到一段文字上仅仅只需要检查字元字母顺序并取代它在13位之后
的对应字母,有需要超过时则重新绕回26英文字母开头即可。
A换成N、B换成O、依此类推到M换成Z,然后序列反转:
N换成A、O换成B、最后Z换成M。
只有这些出现在英文字母里头的字元受影响;数字、符号、空白字元以及所有其他字元都不变。
因为只有在英文字母表里头只有26个,并且26=2×13,ROT13函数是它自己的逆反:
对任何字元x:
ROT13(ROT13(x))=ROT26(x)=x。
换句话说,两个连续的ROT13应用函式会回复原始文字(在数学上,这有时称之为对合(involution);在密码学上,这叫做对等加密(reciprocalcipher))。
转换可以利用查找表完成,如下例所示:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
例如,下面的英文笑话,精华句为ROT13所隐匿:
HowcanyoutellanextrovertfromanintrovertatNSA?
Vagurryringbef,gurrkgebiregybbxfnggurBGUREthl'ffubrf.
透过ROT13表格转换整片文字,该笑话的解答揭露如下:
UbjpnalbhgryynarkgebiregsebznavagebiregngAFN?
Intheelevators,theextrovertlooksattheOTHERguy'sshoes.
第二次ROT13函数将转回原始文字。
8.键盘密码
【相关知识、概述】
名称:
键盘密码
密码背景:
凡是利用键盘的特性而制作的密码,我们都可以称之为键盘密码。
[注1]
既然是利用键盘加密的方法,肯定是有了键盘之后才出现的产物,可见其历史并不久远。
常见的分类有计算机的键盘和手机的键盘两种,而这两种又根据具体的方法可以衍生出层出不穷的加密方法。
由于键盘在生活中十分常用,所以使用这种形式加密的频率十分之高。
天使贴的其中两层都是用到了键盘密码哦~学好这种密码的重要性可见一斑。
[注1]一些诸如利用五笔、智能ABC的加密形式,我们称之为输入法密码,不归于键盘密码一列。
【加密方法】
由于键盘密码的种类繁多,我们分开电脑的键盘和手机的键盘两种分开介绍。
『电脑键盘』
先让我们看看我们天天都会见到的键盘吧(这是偶清洗键盘时照的^^):
这算是一个比较标准的键盘了,我们主要关注的地方是大键盘区的字母和数字键,以及右边小键盘区的数字键。
最常用的电脑键盘加密方法是这样的:
『大键盘区』
『方法一』
我们注意到大键盘区所有的字母上面都有其对应的数字,这个位置几乎在所有的键盘都是相同的。
所以我们可以利用这一点应用单表替换的方法进行加密[注2]:
1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM
我们根据上表可以得出,Q是1下面的第一个,A是1下面的第二个……以此类推,每一个字母都会有其对应的数字:
A12
B53
C33
D32
E31
F42
G52
H62
I81
J72
K82
L92
M73
N63
O91
P01
Q11
R41
S22
T51
U71
V43
W21
X23
Y61
Z13
第一个数字代表横向(X坐标)的位置,第二个数字代表纵向(Y坐标)的位置。
例如我们加密这样一句话:
nicetomeetyou
对应刚才的字母表,我们可以轻松地得到密文:
63813331519173313151619171
而一旦我们知道了加密的方法后,我们也可以轻松的反解出原文。
有了这种加密方法,我们可以拥有相当多的变种加密方法:
例如(每一竖列是一种密码表):
A:
11,!
!
,!
2,QQ
B:
555,%%%,%3,
C:
333,###,#3,
D:
33,##,#2,EE
E:
3,#,#1,E
F:
44,$$,$2,RR
G:
55,%%,%2,TT
H:
66,^^,^2,YY
I:
8,*,*1,I
J:
77,&&,&2,UU
K:
88,**,*2,II
L:
99,((,(2,OO
M:
777,&&&,&3,UUU
N:
666,^^^,^3,YYY
O:
9,(,(1,O
P:
0,),)1,P
Q:
1,!
,!
1,Q
R:
4,$,$1,R
S:
22,@@,@2,WW
T:
55,%%,%2,T
U:
7,&,&1,U
V:
444,$$$,$3,RRR
W:
2,@,@1,W
X:
222,@@@,@3,W
Y:
6,^,^1,Y
Z:
111,,!
3,QQQ
第一列是将前文提到的Y坐标用重复次数表现,第二列是将数字替换为键盘上对应的符号,第三列则是将前文的X坐标数字替换为符号,第四列则是用的第一行的第一个字母代替数字。
值得注意的是,当替换的字长不等时(如第1、2、4列),最好用分隔符分割开每一个字母,或者用其他符号补位,这样做的好处是不会造成合法的接受人的困扰(即因分隔符位置的不同造成密码多解)。
这样的加密方法看起来很简单,但是相对应的,再加密的空间也很大。
举个简单的例子,我们可以把X、Y坐标的顺序颠倒一下,用第一个数字表示Y坐标,第二个顺序表示X坐标:
A21,B35,C33,D23,E13,F24,G25,H26,I18,J27,K28,L29,M37,N36,O19,P10,Q11,R14,S22,T15,U17,V34,W12,X32,Y16,Z31
我们还可以把Y坐标的顺序颠倒一下(用4减),即:
A12B51C31D32E33F42G52H62I83J72K82L92M71N61O93P03Q13R43S22T53U73V41W23X21Y63Z11
我们甚至还可以对坐标进行一下运算,更改一下坐标的原点位置[注3]等等,简而言之,键盘密码的灵活性很强,大家可以用键盘密码在和朋友聊天的时候折磨一下对方~
[注2]单表替换,即用新的字母表替换标准的字母表。
替换的文字可以是字母、符号、汉字,甚至可以是一句话,或者一幅图片。
许多经典的加密方法都是由此方法衍生的。
[注3]由于键盘中数字的排列“0”在“9”的后面,所以说是坐标其实并不准确,只是为了便于理解。
实际加密时,可以打乱键盘坐标的顺序。
『方法二』
这种方法与刚才的方法很类似,只是没有用数字那一行,而是利用了字母与字母之间的位置关系。
例如,我们看到字母Q在字母A的上面,而字母A则在字母Z的上面,所以我们可以利用这种关系加密,用Q替换A,用A替换Z,用Z替换Q,其他列以此类推:
[注4]
AQ,BG,CD,DE,EC,FR,GT,HY,IK,JU,KI,LO,MJ,NH,OL,PP,QZ,RV,SW,TB,UM,VF,WX,XS,YN,ZQ
同样的,我们可以衍生出许许多多不同的方法,诸如:
横向的替换、多字母的替换……
至于更为有趣的加密方法还有待大家来探索~
[注4]在加密字母I、O、P时,可以用文中所写的用字母来替换,也可以用符号来替换,如用“,”来替换字母“I”,密码的加密方法很灵活,大家不必太过拘泥于我所讲的。
『小键盘区』
小键盘的加密方法比较有趣,其应用于手机键盘也同样适用,简单说是一种象形的替换方式。
例如我们加密字母A的序列是1478963456,其实际上就是在小键盘上利用数字在写字,这种加密十分有趣,但是缺点也很明显:
只能加密较短的文字,如果加密的文字量较大,则加密后的文字量将十分庞大。
由于究竟怎样画最像,笔画的顺序如何见仁见智,我这里提供的替换表仅供参考:
A1478963456
B74178965456321
C9874123
D7417896321
E789741456123
F741789456
G9874123563
H741456963
I852
J7898521
K741954453
L74123
M1475963
N1475369
O78963214
P741789654
Q7412698753
R741789654453
S987456321
T789852
U7412369
V74269
W741585369
X753951
Y75952
Z7895123
『手机键盘』
手机我们每天都会用到,可以说手机这个东西我们再熟悉不过了,其键盘加密的原理和电脑键盘加密的原理类似,同样是运用了单表替换的思想。
我们先看看手机键盘长什么样子吧……
一般传统的手机键盘都长这个样子==(懒得拍照了……)
1.....2ABC..3DEF
4GHI..5JKL..6MNO
7PQRS.8TUV.9WXYZ
加密的时候方法类似前文,例如加密:
plantsvszombie,加密后的文字是:
7153216281748374946361214332
更多的加密方法请参考【扩展阅读】
【解密方法】
从繁多的加密方法我们可以看出,要想破解键盘密码,熟知各种的加密方法的特征是关键,唯有这样才能比较快的判断出加密形式,也就能十分轻松的破解了。
这里特别提一下手机键盘加密的破解,手机键盘加密后有个比较特别的特征,即第二个数字不超过4,大多数不超过3,第一个数字没有1和0。
看到这样的特征的话,不要犹豫,忘手机密码上想吧~
【扩展阅读】
手机键盘加密的若干方法
新手必看的密码初级教程
9.维吉尼亚密码
【相关知识、概述】
名称:
VigenèreCipher
中译名:
维吉尼亚密码/维热纳尔密码
密吧简称:
维密
发明者:
贝拉索[注1](由维吉尼亚改良[注2])
破解者:
巴比奇[注3]
密码背景:
这个密码首先应用了“密钥”的思想,其在密码届具有十分重要的意义。
经过这样加密后,一个由六个字母组成的的密钥,其理论上的暴力破解工作量就将是凯撒密码[注4]的一千多万倍。
[注1]吉奥万·巴蒂斯塔·贝拉索(GiovanBattistaBellaso,1505-?
),意大利学者。
其实维吉尼亚密码之前的名字是贝拉索密码,是贝拉索1553年发明的。
但是由于维吉尼亚在1586年的改进,使得其加密得更为可靠,久而久之,贝拉索密码就被叫成了维吉尼亚密码。
[注2]布莱斯·德·维吉尼亚(BlaisedeVigenère,1523-1596),一名法国的外交官,同时也是一位密码学家。
1586年在维吉尼亚密码原基础上进行了改进。
[注3]查尔斯·巴比奇(CharlesBabbage,1791-1871),英国数学家,差分机的发明者,其奠定了现代计算机的基本构架。
于1854年成功破解了维吉尼亚密码,结束了维吉尼亚200多年的神话。
[注4]凯撒密码,据说是由凯撒大帝所创造的密码,加密方法是将原文根据字母表顺序移位,具体请参考:
http:
/