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

古典密码学(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);
    }
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_36515965/article/details/75091398
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-01 20:53:24
  • 阅读 ( 2047 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