信息安全密码学实验二:序列密码的设计与实现

序列密码的设计与实现

一、实验目的

理解线性反馈移位寄存器的基本构造,编程实现一个简单的线性反馈移位寄存器并用输出序列对给定明文实施逐比特加密。

二、实验原理

给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位

三、实验要求

1.联结多项式: p = 1 + x + x^7
2.联结多项式: p = 1 + x^2 + x^5 + x^7

四、代码实现

1 .p = 1 + x + x^7

package czx.xupt.lfsr;

import java.util.Scanner;

/**
 * #Author:槐序二四
 * #Time:2019/12/18 15:37
 * #Motto:人间荒唐市侩 不如山中作怪.
 */

public class LFSR {
     
    public static void main(String[] args) {
     
        System.out.println("请输入线性反馈移位寄存器的初始状态(7位二进制):");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();

        //打印输出序列的第一位
        StringBuffer stringBuffer = new StringBuffer(s);
        String substring3 = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
        System.out.println("输出位是:"+substring3);
        System.out.println("序列开始");

        int num = 0;
        while (true) {
     
            num++;
            //截取出s0和s1
            String substring = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
            String substring1 = stringBuffer.substring(stringBuffer.length() - 2, stringBuffer.length() - 1);
            int i1 = Integer.parseInt(substring);
            int i2 = Integer.parseInt(substring1);
            //s0和s1进行异或
            int i = i1 ^ i2;
            //移除旧s0
            StringBuffer delete = stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
            //将异或的值给s6
            StringBuffer insert = stringBuffer.insert(0, i);
            //打印新序列
            System.out.print(stringBuffer+"    输出位是:");
            //打印输出位
            String substring2 = insert.substring(insert.length() - 1, insert.length());
            System.out.println(substring2);

            //结束条件
            String s1 = new String(insert);
            if (s1.equals(s)) {
     
                System.out.println("周期是:" + num);
                break;
            }
        }

        /**
         * 加密
         */
        System.out.println("请输入你想要加密的内容:");
        Scanner scanner1 = new Scanner(System.in);
        String s1 = scanner1.nextLine();
        //将字符串的内容存进字符数组
        char[] chars = s1.toCharArray();
        String s2 = "";
        String[] strings = new String[s1.length()];
        for (int i = 0; i < chars.length; i++) {
     
            //将字符数字存的字母转换成二进制
            s2 = Integer.toBinaryString(chars[i]);
            //将二进制数存入一个String数组
            strings[i] = s2;
        }

        //定义字符串,逐比特异或后用来拼串
        String s3 = "";
        //定义String数组,用来存加密好的串
        String[] strings1 = new String[s1.length()];
        //遍历String数组,取出每个字母所对应的二进制数
        for (int i = 0; i < strings.length; i++) {
     
            String substring2 = s1.substring(i, i + 1);
            System.out.print(substring2 + ":");
            for (int j = 0; j < strings[i].length(); j++) {
     
                //截取数字,进行逐比特加密
                String substring = strings[i].substring(j, j + 1);
                int i1 = Integer.parseInt(substring);

                String substring1 = s.substring(j, j + 1);
                int i2 = Integer.parseInt(substring1);
                System.out.print(i1 ^ i2);

                s3 += (i1 ^ i2) + "";
            }
            //存储拼好的串
            strings1[i] = s3;
            s3 = "";
            System.out.println();
        }

        /**
         * 解密
         */
        String s4 = "";
        //存解密好的串
        String[] strings2 = new String[s1.length()];
        for (int i = 0; i < strings1.length; i++) {
     
            for (int j = 0; j < strings1[i].length(); j++) {
     
                String substring = strings1[i].substring(j, j + 1);
                int i1 = Integer.parseInt(substring);

                String substring1 = s.substring(j, j + 1);
                int i2 = Integer.parseInt(substring1);
                s4 += (i1 ^ i2);
            }
            strings2[i] = s4;
            s4 = "";
        }

        System.out.println("明文是:");
        for (String s5 : strings2) {
     
            int i = Integer.parseInt(s5, 2);
            char c = (char) i;
            System.out.println(s5+":"+c);
        }

    }
}

输出结果:

