古典密码学(Vigenere)之Java实现

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

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


   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首先是加密:



4.2.解密:

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

 Vigenere 类:

package com.example.zrl55.encryption_little_programming;
import java.util.ArrayList;
import java.util.HashMap;
/**
 * Created by zrl55 on 2016/12/7.
 */
/**
 *
接收用户输入的明文进行加密
 */
public class Vigenere implements Encryption{
    //声明并初始化一个String将字母与数字对应表内容存起来
   
public static String word="abcdefghijklmnopqrstuvwxyz";
    //Vigenere的加密算法
   
public Stringjiami_vigenere(String str,String key){
        //统一将所有输入的转为小写
       
key=key.toLowerCase();
        key=key.replaceAll("","");//将字符串中的空格去掉
       
str=str.toLowerCase();
        str=str.replaceAll("","");
        String miwen="";
        for(int i=0;i<str.length();i++){
            int a=word.indexOf(str.charAt(i));//首先根据下标在keystr里找下标字符,再根据字符在word里找下标
          
int b=word.indexOf(key.charAt(i%(key.length())));//用字符下标对key的长度求余,并用charAt方法取出key中该下标的字符
           
miwen=miwen+String.valueOf(word.charAt((a+b)%26));
        }
        return miwen;
    }
    /*
    *
接收用户输入的密文进行解密
    * */
   
public Stringjiemi_vigenere(String str,String key){
        //统一将所有输入的转为小写
       
key=key.toLowerCase();
        key=key.replaceAll("","");
        str=str.toLowerCase();
        str=str.replaceAll("","");
        String mingwen="";
        for(int i=0;i<str.length();i++){
            int a=word.indexOf(str.charAt(i));
            int b=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));
            }
        }
        return mingwen;
    }
    @Override
   
public Stringencryption(String str, String key) {
        return jiami_vigenere(str,key);
    }
    @Override
   
public Stringdeciphering(String str, String key) {
        return jiemi_vigenere(str,key);
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值