【密码学原理与实践】(六)置换密码 符java代码实现

置换密码

置换密码与前面的代换密码是不一样的,置换密码是保持明文的所有字母不变,只是利用置换打乱了明文字母的位置和次序。

首先需要明白,置换既是单射又是满射

定义

令m为一正整数,P=C= ( Z 26 ) m (Z_{26})^m (Z26)m,K是左右定义在集合{1,2…m}上的置换组成,对任意的秘钥π,定义: e x ( x 1 , x 2 . . . x m ) = ( x π ( 1 ) , x π ( 2 ) , . . . x π ( m ) ) e_x(x_1,x_2...x_m)=(x_{π(1)},x_{π(2)},...x_{π(m)}) ex(x1,x2...xm)=(xπ(1),xπ(2),...xπ(m)) d π ( y 1 , y 2 . . . y m ) = ( y π − 1 ( 1 ) , y π − 1 ( 2 ) , . . y π − 1 ( m ) ) d_π(y_1,y_2...y_m)=(y_{π^{-1}(1)},y_{π^{-1}(2)},..y_{π^{-1}(m)}) dπ(y1,y2...ym)=(yπ1(1),yπ1(2),..yπ1(m))其中 π − 1 π^{-1} π1为置换π的逆置换。

举个例子

设m=6,密钥为如下的置换π:

x 1 2 3 4 5 6
π(x) 3 5 1 6 4 2

由上可得逆置换为

x 1 2 3 4 5 6
π − 1 ( x ) π^{-1}(x) π1(x) 3 6 1 5 2 4

假设我们加密的明文是:shesellsseashellsbytheseashore

我们需要根据密钥的长度将明文分为每6个一组

shesel|lsseas|hellsb|ythese|ashore

然后每组的6个字母使用加密变换,可以得到:

EESLSH|SALSES|LSHSES|HSYEET|HRAEOS

解密也是相同的方式,只是将置换替换为 π − 1 π^{-1} π1

代码实现

package com.slp.cryptography;

/**
 * @ClassName PermutationSipher
 * @Description 置换密码
 * @Author sanglp
 * @Date 2020/12/1 8:31
 * @Version 1.0
 **/
public class PermutationSipher {
    
    

    static int[] key = {
    
    3,5,1,6,4,2};

    public static void main(String[] args) {
    
    
        encrypt("shesellsseashellsbytheseashore");
    }

    /**
     * 加密函数
     * 解密函数同理 不再重写
     * @param resource
     */
    private static void encrypt(String resource){
    
    
        char[] resarr = resource.toUpperCase().toCharArray();
        StringBuilder result = new StringBuilder();

        for (int i = 0; i < resarr.length/key.length; i++) {
    
    
            for (int j = 0; j <key.length ; j++) {
    
    
                result.append(resarr[i*key.length+key[j]-1]);//这里需要注意一下 数组下标从0开始 否则会数组越界
            }
        }
        System.out.println(result);

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_51656605/article/details/110421527