请输入线性反馈移位寄存器的初始状态(7位二进制)1101011
输出位是:1
序列开始
0110101    输出位是:1
1011010    输出位是:0
1101101    输出位是:1
1110110    输出位是:0
1111011    输出位是:1
0111101    输出位是:1
1011110    输出位是:0
1101111    输出位是:1
0110111    输出位是:1
0011011    输出位是:1
0001101    输出位是:1
1000110    输出位是:0
1100011    输出位是:1
0110001    输出位是:1
1011000    输出位是:0
0101100    输出位是:0
0010110    输出位是:0
1001011    输出位是:1
0100101    输出位是:1
1010010    输出位是:0
1101001    输出位是:1
1110100    输出位是:0
0111010    输出位是:0
1011101    输出位是:1
1101110    输出位是:0
1110111    输出位是:1
0111011    输出位是:1
0011101    输出位是:1
1001110    输出位是:0
1100111    输出位是:1
0110011    输出位是:1
0011001    输出位是:1
1001100    输出位是:0
0100110    输出位是:0
1010011    输出位是:1
0101001    输出位是:1
1010100    输出位是:0
0101010    输出位是:0
1010101    输出位是:1
1101010    输出位是:0
1110101    输出位是:1
1111010    输出位是:0
1111101    输出位是:1
1111110    输出位是:0
1111111    输出位是:1
0111111    输出位是:1
0011111    输出位是:1
0001111    输出位是:1
0000111    输出位是:1
0000011    输出位是:1
0000001    输出位是:1
1000000    输出位是:0
0100000    输出位是:0
0010000    输出位是:0
0001000    输出位是:0
0000100    输出位是:0
0000010    输出位是:0
1000001    输出位是:1
1100000    输出位是:0
0110000    输出位是:0
0011000    输出位是:0
0001100    输出位是:0
0000110    输出位是:0
1000011    输出位是:1
0100001    输出位是:1
1010000    输出位是:0
0101000    输出位是:0
0010100    输出位是:0
0001010    输出位是:0
1000101    输出位是:1
1100010    输出位是:0
1110001    输出位是:1
1111000    输出位是:0
0111100    输出位是:0
0011110    输出位是:0
1001111    输出位是:1
0100111    输出位是:1
0010011    输出位是:1
0001001    输出位是:1
1000100    输出位是:0
0100010    输出位是:0
1010001    输出位是:1
1101000    输出位是:0
0110100    输出位是:0
0011010    输出位是:0
1001101    输出位是:1
1100110    输出位是:0
1110011    输出位是:1
0111001    输出位是:1
1011100    输出位是:0
0101110    输出位是:0
1010111    输出位是:1
0101011    输出位是:1
0010101    输出位是:1
1001010    输出位是:0
1100101    输出位是:1
1110010    输出位是:0
1111001    输出位是:1
1111100    输出位是:0
0111110    输出位是:0
1011111    输出位是:1
0101111    输出位是:1
0010111    输出位是:1
0001011    输出位是:1
0000101    输出位是:1
1000010    输出位是:0
1100001    输出位是:1
1110000    输出位是:0
0111000    输出位是:0
0011100    输出位是:0
0001110    输出位是:0
1000111    输出位是:1
0100011    输出位是:1
0010001    输出位是:1
1001000    输出位是:0
0100100    输出位是:0
0010010    输出位是:0
1001001    输出位是:1
1100100    输出位是:0
0110010    输出位是:0
1011001    输出位是:1
1101100    输出位是:0
0110110    输出位是:0
1011011    输出位是:1
0101101    输出位是:1
1010110    输出位是:0
1101011    输出位是:1
周期是:127
请输入你想要加密的内容:
caizixin0424
c:0001000
a:0001010
i:0000010
z:0010001
i:0000010
x:0010011
i:0000010
n:0000101
0:000101
4:000001
2:000111
4:000001
明文是:
1100011:c
1100001:a
1101001:i
1111010:z
1101001:i
1111000:x
1101001:i
1101110:n
110000:0
110100:4
110010:2
110100:4

2.p = 1 + x^2 + x^5 + x^7

package czx.xupt.lfsr;

import java.util.Scanner;

/**
 * #Author:槐序二四
 * #Time:2019/12/25 16:46
 * #Motto:人间荒唐市侩 不如山中作怪.
 */

public class LFSR2 {
     
