合肥工业大学
计算机与信息学院
    程: 密码学实验
专业班级:
    号:
    名:


实验一
一、实验题目
祖冲之加密解密
二、实验要求
使用java实现祖冲之算法,根据对祖冲之算法的介绍,自己创建明文信息,编写祖冲之算法的实现程序
   
三、算法描述
祖冲之算法逻辑上分为上中下三层,见图1。上层是16级线性反馈移位寄存器(LFSR);中层是比特重组(BR);下层是非线性函数F。
图 1  祖冲之算法结构图
四、算法设计
1. 线性反馈移位寄存器LFSR
1.1 概述
LFSR包括16个31比特寄存器单元变量s0, s1, …, s15
LFSR的运行模式有2种:初始化模式和工作模式。
1.2 初始化模式
在初始化模式下,LFSR接收一个31比特字uu是由非线性函数F的32比特输出W通过舍弃最低位比特得到,即u=W >> 1。在初始化模式下,LFSR计算过程如下:
LFSRWithInitialisationMode(u)
{
(1)v = 215 s15 +217 s13 + 221 s10 + 220 s4 + (1 + 28)s0 mod (231-1);
(2)s16=(v+u) mod (231-1);
(3)如果s16=0,则置s16=231-1;
(4)(s1, s2, …, s15, s16)  (s0, s1, …, s14, s15)。
}
public static void LFSRWithInitialisationMode(int u,int[] LFSR_S)
    {
        int f, v;
       
        f = LFSR_S[0];
        v = MulByPow2(LFSR_S[0], 8);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[4], 20);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[10], 21);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[13], 17);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[15], 15);
        f = AddM(f, v);
       
        f = AddM(f, u);
        /* update the state 更新寄存器状态 */
        for (int i = 0; i < LFSR_S.length-1; i++) {
            LFSR_S[i] = LFSR_S[i+1];
正则化一个5 5随机矩阵
        }
       
        LFSR_S[15]=f;
        if (LFSR_S[15] == 0)
        {
            LFSR_S[15] = 0x7FFFFFFF;
        }
    }
1.3 工作模式
在工作模式下,LFSR不接收任何输入。其计算过程如下:
LFSRWithWorkMode()
{
(1)s16 = 215 s15 +217 s13 + 221 s10 + 220 s4 + (1 + 28)s0 mod (231-1);
(2)如果s16=0,则置s16=231-1;
(3)(s1, s2, …, s15, s16)  (s0, s1, …, s14, s15)。
}
public static void LFSRWithWorkMode(int[] LFSR_S)
    {
        int f, v;
       
        f = LFSR_S[0];
        v = MulByPow2(LFSR_S[0], 8);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[4], 20);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[10], 21);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[13], 17);
        f = AddM(f, v);
       
        v = MulByPow2(LFSR_S[15], 15);
        f = AddM(f, v);
       
        //更新寄存器状态
        for (int i = 0; i < LFSR_S.length-1; i++) {
            LFSR_S[i]=LFSR_S[i+1];
        }
        LFSR_S[15] = f;
    }
2.比特重组BR
比特重组从LFSR的寄存器单元中抽取128比特组成4个32比特字X0X1X2X3。BR的具体计算过程如下:
BitReconstruction()
{
(1)X0 = s15Hs14L
(2)X1 = s11Ls9H
(3)X2 = s7Ls5H
(4)X3 = s2Ls0H
}
BRC_X[0] = ((LFSR_S[15] & 0x7FFF8000) << 1) | (LFSR_S[14] & 0xFFFF);
BRC_X[1] = ((LFSR_S[11] & 0xFFFF) << 16) | (LFSR_S[9] >> 15);
BRC_X[2] = ((LFSR_S[7] & 0xFFFF) << 16) | (LFSR_S[5] >> 15);
BRC_X[3] = ((LFSR_S[2] & 0xFFFF) << 16) | (LFSR_S[0] >> 15);
3.非线性函数F
F包含2个32比特记忆单元变量R1R2
F的输入为3个32比特字X0X1X2,输出为一个32比特字W。F的计算过程如下:
F (X0, X1, X2)
{
(1)W = (X0  R1) R2
(2)W1 = R1 X1
(3)W2 = R2X2
(4)R1 = S(L1(W1LW2H));
(5)R2 = S(L2(W2LW1H))。
}
其中S为32比特的S盒变换,定义在附录A中给出;L1L2为32比特线性变换,定义如下:
L1(X) = X  (X <<< 2)  (X <<< 10)  (X <<< 18)  (X <<< 24),
L2(X) = X  (X <<< 8)  (X <<< 14)  (X <<< 22)  (X <<< 30)。
W = (BRC_X[0] ^ F_R[0]) + F_R[1];
        W1 = F_R[0] + BRC_X[1];
        W2 = F_R[1] ^ BRC_X[2];
        u = L1(((W1 << 16)&0xFFFF0000) | ((W2 >> 16)&0xFFFF));//将32位的W1和W2的高、低16位重组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。