• 换位加密、解密算法


    换位密码算法方案,又称为置换加密方案,其根据一定的规则重新安排明文字母,使之成为密文。换位密码是最简单的密码学算法。

    1. 换位加密、解密算法

    换位加密解密的算法有很多种,这里介绍基于二维数组移位的换位加密、解密算法。二维数组移位的换位加密、解密算法即将明文字符串按照一个给定的顺序保存在二维数组中,然后按照另外一个顺序读出,便的到密文。执行相反的过程便可以恢复出明文。

    1)换位加密算法

    基于二维数组移位的加密算法的操作步骤如下:

    (1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数。

    (2)将明文字符串按行依次排列到该二维数组中。

    (3)按列读出该二维数组中的字符,这样便得到密文。

    可以根据此思路来编写相应的加密算法,代码示例如下:

        /**
         * 加密算法
         * @param str 明文
         * @param n    指定的二维数组的列数
         * @return
         */
        static char[] jiami(char[] str,int n){
            int len,d,i,j,m;
            char[] temp,miwen;
            len=str.length;
            if((d=len%n)!=0){
                len = len + n-d;
            }
            temp = new char[len];
            m=len/n;
            for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                    if(i*n+j<str.length){
                        temp[i+m*j]=str[i*n+j];
                    }else{
                        temp[i+m*j]=' ';
                    }
                }
            }
            while(temp[len-1]==' '){
                len--;
            }
            miwen = new char[len];
            for(i=0;i<len;i++){
                miwen[i]=temp[i];
            }
            return miwen;
        }

    2)换位解密算法

    基于二维数组移位的解密算法的操作步骤如下:

    (1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数。这个数应该和加密算法中的一致。

    (2)将密文字符串按列一次排列到该二维数组中。

    (3)按行读出该二维数组中的字符,这样便得到明文。

    可以根据此思路来编写相应的解密算法,代码示例如下:

        /**
         * 解密算法
         * @param miwen 密文
         * @param n    指定的二维数组的列数(与加密算法相同)
         * @return
         */
        static char[] jiemi(char[] miwen,int n){
            int len,d,i,j,m;
            char[] temp,str;    
            len=miwen.length;
            if((d=len%n)!=0){
                len = len + n-d;
            }
            temp = new char[len];
            m=len/n;
            for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    if(i*m+j<miwen.length){
                        temp[i+j*n]=miwen[i*m+j];
                    }else{
                        temp[i+n*j]=' ';
                    }            
                }
            }
            while(temp[len-1]==' '){
                len--;
            }
            str = new char[len];
            for(i=0;i<len;i++){
                str[i]=temp[i];
            }
            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 JiaMiJieMi {
        /**
         * 加密算法
         * @param str 明文
         * @param n    指定的二维数组的列数
         * @return
         */
        static char[] jiami(char[] str,int n){
            int len,d,i,j,m;
            char[] temp,miwen;
            len=str.length;
            if((d=len%n)!=0){
                len = len + n-d;
            }
            temp = new char[len];
            m=len/n;
            for(i=0;i<m;i++){
                for(j=0;j<n;j++){
                    if(i*n+j<str.length){
                        temp[i+m*j]=str[i*n+j];
                    }else{
                        temp[i+m*j]=' ';
                    }
                }
            }
            while(temp[len-1]==' '){
                len--;
            }
            miwen = new char[len];
            for(i=0;i<len;i++){
                miwen[i]=temp[i];
            }
            return miwen;
        }
        /**
         * 解密算法
         * @param miwen 密文
         * @param n    指定的二维数组的列数(与加密算法相同)
         * @return
         */
        static char[] jiemi(char[] miwen,int n){
            int len,d,i,j,m;
            char[] temp,str;    
            len=miwen.length;
            if((d=len%n)!=0){
                len = len + n-d;
            }
            temp = new char[len];
            m=len/n;
            for(i=0;i<n;i++){
                for(j=0;j<m;j++){
                    if(i*m+j<miwen.length){
                        temp[i+j*n]=miwen[i*m+j];
                    }else{
                        temp[i+n*j]=' ';
                    }            
                }
            }
            while(temp[len-1]==' '){
                len--;
            }
            str = new char[len];
            for(i=0;i<len;i++){
                str[i]=temp[i];
            }
            return str;
        }
        
        public static void main(String[] args) throws IOException{
            char[] str,miwen,jiemi;
            int n,i;
            String go;
            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!
    密文为:Hoene reley!lvo
    解密为:Hello everyone!
    是否继续(y/n):y
    请输入指定的二维数组的列数:5
    请输入明文:You are very good!
    明文为:You are very good!
    密文为:Yrrooeydu  ! vg aeo
    解密为:You are very good!
    是否继续(y/n):n
    退出程序!
  • 相关阅读:
    java 如何判断邮箱是否正确
    Android SDK Manager无法更新的解决
    洛谷P1162
    真 随笔
    初始化结构体
    Linux mkdir -p 后出现permission denied问题
    校赛F
    HDU1022
    UVa156
    HDU1060
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4515385.html
Copyright © 2020-2023  润新知