    public static void main(String[] args) {
     
        System.out.println("请输入线性反馈移位寄存器的初始状态(7位二进制):");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();

        //打印输出序列的第一位
        StringBuffer stringBuffer = new StringBuffer(s);
        String substring3 = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
        System.out.println("输出位是:" + substring3);
        System.out.println("序列开始");

        int num = 0;
        while (true) {
     
            num++;
            //截取出s0
            String substring = stringBuffer.substring(stringBuffer.length() - 1, stringBuffer.length());
            //截取s2
            String substring1 = stringBuffer.substring(stringBuffer.length() - 3, stringBuffer.length() - 2);
            //截取s5
            String substring4 = stringBuffer.substring(stringBuffer.length() - 6, stringBuffer.length() - 5);
            int i1 = Integer.parseInt(substring);
            int i2 = Integer.parseInt(substring1);
            int i3 = Integer.parseInt(substring4);
            //s0和s1进行异或
            int i = i1 ^ i2 ^ i3;
            //移除旧s0
            StringBuffer delete = stringBuffer.delete(stringBuffer.length() - 1, stringBuffer.length());
            //将异或的值给s6
            StringBuffer insert = stringBuffer.insert(0, i);
            //打印新序列
            System.out.print(stringBuffer + "    输出位是:");
            //打印输出位
            String substring2 = insert.substring(insert.length() - 1, insert.length());
            System.out.println(substring2);

            //结束条件
            String s1 = new String(insert);
            if (s1.equals(s)) {
     
                System.out.println("周期是:" + num);
                break;
            }
        }

        /**
         * 加密
         */
        System.out.println("请输入你想要加密的内容:");
        Scanner scanner1 = new Scanner(System.in);
        String s1 = scanner1.nextLine();
        //将字符串的内容存进字符数组
        char[] chars = s1.toCharArray();
        String s2 = "";
        String[] strings = new String[s1.length()];
        for (int i = 0; i < chars.length; i++) {
     
            //将字符数字存的字母转换成二进制
            s2 = Integer.toBinaryString(chars[i]);
            //将二进制数存入一个String数组
            strings[i] = s2;
        }

        //定义字符串,逐比特异或后用来拼串
        String s3 = "";
        //定义String数组,用来存加密好的串
        String[] strings1 = new String[s1.length()];
        //遍历String数组,取出每个字母所对应的二进制数
        for (int i = 0; i < strings.length; i++) {
     
            String substring2 = s1.substring(i, i + 1);
            System.out.print(substring2 + ":");
            for (int j = 0; j < strings[i].length(); j++) {
     
                //截取数字,进行逐比特加密
                String substring = strings[i].substring(j, j + 1);
                int i1 = Integer.parseInt(substring);

                String substring1 = s.substring(j, j + 1);
                int i2 = Integer.parseInt(substring1);
                System.out.print(i1 ^ i2);

                s3 += (i1 ^ i2) + "";
            }
            //存储拼好的串
            strings1[i] = s3;
            s3 = "";
            System.out.println();
        }

        /**
         * 解密
         */
        String s4 = "";
        //存解密好的串
        String[] strings2 = new String[s1.length()];
        for (int i = 0; i < strings1.length; i++) {
     
            for (int j = 0; j < strings1[i].length(); j++) {
     
                String substring = strings1[i].substring(j, j + 1);
                int i1 = Integer.parseInt(substring);

                String substring1 = s.substring(j, j + 1);
                int i2 = Integer.parseInt(substring1);
                s4 += (i1 ^ i2);
            }
            strings2[i] = s4;
            s4 = "";
        }

        System.out.println("明文是:");
        for (String s5 : strings2) {
     
            int i = Integer.parseInt(s5, 2);
            char c = (char) i;
            System.out.println(s5 + ":" + c);
        }

    }
}

输出结果:

请输入线性反馈移位寄存器的初始状态(7位二进制)1101011
输出位是:1
序列开始
0110101    输出位是:1
1011010    输出位是:0
0101101    输出位是:1
1010110    输出位是:0
1101011    输出位是:1
周期是:5
请输入你想要加密的内容:
caizixin0424
c:0001000
a:0001010
i:0000010
z:0010001
i:0000010
x:0010011
i:0000010
n:0000101
0:000101
4:000001
2:000111
4:000001
明文是:
1100011:c
1100001:a
1101001:i
1111010:z
1101001:i
1111000:x
1101001:i
1101110:n
110000:0
110100:4
110010:2
110100:4

你可能感兴趣的:(信息安全实验,信息安全,密码学)