密码学笔记

分组密码

概述

定义

分组密码将明文消息编码表示后的二进制序列划分成固定大小的块, 每块分别在密钥的控制下变换成等长的二进制密文。

要求

分组密码设计时应该满足以下要求

  • 分组长度足够长,以防止明文穷举攻击
  • 密钥长度要适宜,不能过长也不能过短。过长不利于管理,过短容易受到密钥穷举攻击
  • 置换算法应足够复杂
  • 加密和解密运算简单,易于实现
  • 明文和密文长度相同

设计原则

  • 扩散

扩散是指密文中的任一比特都要和明文与密钥的每一比特相关联。
以p1、p2表示明文,c1、c2表示密文,则:

/*** 无扩散技术的加密算法 ***/
p1: 00000000
c1: xxxxx001// p1加密之后
	
p2: 00000001// p2加密之后
c2: xxxxx011

/*** 有扩散技术的加密算法 ***/
p1: 00000000
c1: 01011101// p1加密之后
	
p2: 00000001
c2: 11101011// p2加密之后
  • 混乱

混乱是指加密变换中明文、密钥以及密文之间的关系要尽可能的复杂,防止破译攻击。同时要求达到混乱目的的操作要可逆,即明文混乱之后能得到密文。

  • 乘积密码体制

乘积密码体制可以理解为一种由多个具有混乱和扩散特征的操作**迭代**作用于明文的密码体制,迭代次数越多,密码分析越困难.

几种迭代机构

Feistel网络

基本结构

以F表示轮函数,$K_0$,$K_1$……代表第1,2,…n+1轮的子密钥。基本加密流程如下:

  1. 将明文分为两块 $(L_0,R_0)$
  2. 对每一轮,$i=0,1…,n$
    $L_{i+1} = R_i$
    $R_{i+1}=L_i \oplus F(R_i,K_i)$
  3. 加密后的密文为$(R_{n+1},L_{n+1})$

基本解密流程如下:

  1. 对于密文$(R_{n+1},L_{n+1})$,每一轮,i=n,n-1…0
    $R_i = L_{i+1}$
    $L_i = R_{i+1} \oplus F(L_{i+1},K_i)$
  2. 得出密文$(L_0,R_0)$

    雪崩效应

    输入即使只有很小的变化,也会导致输出产生巨大变化.假设轮函数的输入最右边1比特变化,至少影响轮函数输出2比特变化。

    非平衡的Feistel密码

    在Feistel原来的基础上修改,$L_0$和$R_0$为长度不等的明文块。
    Throp shuffle就是一种不平衡的Feistel结构密码,分块的一边只有一比特。

    声明

    我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=jxu63zaqr8i1

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!