zoukankan      html  css  js  c++  java
  • 替换加密、解密算法

    替换加密解密算法方案的起源可以追溯到凯撒(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
    退出程序!
  • 相关阅读:
    趣谈编程史第4期-饱受争议的前端之王JavaScript的血泪成长史
    趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普
    趣谈编程史第1期-跌宕起伏的java帝国史,剖析谷歌甲骨文长达8年的版权战争
    记录一次Metaspace扩容引发FGC的调优总结
    多线程学习笔记-深入理解ThreadPoolExecutor
    使用CompletableFuture优化你的代码执行效率
    Linux+Shell常用命令总结
    Guava Cache探索及spring项目整合GuavaCache实例
    将List按照指定大小等分的几种实现方式和效率对比及优化
    Spring的事件机制详解
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4518070.html
Copyright © 2011-2022 走看看