Simple Columnar Transposition Technique(简单分栏式变换加密技术)
简单分栏式变换加密技术:(1)将明文消息一行一行写入预定长度的矩形中
(2)一列一列读消息,但不一定按1、2、3列的顺序,也可以按随机顺序,如2、3、1
(3)得到的消息就是密文消息
注:密钥为字符的话,就根据ASII码的大小进行组合。
实现的算法:按照排序好的数组bufClone的字符遍历寻找对应buf的字符的位置,然
后取出该位置整数倍的位置的字符
SimpleColumar.java
1
package
SimpleColumnarTransposition;
2 import javax.swing.JFrame;
3 public class SimpleColumar {
4 public static void main(String[] args) {
5 // 实例化一个窗体
6 SimpleColumnarFrame frame = new SimpleColumnarFrame();
7 frame.setVisible( true );
8 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
9 }
10 }
11
12
2 import javax.swing.JFrame;
3 public class SimpleColumar {
4 public static void main(String[] args) {
5 // 实例化一个窗体
6 SimpleColumnarFrame frame = new SimpleColumnarFrame();
7 frame.setVisible( true );
8 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
9 }
10 }
11
12
SimpleColumnarFrame .java
1
package
SimpleColumnarTransposition;
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.util.Arrays;
6
7 import javax.swing. * ;
8
9 @SuppressWarnings({ " static-access " , " static-access " , " static-access " , " static-access " })
10 public class SimpleColumnarFrame extends JFrame {
11 JButton btnKey = new JButton();
12 JButton btnReset = new JButton();
13 JLabel lbTest = new JLabel();
14 JLabel lbKey = new JLabel();
15 JPasswordField jpf = new JPasswordField();
16 JTextField tfDarkPass = new JTextField();
17 JTextField tfKey = new JTextField();
18 char [] arr;
19 byte [] buf,bufClone;
20
21 public SimpleColumnarFrame() {
22 this .setSize( 300 , 200 ); // 设置窗体大小
23 this .setTitle( " 简单变换栅栏加密法 " );
24 this .setResizable( false ); // 设置窗体大小不可变
25 Init(); // 填充窗体内容
26 }
27
28
29 private void makeBrightText() {
30 tfDarkPass.setEditable( true );
31 arr = jpf.getPassword(); // 获取明文
32 buf = tfKey.getText().getBytes(); // 获取密钥,用ASII码进行比较
33 bufClone = buf.clone(); // 克隆数组
34 Arrays.sort(bufClone); // 根据ASII码排序
35 reform(); // 重组字符
36 tfDarkPass.setEditable( false );
37 }
38
39 private void reform() {
40 /* 按照排序好的数组bufClone的字符遍历寻找对应buf的字符的位置,然
41 后取出该位置整数倍的位置的字符 */
42 char [] a = new char [arr.length];
43 int index = 0 ;
44 for ( int i = 0 ;i < bufClone.length;i ++ )
45 for ( int j = 0 ;j < buf.length;j ++ )
46 if (buf[j] == bufClone[i])
47 for ( int k = 0 ;k < arr.length;k ++ )
48 if ((k + 1 ) % buf.length == (j + 1 ) % buf.length)
49 a[index ++ ] = arr[k];
50 String str = new String(a);
51 tfDarkPass.setText(str);
52 }
53
54 private void reset() {
55 tfDarkPass.setEditable( true );
56 jpf.setText( "" );
57 tfKey.setText( "" );
58 tfDarkPass.setText( "" );
59 tfDarkPass.setEditable( false );
60 }
61
62 private void Init() {
63 // 设置窗体内容
64 this .setLayout( null );
65 lbTest.setText( " 输入明文: " );
66 lbTest.setBounds( 30 , 20 , 80 , 30 );
67 lbKey.setText( " 密钥: " );
68 lbKey.setBounds( 30 , 70 , 80 , 30 );
69 btnKey.setText( " 生成密文: " );
70 btnKey.setBounds( 75 , 110 , 100 , 30 );
71 btnReset.setText( " 重置 " );
72 btnReset.setBounds( 5 , 110 , 60 , 30 );
73 jpf.setBounds( 160 , 20 , 80 , 30 );
74 jpf.setEchoChar( ' * ' );
75 tfDarkPass.setBounds( 190 , 110 , 80 , 30 );
76 tfDarkPass.setEditable( false );
77 tfKey.setBounds( 160 , 70 , 80 , 30 );
78
79 this .add(lbTest);
80 this .add(jpf);
81 this .add(lbKey);
82 this .add(btnKey);
83 this .add(btnReset);
84 this .add(tfDarkPass);
85 this .add(tfKey);
86
87 btnKey.addActionListener( new ActionListener(){
88 // 触发事件,生成明文
89 public void actionPerformed(ActionEvent e) {
90 makeBrightText();
91 }
92
93 });
94
95 btnReset.addActionListener( new ActionListener(){
96 // 触发事件,生成明文
97 public void actionPerformed(ActionEvent e) {
98 reset(); // 重置
99 }
100
101 });
102 }
103
104 }
105
2
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
5 import java.util.Arrays;
6
7 import javax.swing. * ;
8
9 @SuppressWarnings({ " static-access " , " static-access " , " static-access " , " static-access " })
10 public class SimpleColumnarFrame extends JFrame {
11 JButton btnKey = new JButton();
12 JButton btnReset = new JButton();
13 JLabel lbTest = new JLabel();
14 JLabel lbKey = new JLabel();
15 JPasswordField jpf = new JPasswordField();
16 JTextField tfDarkPass = new JTextField();
17 JTextField tfKey = new JTextField();
18 char [] arr;
19 byte [] buf,bufClone;
20
21 public SimpleColumnarFrame() {
22 this .setSize( 300 , 200 ); // 设置窗体大小
23 this .setTitle( " 简单变换栅栏加密法 " );
24 this .setResizable( false ); // 设置窗体大小不可变
25 Init(); // 填充窗体内容
26 }
27
28
29 private void makeBrightText() {
30 tfDarkPass.setEditable( true );
31 arr = jpf.getPassword(); // 获取明文
32 buf = tfKey.getText().getBytes(); // 获取密钥,用ASII码进行比较
33 bufClone = buf.clone(); // 克隆数组
34 Arrays.sort(bufClone); // 根据ASII码排序
35 reform(); // 重组字符
36 tfDarkPass.setEditable( false );
37 }
38
39 private void reform() {
40 /* 按照排序好的数组bufClone的字符遍历寻找对应buf的字符的位置,然
41 后取出该位置整数倍的位置的字符 */
42 char [] a = new char [arr.length];
43 int index = 0 ;
44 for ( int i = 0 ;i < bufClone.length;i ++ )
45 for ( int j = 0 ;j < buf.length;j ++ )
46 if (buf[j] == bufClone[i])
47 for ( int k = 0 ;k < arr.length;k ++ )
48 if ((k + 1 ) % buf.length == (j + 1 ) % buf.length)
49 a[index ++ ] = arr[k];
50 String str = new String(a);
51 tfDarkPass.setText(str);
52 }
53
54 private void reset() {
55 tfDarkPass.setEditable( true );
56 jpf.setText( "" );
57 tfKey.setText( "" );
58 tfDarkPass.setText( "" );
59 tfDarkPass.setEditable( false );
60 }
61
62 private void Init() {
63 // 设置窗体内容
64 this .setLayout( null );
65 lbTest.setText( " 输入明文: " );
66 lbTest.setBounds( 30 , 20 , 80 , 30 );
67 lbKey.setText( " 密钥: " );
68 lbKey.setBounds( 30 , 70 , 80 , 30 );
69 btnKey.setText( " 生成密文: " );
70 btnKey.setBounds( 75 , 110 , 100 , 30 );
71 btnReset.setText( " 重置 " );
72 btnReset.setBounds( 5 , 110 , 60 , 30 );
73 jpf.setBounds( 160 , 20 , 80 , 30 );
74 jpf.setEchoChar( ' * ' );
75 tfDarkPass.setBounds( 190 , 110 , 80 , 30 );
76 tfDarkPass.setEditable( false );
77 tfKey.setBounds( 160 , 70 , 80 , 30 );
78
79 this .add(lbTest);
80 this .add(jpf);
81 this .add(lbKey);
82 this .add(btnKey);
83 this .add(btnReset);
84 this .add(tfDarkPass);
85 this .add(tfKey);
86
87 btnKey.addActionListener( new ActionListener(){
88 // 触发事件,生成明文
89 public void actionPerformed(ActionEvent e) {
90 makeBrightText();
91 }
92
93 });
94
95 btnReset.addActionListener( new ActionListener(){
96 // 触发事件,生成明文
97 public void actionPerformed(ActionEvent e) {
98 reset(); // 重置
99 }
100
101 });
102 }
103
104 }
105
现实图解:
输入明文及密钥,点击生成密文按钮,则产生相应密文,重置,则重新填写相关信息。