置换密码
置换密码与前面的代换密码是不一样的,置换密码是保持明文的所有字母不变,只是利用置换打乱了明文字母的位置和次序。
首先需要明白,置换既是单射又是满射
定义
令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);
}
}