换位加密、解密算法

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

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
退出程序!
时间: 2024-11-05 16:06:43

换位加密、解密算法的相关文章

DES加密解密算法

DES加密解密算法 // 仿射变换加解密.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <conio.h> static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8]; char Code

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

java加密解密算法位运算

一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算会把加密后的字符串还原为原有字符串的值.效果图如下: 二.实现过程 1 package com.itxxz; 2 3 import java.util.Scanner; 4 5 /** 6 * java加密解密算法 7 * 8 * @author 螃蟹 9 * 网站:IT学习者 10 * 网址:ht

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

RC4加密解密算法

RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数据信息安全(个人见解,不周之处请谅解!). package com.bao.tools.encryption; import java.io.Console;import java.io.IOException;import java.util.Scanner; import org.junit.T

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

一次一密加密解密算法

static int MAX=100; static char[] key=new char[MAX]; //用于保存密钥 static int len; static char[] bitcode(char[] str) //一次一密加密算法 { int i; char[] wen; if((wen=new char[len+1])==null) { System.out.printf("申请内存失败!\n"); System.exit(1); } for(i=0;i<len;

数据的加密传输——单片机上实现TEA加密解密算法(转)

源:数据的加密传输——单片机上实现TEA加密解密算法 各位大侠在做数据传输时,有没有考虑过把数据加密起来进行传输,若在串口或者无线中把所要传的数据加密起来,岂不是增加了通信的安全性.常用的加密解密算法比如DES.RSA等,受限于单片机的内存和运算速度,实现起来比较困难,但一种叫TEA的加密算法特别适合单片机使用. TEA(Tiny Encryption Algorithm)是一种简单高效的加密算法,以加密解密速度快,实现简单著称.算法很简单,TEA算法每一次可以操作64-bit(8-byte),

基于新唐M0的XXTEA加密解密算法源码

源:基于新唐M0的XXTEA加密解密算法源码 /*--------------------------------------------------------------------------------------------------------- 在数据的加解密领域,算法分为对称密钥与非对称密钥两种.对称密钥与非对称密钥由于各自的特点,所应用的领域是不尽相 同的.对称密钥加密算法由于其速度快,一般用于整体数据的加密,而非对称密钥加密算法的安全性能佳,在数字签名领域得到广 泛的应用.

javascript DES加密解密算法

原文:javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm javascript DES加密解密算法,java通过ScriptEngineManager调用的例子. 源码截图: