替换加密、解密算法

替换加密解密算法方案的起源可以追溯到凯撒(Caesar)时代,据说凯撒为了保障情报的可靠性而发明了凯撒密码。凯撒密码是一种简单的置换密码,在加密时,字母表中的每个字母都用其后的第三个字母表示,例如,a用d表示,b用e表示,......。在解密时,只需要执行逆过程即可。

1. 替换加密、解密算法

随这历史的发展,替换密码算法方案已具有很多种形式,主要有以下几种:

  • 单表代替密码算法方案
  • 同音代替密码算法方案
  • 多表代替密码算法方案
  • 多字母组代替密码算法方案

下面以单表代替密码算法方案为例进行介绍。

1)替换加密算法

替换加密算法的基本方法是首先给定一个密钥n,对应明文中的每一个字符的ASCII码都向后移动n而得到相应的密文。

按照此思路来编写相应的加密算法,代码示例如下:

    /**
     * 加密算法
     * @param str 明文字符串
     * @param n    明文中每个ASCII码向后移动的位数,即密钥
     * @return
     */
    static char[] jiami(char[] str,int n){
        int i,len;
        char[] miwen;
        len=str.length;
        miwen=new char[len];    //申请内存
        for(i=0;i<len;i++){
            miwen[i]=(char)(str[i]+n);
        }
        return miwen;
    }

2)替换解密算法

替换解密算法的基本方法是首先给定一个密钥n,这个密钥必须和加密时的密钥一致,对应密文中的每一个字符的ASCII码都向前移动n而得到相应的明文。

按照此思路来编写相应的加密算法,代码示例如下:

    /**
     * 解密算法
     * @param miwen 密文字符串
     * @param n    密文中每个ASCII码向前移动的位数,应与加密算法向后移动位数相同
     * @return
     */
    static char[] jiemi(char[] miwen,int n){
        int i,len;
        char[] str;
        len=miwen.length;
        str=new char[len];    //申请内存
        for(i=0;i<len;i++){
            str[i]=(char)(miwen[i]-n);
        }
        return str;
    }

2. 替换加密、解密算法实例

完整的程序代码示例如下:

package com.cn.mimaxue;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

//替换加密解密算法
public class THJMJM {
    /**
     * 加密算法
     * @param str 明文字符串
     * @param n    明文中每个ASCII码向后移动的位数,即密钥
     * @return
     */
    static char[] jiami(char[] str,int n){
        int i,len;
        char[] miwen;
        len=str.length;
        miwen=new char[len];    //申请内存
        for(i=0;i<len;i++){
            miwen[i]=(char)(str[i]+n);
        }
        return miwen;
    }
    /**
     * 解密算法
     * @param miwen 密文字符串
     * @param n    密文中每个ASCII码向前移动的位数,应与加密算法向后移动位数相同
     * @return
     */
    static char[] jiemi(char[] miwen,int n){
        int i,len;
        char[] str;
        len=miwen.length;
        str=new char[len];    //申请内存
        for(i=0;i<len;i++){
            str[i]=(char)(miwen[i]-n);
        }
        return str;
    }
    public static void main(String[] args) throws IOException {
        char[] str,miwen,jiemi;
        int n,i;
        String go;
        System.out.println("替换加密解密算法演示!");
        Scanner input = new Scanner(System.in);
        do{
            System.out.print("请输入替换加密解密算法的密钥:");
            n = input.nextInt();
            System.out.print("请输入明文:");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String strtemp=br.readLine();
            str=strtemp.toCharArray();
            System.out.print("明文为:");
            for(i=0;i<str.length;i++){
                System.out.print(str[i]);
            }
            System.out.println();
            miwen=jiami(str,n);
            System.out.print("密文为:");
            for(i=0;i<miwen.length;i++){
                System.out.print(miwen[i]);
            }
            System.out.println();
            jiemi=jiemi(miwen,n);
            System.out.print("解密为:");
            for(i=0;i<jiemi.length;i++){
                System.out.print(jiemi[i]);
            }
            System.out.println();
            System.out.print("是否继续(y/n):");
            go = input.next();
        }while(go.equalsIgnoreCase("y")); 
        System.out.println("退出程序!");

    }

}

程序运行结果如下:

替换加密解密算法演示!
请输入替换加密解密算法的密钥:4
请输入明文:Hello everyone!
明文为:Hello everyone!
密文为:Lipps$iziv}sri%
解密为:Hello everyone!
是否继续(y/n):y
请输入替换加密解密算法的密钥:3
请输入明文:One world, One dream!
明文为:One world, One dream!
密文为:Rqh#zruog/#Rqh#guhdp$
解密为:One world, One dream!
是否继续(y/n):n
退出程序!
原文地址:https://www.cnblogs.com/gaopeng527/p/4518070.html