vigenere java实现_古典密码学(Vigenere)之Java实现-Go语言中文社区

导语:古典密码学一般都十分简单,几乎没什么算法可言,本人觉得更体现的是一种灵巧性,运用到的数学知识并不多也不难,大多数为单表替换或者简单的模运算,而现代密码学无论从设计还是加密解密思路都涉及大量的数学知识,本文介绍的Vigenere密码属于很简单的古典密码之一。

思路:1.首先要对字母表进行编号(注意不区分大小写)

51411

2.密码学五大要素:密钥,明文,密文,加密算法,解密算法

设密钥k=(k1,k2,...,kd),明文p=(p1,p2,...,pn),密文c=(c1,c2,...,cn)。

加密算法:

Ci=Pi+Ki(mode26)

解密算法:

Pi=Ci-Ki(mode26)

3.讲解思路:

例子:明文P=data    密钥K=best

加密过程:d=3,b=1  (3+1)mode26=4,e=4

a=0,e=4 (0+4)mode26=4,e=4

以此类推...

最终密文为:eelt

解密反过来就好

4.程序在安卓端实现的,以下是一些最终效果(界面很丑的~)

4.1首先是加密:

8add28bbbe0f84ca76ac43183f3f30d0.png

8add28bbbe0f84ca76ac43183f3f30d0.png

4.2.解密:

d3c82d75335794273d74f5632be34d4b.png

ef8fd3e387a302fa95e92ded5a99cbf7.png

5.源码:(由于我将好几个加密算法写在了一个安卓程序里,所以下面的源代码只是程序的一部分,是Vigenere的核心代码)

Vigenere 类:

packagecom.example.zrl55.encryption_little_programming;

importjava.util.ArrayList;

importjava.util.HashMap;

/**

* Created by zrl55 on 2016/12/7.

*/

/**

*接收用户输入的明文进行加密*/public classVigenere

implementsEncryption{

//声明并初始化一个String将字母与数字对应表内容存起来public staticString

word="abcdefghijklmnopqrstuvwxyz";

//Vigenere的加密算法publicStringjiami_vigenere(String str,String key){

//统一将所有输入的转为小写key=key.toLowerCase();

key=key.replaceAll("","");//将字符串中的空格去掉str=str.toLowerCase();

str=str.replaceAll("","");

String miwen="";

for(inti=0;i

inta=word.indexOf(str.charAt(i));//首先根据下标在key和str里找下标字符,再根据字符在word里找下标intb=word.indexOf(key.charAt(i%(key.length())));//用字符下标对key的长度求余,并用charAt方法取出key中该下标的字符miwen=miwen+String.valueOf(word.charAt((a+b)%26));

}

returnmiwen;

}

/*

*接收用户输入的密文进行解密* */publicStringjiemi_vigenere(String str,String key){

//统一将所有输入的转为小写key=key.toLowerCase();

key=key.replaceAll("","");

str=str.toLowerCase();

str=str.replaceAll("","");

String mingwen="";

for(inti=0;i

inta=word.indexOf(str.charAt(i));

intb=word.indexOf(key.charAt(i%(key.length())));

if((a-b)<0){

mingwen=mingwen+String.valueOf(word.charAt((a-b+26)%26));

}else{          mingwen=mingwen+String.valueOf(word.charAt((a-b)%26));

}

}

returnmingwen;

}

@OverridepublicStringencryption(String str, String key) {

returnjiami_vigenere(str,key);

}

@OverridepublicStringdeciphering(String str, String key) {

returnjiemi_vigenere(str,key);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值