密码学实验2

接口函数

AES:

1
2
void Crypt_Enc_Block(unsigned char *input,int in_len,unsigned char
*output,int *out_len, unsigned char *key,int keylen);

AES加密过程涉及4种操作:

字节替代(SubBytes)

行移位(ShiftRows)

列混淆(MixColumns)

轮密钥加(AddRoundKey)

通用的序列密码RC4

1
2
void RC4(unsigned char *input,int in_len,unsigned char *output,int
*out_len,unsigned char *key,int keylen);
  • RonRivest设计。密钥长度可变
  • 状态:256个bytes
    – State[256]=[0,1,2,…,255]
  • 密钥:40至2048比特可变
  • 初始化算法和伪随机子密钥生成算法

RC4于1987年提出,和DES算法一样,是一种对称加密算法,也就是说使用的密钥为单钥(或称为私钥)。但不同于DES的是,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密

RC4算法的特点是算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节(8-2048比特),在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围任然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。

在介绍RC4算法原理之前,先看看算法中的几个关键变量:

  • 密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节
  • 状态向量S:长度为256,S[0],S[1]…..S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
  • 临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
  • 密钥K:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系,通常密钥的长度取为16字节(128比特)。

RC4的原理分为三步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[ i mod keylen ];
2、初始排列S
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);
3、产生密钥流
i,j=0;
for r=0 to len do //r为明文长度,r字节
i=(i+1) mod 256;
j=(j+S[i])mod 256;
swap(S[i],S[j]);
t=(S[i]+S[j])mod 256;
k[r]=S[t];

SM3:

1
2
void SM3(unsigned char *InMessage,int MessageLen,unsigned char *OutDigest,
int *DigestLen);
  1. 寻找SM3的高56比特的碰撞.(提交源程序和碰撞消息对)
打赏