Java之Caesar与Vigenere实现Word格式.docx
- 文档编号:16282853
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:5
- 大小:18.98KB
Java之Caesar与Vigenere实现Word格式.docx
《Java之Caesar与Vigenere实现Word格式.docx》由会员分享,可在线阅读,更多相关《Java之Caesar与Vigenere实现Word格式.docx(5页珍藏版)》请在冰豆网上搜索。
那么,处于对易用性,易实现性的考虑,那些什么DES算法就暂时不考虑了。
如果真有这个需求的话,相信找个健壮性很高的DES问题还不是很大的。
而在那许多经典的加密算法中,要数Caesar加密比较经典了。
所以,处于这样的一个需求,就打算实现一个经典加密算法。
2Caesar加密算法
Caesar加密算法算是经典加密算法中最简单的了。
对于标准的Caesar来说,就是把字母序列向后移动一定的数量,替换后得到密文,而这个数量为固定值3。
也就是说,在都是由英文字母组成的文本里,字母A将会被替换成D,B会被替换成E,以此类推。
对于Caesar加密算法,存在几点问题。
首先是这个作为密钥的值是个固定的3,而且字母表又是按顺序排列的,所以只要对方知道你是用Caesar加密的,就很容易的脱密成原文,虽然有些麻烦,但是这就和用原文是差不多的,即使对加密要求很低也不能低成这样不是?
然后是这个替换表,因为是基于字母表的,所以对于英文来说只能加密英文字母,这样就不能被支持了。
最后,因为替换是固定的,所以,对于同一个字母,加密后的字母也是固定的。
比如"
AAA"
这个文本加密后,就是"
DDD"
,看起来还不够迷惑人。
基于以上的原因,我这里实现的Caesar做了一些修改,但是总的思路还是Caesar。
1.publicclassCaesar{
2.privateStringtable;
3.privateintseedA=1103515245;
4.privateintseedB=12345;
5.
6.publicCaesar(Stringtable,intseed){
7.this.table=chaos(table,seed,table.length());
8.}
9.publicCaesar(Stringtable){
10.this(table,11);
11.}
12.publicCaesar(){
13.this(11);
14.}
15.publicCaesar(intseed){
16.this("
ABCDEFGHIJKLMNOPQRSTUVWXYZ"
seed);
17.}
18.publicchardict(inti,booleanreverse){
19.ints=table.length(),index=reverse?
s-i:
i;
20.returntable.charAt(index);
21.}
22.publicintdict(charc,booleanreverse){
23.ints=table.length(),index=table.indexOf(c);
24.returnreverse?
s-index:
index;
25.}
26.publicintseed(intseed){
27.longtemp=seed;
28.return(int)((temp*seedA+seedB)&
0x7fffffffL);
29.}
30.
31.publicStringchaos(Stringdata,intseed,intcnt){
32.StringBufferbuf=newStringBuffer(data);
33.chartmp;
inta,b,r=data.length();
34.for(inti=0;
i<
cnt;
i+=1){
35.seed=seed(seed);
a=seed%r;
36.seed=seed(seed);
b=seed%r;
37.tmp=buf.charAt(a);
38.buf.setCharAt(a,buf.charAt(b));
39.buf.setCharAt(b,tmp);
40.}
41.returnbuf.toString();
42.}
43.
44.publicStringcrypto(booleanreverse,
45.intkey,Stringtext){
46.Stringret=null;
47.StringBuilderbuf=newStringBuilder();
48.intm,s=table.length(),e=text.length();
49.
50.for(inti=0;
e;
51.m=dict(text.charAt(i),reverse);
52.if(m<
0)break;
53.m=m+key+i;
54.buf.append(dict(m%s,reverse));
55.}
56.if(buf.length()==e)
57.ret=buf.toString();
58.returnret;
59.}
60.publicStringencode(intkey,Stringtext){
61.returncrypto(false,key,text);
62.
63.}
64.publicStringdecode(intkey,Stringtext){
65.returncrypto(true,key,text);
66.}
67.
68.publicstaticvoidmain(String[]args){
69.Caesarcaesar=newCaesar();
70.Stringdata=caesar.encode(32,"
APPLE"
);
71.caesar.decode(32,data);
72.}
73.}
在上面的Caesar实现中,我用一个整数替代了原来作为密钥的固定值3。
其次,可以通过传入不同的字符集让这个加密算法的适用性更广泛。
最后,算法类在初始化的时候,会对替换表做一次扰乱操作,这样的话,即使是相同的替换表,因为初始化传入的seed不同,加密出来的内容也会不同。
至于程序的细节,我想源码会更直观的告诉你的。
3Vigenere加密算法
其实,Vigenere加密算法从历史考证来看好像并不是一个叫Vigenere的人发明的。
大概只是因为某些机缘巧合,被一个叫Vigenere的人用了,并且流传开了,然后就被叫做Vigenere加密算法了。
后来发现这原来是一个美丽的误解,但是既然都已经被叫习惯了,改口自然是很难了,因此就那么流传下来了。
说道这里,Bellaso先生又一次的泪目了。
为什么我这里要把Vigenere密码和Caesar放在一起呢?
因为Vigenere算是一个升级版的Caesar算法。
所以,当时实现了那个Caesar后,就顺带连Bellaso和Vigenere先生,也一起缅怀一下了。
和Caesar相比Vigenere是一个多表替代,就是说针对明文中不同位置的字母,会选用不同的替换表来加密。
如果用上面的例子来说,对于不同位置的字母,会选择不同的key去加密。
说白了,就是多个Caesar叠加起来就是Vigenere。
虽然说Vigenere在加密的效果上比Caesar有很多提升了,也弥补了Caesar上存在的一些问题。
但是,我的实现还是做了一些小小的调整。
1.publicclassVigenere{
6.publicVigenere(Stringtable,intseed){
9.publicVigenere(Stringtable){
12.publicVigenere(){
15.publicVigenere(intseed){
18.
19.privatechardict(inti,booleanreverse){
20.ints=table.length(),index=reverse?
21.returntable.charAt(index);
22.}
23.privateintdict(charc,booleanreverse){
24.ints=table.length(),index=table.indexOf(c);
25.returnreverse?
26.}
27.privateintseed(intseed){
28.longtemp=seed;
29.return(int)((temp*seedA+seedB)&
30.}
31.
32.publicStringchaos(Stringdata,intseed,intcnt){
33.StringBufferbuf=newStringBuffer(data);
34.chartmp;
35.for(inti=0;
37.seed=seed(seed);
38.tmp=buf.charAt(a);
39.buf.setCharAt(a,buf.charAt(b));
40.buf.setCharAt(b,tmp);
41.}
42.returnbuf.toString();
43.}
45.Stringkey,Stringtext){
48.intm,k,s=table.length(),
49.e=text.length(),
50.ke=key.length();
51.
52.for(inti=0;
53.m=dict(text.charAt(i),reverse);
54.k=dict(key.charAt(i%ke),false);
55.if(m<
0||k<
56.m=m+k+i;
57.buf.append(dict(m%s,reverse));
58.}
59.if(buf.length()==e)
60.ret=buf.toString();
61.returnret;
62.}
63.publicStringencode(Stringkey,Stringtext){
64.returncrypto(false,key,text);
65.
67.publicStringdecode(Stringkey,Stringtext){
68.returncrypto(true,key,text);
69.}
70.publicstaticvoidmain(String[]args){
71.Vigenerevigenere=newVigenere();
72.Stringdata=vigenere.encode("
BELLASO"
"
73.vigenere.decode("
data);
74.}
75.}
话说,Vigenere加密算法传入的密钥到不是一个数字,是一个字符串。
这个字符串中所用的字符,必须在替换表中出现过的。
总的来说,Vigenere的强度要比Caesar强一些。
但是终究还是会被破解的。
不过,Vigenere有机会成为强度相当高的一种加密手段,前提是~前提是你的密钥长度大于或等于明文长度。
然而,在实际应用中,这个密钥总是小于明文长度的。
4总结
总的来说,理解这两个加密算法都不算太难。
对于密码学大牛来说,这简直是小儿科了。
两个算法有许多地方都是公用的,只是在一些地方有少许不同。
在开发中,可以根据自己的喜好选择一下。
不要期待这两个加密算法能有多大的抗破解强度,但是,作为一个烟雾弹掩盖一下明文还是可以的。
不过,如果你要将这个加密算法反复对一组明文加密的话,你最好自己再测试一下。
因为,加密次数多了,出来的不一定是一个强度高的密文,也可能会是明文本身,切记切记。
另外,有些人可能会想,那如果我要加密的是中文或者二进制数据,是不是要建立一个超大的密码表,比如把中文字符集放进去?
我想说的是,这个加密算法强度不是很高的,如果你非有这个需求,要上身穿着阿玛尼,脚上穿着丁子拖加裤衩,那也是可以的,方法就是用Base64把你的数据转一下码。
剩下的就是传一个包含那64个字符的转换表。
建议"
="
符号不要加密。
就像我题目所说的,聊胜于无。
有时候,有条裤衩穿着出门,总比一丝不挂的出门要好。
前者,你最多是被人说不太文明。
而后者,你却铁定要被请去喝茶的。
我实现这两个密码最主要的现实意义也在于此,最后,感谢你能坚持看到文章的末尾,如果你有什么疑问或者想法,希望你能告诉我,我也很乐意与你交流。
________________________________________
Footnotes:
1Struts2+Spring+Hibernate
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java Caesar Vigenere 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)