【特点】
和原文等长,但密钥容易被猜出来,因为seed小于原文长度。
【代码】
package com.hy.lab; /** * 置换加解密器 */ public class TranspositionCipher { public static String encrypt(String raw,int seed){ String[] arr=new String[seed]; for(int i=0;i<arr.length;i++){ arr[i]=""; } int n=raw.length(); for(int i=0;i<n;i++){ char c=raw.charAt(i); arr[i%seed]+=c; } return String.join("",arr); } public static String decrypt(String raw,int seed){ int n=raw.length(); int cols=(int)(Math.ceil(((double)n)/((double)seed))); int rows=seed; int spaceCnt=rows*cols-n; String[] arr=new String[cols]; for(int i=0;i<arr.length;i++){ arr[i]=""; } int index=0; int row=0; int column=0; for(int i=0;i<n;i++){ char c=raw.charAt(i); arr[column]+=c; column++; if(column==cols || (column==cols-1 && row>=rows-spaceCnt) ){ column=0; row+=1; } } return String.join("",arr); } public static void main(String[] args){ String[] arr=new String[]{"Common sense is not so common.","秦时明月汉时关万里长征人未还但使龙城飞将在不教胡马度阴山","ABCDEFGHJds","2131kgfjhj321","32132132132132ewqewq"}; for(String str:arr){ String en=encrypt(str,8); String de=decrypt(en,8); String msg=String.format("原文=%s 密文=%s 还原文=%s",str,en,de); System.out.println(msg); } } }
【输出】
原文=Common sense is not so common. 密文=Cenoonommstmme oo snnio. s s c 还原文=Common sense is not so common. 原文=秦时明月汉时关万里长征人未还但使龙城飞将在不教胡马度阴山 密文=秦里龙马时长城度明征飞阴月人将山汉未在时还不关但教万使胡 还原文=秦时明月汉时关万里长征人未还但使龙城飞将在不教胡马度阴山 原文=ABCDEFGHJds 密文=AJBdCsDEFGH 还原文=ABCDEFGHJds 原文=2131kgfjhj321 密文=2h1j3312k1gfj 还原文=2131kgfjhj321 原文=32132132132132ewqewq 密文=31q23e12w31q23123e2w 还原文=32132132132132ewqewq
【参考资料】
Python密码学教程 美国Al Sweigart著
END