admin管理员组

文章数量:1530845

2024年4月23日发(作者:)

密码学报

ISSN

2095-7025

CN

10-1195/TN

Journal

of

Cryptologic

Research,

2020,

7(6):

799-811

©

《密码学报

编辑部版权所有.

E-mail:

***************.cn

http:/

/

Tel/Fax:

+86-10-82789618

SM4

算法快速软件实现

*

张觌气

I

华气张习肚王肌刘建伟

3

1.

北京航空航天大学软件开发环境国家重点实验室

北京

100191

2.

密码科学技术国家重点实验室

北京

100878

3.

北京航空航天大学空天网络安全工业与信息化部重点实验室

北京

100191

4.

北京卫星信息工程研究所

北京

100086

通信作者

郭华

E-mail:

*************.cn;

张习勇

E-mail:

************************

摘要

SM4

是对称分组密码国家标准•加解密计算效率是衡量算法实现性能的重要指标

而目前关于

SM4

软件实现方法方面的研究不多.利用比特切片技术

结合支持单指令多数据

(

SIMD)

AVX2

指令

集,

本文提出了一种

SM4

算法的快速软件优化实现方法

使用

256

位的

YMM

奇存器实现了

SM4

算法

256

分组数据并行加解密.首先基于已有的选择函数构造了新的选择函数

之后改进了搜索算法

基于

新的选择函数和改进的搜索算法化简了

S

盒的逻辑表达式

,将实现逻辑表达式所需的逻辑门电路数量由

3000(

最简与或式)降至

497.

Intel

Core

I7-7700HQ

(Kabylake)

@2.80

GHz

处理器上

实现速度达到

2580

Mbps,

同公开文献中的最好结果

1795

Mbps

(Intel

Core

i7-5500U

(Broadwell-U)

@2.40

GHz)

相比

实现效率提高了

43%.

基于比特切片技术的软件实现优化方法无需内存或高速缓存查表

因此该方

法可抵抗缓存-计时侧信道攻击

,从而安全性得到了提升.本文提出的优化方法具有可扩展性,

不仅适用于

X86

平台上借助拓展指令集

AVX2

实现

还可利用

RISC

指令集在资源受限

安全性要求高的

ARM

等嵌入式平台上实现.此外

新的选择函数和搜索算法具有通用性

,可用于其它一般逻辑函数的化简.

关键词

SM4

算法

软件优化实现

比特切片

SIMD

技术

中图分类号

TP309.7

文献标识码

A

DOI:

10.13868力

..000407

中文引用格式

张笑从

郭华

张习勇

王闯

刘建伟.

SM4

算法快速软件实现

[J].

密码学报

2020,

7(6):

799-811.

[D0I

10.13868

/.000407]

英文引用格式:

ZHANG

X

C,

GUO

H,

ZHANG

X

Y,

WANG

C,

LIU J

W.

Fast

software

implementation

of

SM4[J].

Journal

of

Cryptologic

Research,

2020,

7(6):

799-811.

[DOI:

10.13868

/.

000407]

Fast

Software

Implementation

of

SM4

ZHANG

Xiao-Cong

b3

,

GUO

Hua

b2

,

ZHANG

Xi-Yong

4

,

WANG

Chuang

1

,

LIU

Jian-Wei

3

1.

State

Key

Laboratory

of

Software

Development

Environment,

Beihang

University,

Beijing

100191,

China

2.

State

Key

Laboratory

of

Cryptology,

Beijing

100878,

China

*

基金项目:

北京市自然科学基金

(4202037);

CCF-

腾讯科研基金

(CCF-Tencent

RAGR20200123);

国家重点研发计划

(2017YFB1400700);

科学研究与研究生培养共建项目(

JD100060630);

国家级大学生创新创业训练计划

(2,

2)

Foundation:

Natural

Science

Foundation

of

Beijing

Municipality

(4202037);

CCF-Tencent

Open

Fund

(CCF-Tencent

RAGR

20200123);

National

Key

Research

and

Development

Program

of

China

(2017YFB1400700);

Co-Funding

Project

of

Beijing

Municipal

Education

Commission

for

Scientific

Research

and

Graduates

Training

(JD

100060630);

National

Students

1

Innovation

and

Entrepreneurship

Training

Program

(2,

2)

收稿日期

2019-11-13

定稿日期

2020-01-13

800

Journal

of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

3. Key

Laboratory

of

Aerospace

Network

Security

(Ministry

of

Industry

and

Information

Technology),

Beihang

University,

Beijing

100191,

China

4.

Beijing

Institute

of

Satellite

Information

Engineering,

Beijing

100086,

China

Corresponding

author:

GUO

Hua,

E-mail:

*************.cn

;

ZHANG

Xi-Yong,

E-mail:

xiyongzhang@hotm-

Abstract:

The SM4

algoiithm

is

China's

national

standard

of

symmetric

block

cipher,

and

its

effi

­

ciency

is

one

of

the

most

important

features.

So

far,

insufficient

work

has

been

done

on

fast

software

implementation

of

SM4

algorithm.

Exploiting

bit-slicing

technique

and

SIMD

(single

instruction

mul

­

tiple

data)

instruction

set

AVX2,

this

paper

presents

a

fast

implementation

of

SM4

algorithm

which

can

process

256

blocks

in

parallel

via

256

bits

YMM

registers.

Firstly,

a

new

selection

function

is

constructed

based

on

existing

ones.

Then,

the

logic

circuit

generating

algorithm

corresponding

to

the

selection

function

is

improved.

Furthermore,

the

number

of

gates

of

the

S

box

is

reduced

from

3000

to

497.

Using

an

Intel

Core

i7-7700HQ(Kabylake)@2.80

GHz

processor,

the

software

performance

is

2580

Mbps,

43%

ahead

of

SM4's

benchmark

on

software

implementation

which

is

1795

Mbps

(Intel

Core

i7-5500U

(Broadwell-U)

@2.40

GHz).

Bit-sliced

implementation

does

not

require

to

store

a

table

in

memory

or

in

cache,

hence

it

is

immune

to

side

channel

attacks

such

as

cache

attack

and

timing

attack.

The

improved

method

presented

in

this

paper

can

be

implemented

on

various

computing

platforms,

which

means

that

it

is

suitable

to

X86

architecture

with

extended

instruction

set

AVX2,

and

is

also

suitable

to

embedded

systems

with

RISC

instructions

and

limited

resource.

Note

that

the

improved

selection

function

and

the

improved

logic

circuit

generating

algorithm

are

a

generic

approach,

which

can

be

used

to

the

reduction

of

general

logical

functions.

Key

words:

SM4;

software

implementation

:

bit

slicing;

SIMD

1

引言

SM4

分组密码算法⑴是我国自主设计的对称分组密码

,为众多信息系统提供安全、

完整的数据加密

方案.

SM4

算法的高效软件实现为我国应用在安全产品(如

IPSec

VPN

SSL

TLS

等)上的密码算法由

国际标准替换为国家标准提供了强有力的支撑

SM4

算法广泛用于政府办公

公安

银行

税务

电力

等自主可控要求高的信息系统提供了可靠的保障.目前关于

SM4

算法的软件优化实现方面的相关工作不

多使用查表的方法何

但由于代替表规模相对较大

CPU

在做查表操作时

表中数据在内存和

cache

之间频繁对换导致查表延时较大

且不利于高效并行加

/

解密多组消息.此外

查表法无法抵抗缓存-计时侧

信道攻击

因此在一定程度上制约了

SM4

的软件实现性能和安全性.

1996

Intel

推出单指令多数据的

SSE

(Streaming

SIMD

Extensions)

指令集后

Biham

同于

1997

年提出一种新的对称分组密码快速软件实现方法

核心思想是将处理器视为以

1

比特为单位的单指令多

数据处理器

,随后被

Matthew

Kwan

称为比特切片

(bit

slicing)⑷

.

比特切片方法在

64

位平台上实现了

64

DES

消息的并行加解密

将逻辑门个数从理论上需要的

132

个每比特输出优化到

10()

个每比特输

岀.之后研究者们对门函数个数进一步进行了优化

使得标准逻辑门(与

异或)和非标准逻辑门

均达到了平均

50+

个每比特输出.

2011

Roman

Rusakov

同又将门函数的个数降至平均

44

个逻辑门

每比特输岀.比特切片方法可大大提高实现效率

也可用于搜索密钥

,对

RISC

CISC

的指令集平台均

适用

且具有更好的安全性.

为了提高软件实现速度

,国内外许多学者尝试将采用

SIMD

(Single

Instruction

Multiple

Dada,

指令多数据)技术用于密码算法的软件实现.

A.

Adomnicai

T.

Peyrin

何给出改进的比特切片方法

Fixslicing

ARM

RISC-V

平台实现了

AES.

2012

Intel

推出高级向量指令集

(Advanced

Vector

Extensions,AVX)

众多学者开始研究如何利用

AVX

指令集加速对称分组密码算法的实现速度

尤其

是轻量级密码算法的实现速度.

Seiichi

Matsuda

Shiho

Moriai

利用

AVX

指令集加速切片实现

张笑从等:

SM4

算法快速软件实现

801

出了轻量级密码算法面向云端的实现

SSE

指令与比特切片方法结合并应用到

PRESENT/Piccolo,

使

两者的实现吞吐量分别达到

4.3

cycle/byte

4.57

cycle/byte.

2013

年,

Neves

Aumasson

同将

AVX2

指令应用到

SHA-3

候选算法

BLAKE

上并提高了其实现性能.最近

郎欢等何利用

X86

架构下的

SIMD

指令给出了高效的

SM4

实现

他们釆用

C

语言调用

AVX2

指令接口方式实现

在并行查表的基础上

出了两种不同的方法.

2014

Kostas

Papapagiannopoulos

等人口°

将比特切片方法修改为

nibble

切片

方法

并减少了访问内存

AVR

处理器上给出了高效实现.

此外

研究者们将比特切片方法和其它方法结合

SM4

算法进行软件实现

也取得了较好的效果.

SM4

算法公布不久

Fen

Liu

切破解了

SM4

算法

S

盒的结构

公布了

S

盒的代数表达式及具体参数

值.之后,

Hao

Liang

等问基于已破解的

SM4

S

盒结构

提出了基于复合域的

SM4

实现方法

S

盒的有限域求逆运算变换到复合域中实现

并在

FPGA

上进行验证

.

Jingbin

Zhang

等问提出了

SM4

在复合域中的软件实现

使用

X86

架构普通指令实现

速率达到

20

Mbps.

最近

A.

Eldosouky

W.

Saad")

针对物联网应用的效率

安全需求改进了轻量级密码算法

LED

的比特切片方法

并在嵌入式处

理器

ARM

Cortex-A53

进行了实现验证.

O.

Hajihassani

1151

利用比特切片方法进一步提高了高级加

密算法

AES

的加解密吞吐率.总的来说

,在国密标准

SM4

算法的软件优化实现方法取得了一些进展

和其他对称加密算法如

AES

相比

SM4

的软件优化实现仍需进一步研究.

本文利用比特切片方法

结合支持单指令多数据

(

SIMD)

AVX2

指令集

提出了一种

SM4

算法的

快速软件优化实现方法

使用

256

位的

YMM

寄存器实现了

SM4

算法的

256

分组数据并行加解密.该

方法首先对待加密的明文消息通过

SIMD

版本的数据编排算法进行预处理

之后提出了一种改进的化简

逻辑表达式的新方法

将实现逻辑表达式所需的逻辑门电路数量由

3000

降至

497;

最后使用反编排算法

得到密文.在

Intel

Core

i7-7700HQ(Kabylake)@2.80

GHz

处理器上

结合

x86

平台拓展指令集

AVX2

和上述方法对

SM4

算法进行软件实现

实现速度达到了

2580

Mbps.

相比于传统的查表实现

(Intel

Core

i7-5500U

(Broadwell-U)

@2.40

GHz)

未优化的比特切片实现

(Intel

Core

i7-5500U

(Broadwell-U)

@2.40

GHz)

SM4

软件优化实现公开文献的最佳结果

[9]

(Intel

Core

i7-550()U

(Broadwell-U)

@2.40

GHz),

方法的实现效率分别提升了

1.8

2.6

倍和

43%.

综上所述

本文主要贡献如下

(1)

提出了一种通用的对称分组密码算法的软件优化实现方法

该方法通用于所有对称加密算法的快

速软件实现.

(2)

提出的基于比特切片的软件优化实现方法无需内存或高速缓存查表

因此可抵抗缓存-计时侧信

道攻击

"1,

从而安全性得到了提升.

(3)

提出的优化方法具有较强的通用性.该方法可用于所有对称加密算法的软件优化实现

并适用于

不同的软件架构

CISC

架构平台如

X86

适合借助

SSE

AVX2

AVX512

等拓展指令集实

RISC

架构

(

ARM,RISC-V)

的平台可使用普通指令集实现.

(4)

新的选择函数和搜索算法具有通用性

可用于一般逻辑函数的化简.

本文其余内容组织如下

2

节介绍

SM4

算法及

AVX2

指令

3

节介绍新的选择函数及基于选择

函数的改进的搜索算法

4

节介绍

SM4

的基于比特切片和

AVX

指令的软件优化实现方法

;第

5

节介

绍实验结果

;第

6

节总结全文.

2

预备知识

2.1

SM4

简介

SM4

算法釆用非平衡

Feistel

结构

"1,

分组长度和密钥长度各为

128

比特

解密算法与加密算法结

构相同

区别在于轮密钥使用顺序相反.下面首先介绍

SM4

的轮函数.

设明文输入为

(Xo,X

X2,X3

)

6

(Z

)4,

密文输出为

(

Yo,m,

(Z

跻丫,

轮密钥为

rk

6

Zf

2

,

1

=

0,1,

••-

,31.

SM4

加密算法的轮函数

F

如图

1

所示.

轮函数

F

每次迭代的输入为

(

Xi,X,+

l,X

+2,X<+3

)

,

输出为

(

X,

+

l,X,+2,X;+3,

+4

)

,

尢+

4

的计

算方法如下

802

Journal

of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

X

+4

=

F(Xi,

Xi+i,

Xi+2,

X

+3

)

=

X

+

T(Xi+i

+

Xi+2

+

X+3

+

rki)

其中

rk.

为当前迭代的轮密钥

T

为一个

Z/2

t

Zf

的可逆变换.

T

为一个

Zf

t

Z

舁的可逆变换

由非线性变换

T

和线性变换

L

复合而成

T(

)=

L(r(-)).

非线性变换

t

4

个并行的

S

盒构成.设输入为

A

=

(ao,ai,a2,a3

)

(Z®)

4

,

输出为

B

=

(feo,&i,

&

2,

&

3

)

(Z

)4,

I

(6

()

,

bi,

&3

)

=

r(A)

=

(Sbox(ao),

Sbox(ai),

Sbox(a2

)

,

Sbox@3

)

)

对于每个

S

盒的

8

位输入

4

位作为行

,后

4

位作为列

输岀即为查找表中对应行列所对应的值.

S

如图

2

所示.

9

D

6

2

B

9

C

E

4

4

7

6

8

1

E

D

4

A

E

E

O

1

D

D

5

8

D

O

A

8

9

1

8

9O

67

42

B3

O7

6B

24

OO

BF

AE

F6

DB

1B

C1

69

FO

E9

9A

5O

1C

A7

81

OE

46

8A

5D

E2

37

AF

31

97

7D

FE

7

6

F

4

A

9

F

C

B

2

5

E

5

7

D

2

A4

2E

45

92

88

4A

EC

C

C

2

A

9

1

C

9

F

3

7

1

3

6

9

F

O

4

9

B

8

2

D

E

B

B

A

5

O

C

3

A

E

1

B

E

E

F

O

8

7

3

6

4

58

D3

C7

34

66

FD

DD

CD

96

DQ

3

O

9

E

1

D

D

2

3

1

C

8

B

7

7

4

D

4

8

8

7

A

1

7

8

A

A

E

C

B

7

D

B

C

7

9

B

8

7

3

A

5

A

B

2

2

5

5

O

F

F

D

E

O

16

AA

3

3

8

O

8

3

F

8

2

5

4

C

A

3

A

D

C

O

O

3

1

1

2

D

6

5

7

9

B

6

4

4

5

4

D

F

5

9

E

B

2

2

3

6

F

7

9

3

2

9

F

F

D

9

7

4

B

9

E

E

A

B

C2

26

43

FA

19

4B

3B

E7

CE

3O

AB

72

41

12

O9

3E

C

28

49

ED

75

E6

7O

O1

AO

F9

F5

OD

6D

1F

B8

C5

D7

D

FB

86

CF

8F

85

56

21

C4

61

8C

53

6C

1O

E5

6E

CB

2C

O6

AC

3F

4F

9D

78

C8

15

B1

4E

5B

5A

B4

C6

39

O5

99

62

A6

A8

35

87

9E

A1

E3

6F

51

D8

BO

84

48

A.

5

B

5

6

2

7

B

7

2

9

4

3

c

o

F

7

C

o2

F2

32

3

6

A

5

c

D

o

F

1

5

F

图1

SM4

轮函数

Figure

1

Round

function

in

SM4

algorithm

2

SM4

代替表

Figure

2

Substitution

table

in

SM4

algorithm

L

是线性变换

非线性变换丁的输出是线性变换

L

的输入.设输入为

B

t

Z

沪,

输出为

C

t

Z

C

=

L(B)

=

B

+

(£«2)

+

«

10)

+

«

18)

+

«

24)

其中

代表循环左移

E

«

2

代表循环左移

2

位.

2.2

SIMD

技术及

AVX2

指令集

SIMD

(single

instruction

multiple

data)

技术可实现同一操作并行处理多组数据.目前支持

SIMD

技术的处理器厂商主要有

Intel.

AMD

ARM

等.目前大多数

PC

及服务器采用的是

Intel

处理器

Intel

处理器中的

SSE/AVX

指令集采用的正是

SIMD

技术.

AVX

(Advanced

Vector

Extensions)

指令

1181

256-bit

宽向量指令集

指令操作对象称为

YMM

256-bit

SIMD

寄存器.该寄存器内容分为

2

128-bit

lane.

AVX

指令操作对象为

lanes,

该指令不支持跨越

lanes

的操作.

AVX2

指令集是

AVX

指令集的扩展和改进

也称为

Haswell

New

Instructions,

支持跨越

lanes

的操

作.

AVX2

支持

8

32-bit

整数异或

(vpxor)

移位

(vpslld),

置换

(vpermd)

查表

(vpgatherdd)

等.

2013

Inter

22

nm

Haswell

微架构处理器上正式推出

AVX2

指令集.表

1

给出了部分

AVX2

指令,

这些指令可用于对称分组密码的切片实现.

3

构造新的选择函数及搜索算法

选择函数

119

Mattew

为比特切片方法中简化实现

S

盒逻辑门电路数量而提出的一种逻辑函数

表达形式.选择函数的思想为二分法

每次分得两个子函数

直至最终分解到的子函数可以直接实现.经

研究发现

对于上述特定问题选择函数形式比其他常用的标准形式优越许多.如上所述

对于

SM4

算法

S

使用最简与或形式、

最简或与形式

最简与或非形式等需要逻辑门数约为

3000,

而使用己知的

3

张笑从

SM4

算法快速软件实现

803

1

相关

AVX2

指令总结

Table

1

Summary

of

relevant

AVX2

instructions

AVX2

指令

C/C++

接口

功能描述

4

64

位数据重排

4

64

比特数据重排

8

32

比特数据重排

4

64

比特数据重排

8

32

比特逻辑左移

8

32

比特逻辑右移

vpshufhw_mm256_shufflehi_ep

6

vpshuflw

vpshufd

_mm256_shufflelo_ep

6

_mm256_shu

e_epi32

_mm256_permute4x64_epi64

vpermq

vpslld

_mm256_slli_epi32

vpsrld

_mm256_srli_epi32

vpxor

vpor

vpgatherdd

_mm256_xor_si256

_mm256_or_si256

25

&

比特逻辑异或

256

-比特逻辑或

8

32

比特查表

加载

/

存储

256

比特数据(要求内存对齐)

加载

/

存储

256

比特数据(不要求内存对齐)

_mm256_load_si256/_mm256_store_si256

vmovdqa

vmovdqu

_mm256_load_si256/_nim256_store

__

si256

_mm256_loadu_si256/_mm256_storeu_si256

个选择函数形式时,

可将逻辑门数限制在

N

sm

4

=

12

+ 8

x

(2'+

2

2

+

---

+

2

8

-

2)

=

1032.

使用本文提

出的新的选择函数及改进的搜索算法

可进一步将逻辑门数减至

497

门.一般来说

使用的选择函数越多,

搜索越充分

越能减少逻辑门数量.

本节首先基于已有的选择函数构造新的选择函数

之后基于新的选择函数给出改进的搜索算法

最后

介绍如何使用新的选择函数及改进的搜索算法化简

S

盒的逻辑表达式.

3.1

选择函数简介

为化简比特切片方法中实现

S

盒所用的逻辑门电路数量

Mattew

提出了化简逻辑门电路的算法及

选择函数

的概念.使用选择函数

DES

中实现

S

盒的逻辑门电路数量从平均

70

门每比特输出被约简

到平均

45

门每比特输岀.

设凡为

8

比特逻辑函数

即F

o

(abcdefgh),

从输入

abcdefgh

中任选一个比特

记为

sei,

给岀选择

函数基本形式

Fo

=

(Fi

and

sei)

or

(F2

and

not

sei)

不妨设

sei

d,

规定

Fi

=

Fi(abcefgh),

F2

=

F2

(

abcefgh)

由于

Fi

F

2

均唯一存在

从而

8

比特逻辑函数被分解成

7

比特逻辑函数

这一过程称为利用

选择函

数”

的一次选择.

Mattew

给出了三种

选择函数

表达式

F

=

(Fi

and

sei)

or (J2

and

not

sei)

F3

=

Fi

xor

F2,

=

(not

F

o

)

and

sei,

F5

=

Fo

xor

F4,

J

F

o

=

(F3

and

sei)

xor

F2,

Fo

=

{Fi

or sei)

xor

F5

Mattew

指出,

还可使用

nand

nor

等非标准逻辑门构造更多选择函数.生成选择函数形式的逻辑表

达式过程如下

从需要实现的逻辑函数出发

进行选择

逆向生成整个逻辑电路

直至最终得到许多

2

特逻辑函数.理论上共有

16

种不同的

2

比特逻辑函数

其中有

4

个是平凡的(常量

0,

1

和直接连接两

个输入

)

另外

12

个非平凡的逻辑函数可由两个输入连接

12

个逻辑门实现

如图

3

所示

每次选择时都有

上述

3

个选择函数形式可以使用

需要逐个尝试以取得较好结果

对于

DES

6

比特输入

4

比特输出

S

盒来说

先后处理

4

个输出

每个输出最多需要

4

“选择

.处理过程中,

1

个逻辑函数做

选择

前,

804

Journal of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

可以尝试直接连接到之前已实现的中间结果

这是化简的主要实现方式.

r-TO

5

--------------------------------------

[7S

3

16

2

输入逻辑门的一种实现

Figure

3

Example

of

16

logic

combinations

of

two

gates

基于选择函数表达式

Matthew

描述了

选择函数

生成

S

盒对应逻辑函数的算法.算法核心思想

是:

改变每次做选择使用输入比特的顺序和处理四个输出的顺序

搜索生成的最约简的逻辑门电路.对于

DES

的一个

6

比特输入

4

比特输岀

S

需要搜索

6!

x

4!

=

17

280

每一次搜索最多需要做选择

4

x

36

-

2

次(上述给岀

3

种选择函数形式

).

Biham

DES

6

比特输入

4

比特输出

S

盒做出分析

实现它需要最多逻辑门数为

N

des

=

12

+

4

x

(2

1

+

2

2

+

---

+

2

6-2

).

类似地

对于

SM4

8

比特输入

8

比特输出

S

N

sm

4

=

12

+

8

x

+

2?

+

+

2

8-2

)

=

1032

通过对选择函数的分析

我们发现换入不同逻辑门

得到的新选择函数与原形式可能有不同的子函数

而带来不同的结果.

针对上述问题

本文对选择函数及其搜索算法进行了研究

给岀了

9

种实质不同的

选择函数

表达

并改进了基于“

选择函数

的逻辑门电路生成算法(称为搜索算法

)

以利用

9

逻辑表达式

得到更

简化的

S

盒逻辑表达式.

3.2

构造新的选择函数及搜索算法

本小节介绍对

选择函数

的扩展和搜索算法的改进.

3.2.1

构造新的选择函数

m

表示逻辑函数输入的比特数.由于

选择函数

表达式每次将函数F

o

分解为

Fi

F2

F

3

,

次减少

1

比特输入

从而保证在有限次

(

m-2

次)选择后得到可直接实现的表达式.对于输入为

m

特的凡

可用

2^

比特表示

;限定冃

F2

F-3

的输入为

m-1

比特时

它们均可用

2

比特表示

F1,F

2

,F

3

唯一.

选择函数扩展的核心思想是尝试

not

F

3

not

F2

/not

F

的所有组合

其中

F

3

=

xor

F

2

,

Fj

=

not

fa,

A

nand

B

=

not

A

and

B,

A

nor

B

=

not

A

or

B.

默认非门

not

优先级最高.通过换用

不同逻辑门

本文给出了选择函数的所有

8

种变式

F

o

=

(F-3

and

sei)

xor

F2

(1)

加入的门为

and,xor,

分解出

F-2,

F3.

F

o

=

(F3

and

not

sei)

xor

Fi

张笑从等

SM4

算法快速软件实现

805

加入的门为

and,xor,not,

分解出

Fi,

F

3

-

F

o

=

(7*4

or

sei)

not

xor

F

(3)

加入的门为

or,xor,not,

分解岀

Fi

,

F4

F

o

=

(F

a

or

not

sei)

xor

not

F2

(4)

加入的门为

or,xor,not,not,

分解出

凡.

F

o

=

(2*4

nand

sei)

xor

F2

(5)

加入的门为

nand,xor,

分解出

J2,

F^.

F

o

=

(F4

nand

not

sei)

xor

Fi

(6)

加入的门为

nand,xor,not,

分解出

Fi,

74*.

F

o

=

(F3

nor

sei)

xor

not

F

(7)

加入的门为

or,xor,not,not,

分解出

Fi,

7¾.

Fo

=

(F3

nor

not

sei)

xor

not

F2

(8)

加入的门为

or,xor,not,not,not,

分解岀

尺,

尽.

换入非标准逻辑门

,可以找到的所有表达形式都包含于上述

9

种形式之中.

这种递归生成

选择函数

的算法处理F

o

not

F

o

可能得到差异较大的结果

F

o

not

F

o

选择函数

生成表达式的算法来说是两个不同的表达式

因此应分别尝试.

3.2.2

改进搜索算法

下面给出改进的搜索算法(算法

1).

40320x40

320

种输入输岀排序

分别调用此生成算法

搜索其

中逻辑门数最少的逻辑电路.算法输入逻辑电路

sei

比特排序和输出排序

输出逻辑电路和逻辑电路的

总门数.算法包括

5

个步骤.

算法

1

搜索算法

Input:

input

parameters

逻辑电路

sei

比特排序

输出排序

Output:

output

生成的逻辑电路

电路门数

1

初始化.设置最初的逻辑电路为图

3

所示的

16

2

输入逻辑函数.

2

搜索现有逻辑电路中是否有逻辑门(取反)匹配需要的逻辑函数.若存在

在逻辑电路中将搜索到的逻辑门(取反)

作为结果

逻辑电路逻辑门数不变(加1),

并返回

否则转至

3.

3

搜索现有逻辑电路中是否有两个逻辑门的组合

(and,or,xor,nand)

匹配需要的逻辑函数.

若存在,

在逻辑电路中加

入两个逻辑门的组合作为中间结果

现有逻辑电路逻辑门数加

1,

返回

否则转至

4.

4

对需要的

F

o

计算

Fi,F2,F3,not

F-not

F

2,not

F

3

,

分别对六个子函数调用此生成算法

2

开始执行

求得每

个子函数对应增加门数

标记对应生成的电路状态为待定.按照选择函数

9

种形式组合

6

个子函数

选择增加门

数最少的选择函数形式

留下对应的逻辑电路

删除其余

4

个子函数对应的逻辑电路.否则

返回生成的逻辑电路

和增加的逻辑电路门数.执行

5.

5

(可选)对满足要求的

F

aeed

9

种选择函数的所有组合

按照拓展的选择函数形式求得

2

个子函数

递归调用此生

成算法

将增加的逻辑门数与步骤

3

的结果对比留下逻辑门数较少的

返回.此步骤为可选

执行该步骤

可能会

得到更简化的逻辑函数

但会带来搜索量的增加.

改进之处在于

4

中提供更多选择函数形式

5

是新加入的步骤.

806

Journal

of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

4

SM4

算法的优化实现

本节首先介绍

SM4

算法优化实现方法的总体结构

之后介绍具体的优化实现.

4.1

总体实现

SM4

算法的优化实现包括三部分

数据编排

迭代计算

、数据反编排.对于数据(反)编排部分

要采用

SIMD

技术实现转置并优化

对于迭代部分

主要使用选择函数优化法优化

S

盒的逻辑表达式.具

体过程如图

4

所示.

SM1»

优化方法

4

总体实现结构

Figure

4

Overall

structure

of

implementation

4.1.1

数据编排

由于本文使用

256

位的

YMM

寄存器来实现

SM4

算法的

256

分组数据并行加解密

因此需构建一

个比特矩阵转置变换

TRANS(),

其输入为

256x128

比特,

输出为

128x256

比特.若将输入第

i

比特表

不为一维数组

Af[256][128]

A^(i/128][i

mod

128]

则输出为二维数组

Af[12

8],[256]

^[i

mod

128][i/128]

项.

编排后,

256

组的同一比特存储在一个

YMM

寄存器或一块内存.

M

6

表示二维数组

M

[128][256]

M

l0]

其长度为

256

比特.

4.1.2

密钥编排

对于第

i

轮加密的

32

比特密钥

RK,,

变换得到

RK?

58

,

表示将

RK,

每比特重复

256

次得到的结果,

RK]

[j]

=

RK

黑冋

=

RK

第⑴

=

=

RK

[255],

j

=

0,1,

-

-

,31

其中

RK

鴛为

256

比特.

4.1.3

迭代计算

128x256

比特的数据表示为

M

256

=

(M

S

m

严严

S

m

护点)

32

轮的加密密钥记为

RK?

56

,

i

=

0,1,

■■-

,31,

进行

32

次迭代运算

M

=

M,

256

+

+

+

+

RK?

56

),

其中

+

表示异或运算.合成变换

T

的输入和输出都是

32x256

比特

由非线性变换

7-

和线性变换

L

复合而成

T(-)

=

L(

t

(-)).

32x256

比特输入数据表示为

A

256

=

(a

賢,诸汽

a

郷,

a

鄴),其中

ag

56

,a?

56

,ai

56

,ai

56

均为

8x256

比特

r(A

256

)

(S(a

),S(a

),$(垮

6

)

,s@

6

))

.

4.1.4

反序计算

(5^56

^56

^56

^56

)

=

以霧

6,

x

鏗,

x

鄴,

X

),

则输出的

128x256

比特的加密数据表示为

y256

_

(

yr256

y256

y256

256

)

张笑从等

SM4

算法快速软件实现

807

4.1.5

数据反编排

从切片后的

128

256

比特数据恢复到

256x128

比特数据

需要构造比特矩阵转置变换

inv_TRANS(),

输入为

128x256

比特

输出为

256x128

比特.若将输入第

2

比特表示为二维数组

M[128][256]

^[i/256][i

mod

256]

,则转置为一位数组阿

256][128]

^[i

mod

256][i/256]

项.

4.2

AVX2

指令集的的使用

4.2.1

实现数据(反)编排

数据编排中

256x128

比特数据

分为两个比特方阵

对方阵进行比特粒度的转置

20

.

使用

vpor.

vpslld

>

vpxor

AVX2

指令优化实现转置算法.

数据反编排中的

128x256

比特数据也可分成两个比特方阵类似处理.

4.2.2

实现密钥编排

若并行加解密的分组使用不同密钥

编排方法同数据编排

不需要反编排

;若并行加解密的分组使用

相同密钥

编排不需要比特粒度转置

可以将密钥每一比特复制为

256

比特

AVX2

指令或普通指令均可

平凡地实现.

4.2.3

实现

S

使用

AVX2

指令集中提供的逻辑指令实现

具体为

vpor,

vpand,

vpxor,

vpnand.

指令为三操作数指

令(其中一个为目的操作数

)

不修改源操作数

必须选择

16

YMM

寄存器作为操作数.需要在内存中

暂存数据

可使用指令

vmovdqa

vmovdqu

进行数据加载

存储.

4.3

化简

S

盒逻辑表达式

下面介绍如何使用新的

选择函数

及改进的搜索算法化简

S

盒逻辑表达式.利用上节给出的

9

选择函数表达式

可得到

9

种改进的表达式.下面以式

(1)

为例

F

o

=

(F3

and

sei)

xor

F

2

xor

F

see

d

xor

F

see

d

如果

Reed

已计算

则上式从递归处理

F

3

F

2

变为递归处理

F

2

xor

Fseed

F

3

xor

F

seed

-

如果

F

seed

与用

尺,円有相同甚至更少的输入,

则可保证算法仍可在至多

m-2

次递归调用后结束.引入

Reed

后,

几乎可以任意改变由

F

o

生成的子函数

从而产生不同结果

结合穷举搜索使得

选择函数

方法更有效.

存在上述

Reed,

Fseed

的数量随着已生成的逻辑门数量增多而增多.只要F

不是第一个被处理的

输岀

,即可在已生成的表达式里找到许多

Fseed-

具体算法描述如下

(1)

假定输入中作为选择函数的

sel

的顺序为

a,cj,b,e,g,b,d,

不妨设为自然顺序

这种情况占搜索

空间的右.搜索深度最大为

6,

a,c,

f,h,e,g

分别是

6

个深度对应的

sel,

b,d

为输入的

16

逻辑函数属于初始电路.

(2)

搜索已生成的电路中是否有相同或相反的逻辑门.若有

将当前逻辑门连接至搜索到的逻辑门,

返回电路增加的逻辑门数

0

(

相同)或

1

(相反

).

例如

5

fo[i]

进行第一次选择

得到其中

1

个子函数可直接用/

2

实现

则实现该子函数无需增加逻辑门数.

(3)

搜索已生成的电路中是否有两个逻辑门可以组合得到所需逻辑门.若有

将当前逻辑门连接至

搜索到的两个逻辑门

返回电路增加门数

1-

例如图

6

f

o[1]做第一次选择

生成子函数

/g,

fs

=

not

(/

4

xor

/5),

则实现

fs

的代价是门数加

1.

(4)

利用

9

种选择函数生成子函数

递归调用生成算法,

保留返回门数最少的一个逻辑表达式.如

7

所示

f

o[0

递归生成子函数

若不能找到己存在的可用逻辑门

则会一直生成子函数直

到连接至

2

比特逻辑函数.图

7

f

o

[

0

]

=

(/3

and

a)

xor

/2,

/2

=

(/5

or

c)

xor

/4,

/3

=

(/

6

and

not

c)

xor

均是尝试了

9

种选择函数后得到的最优结果.

(5)

9

种选择函数中加入

Fseed

改变子函数

递归调用生成算法,

保留当前一步和上一步所有解中

逻辑门数最少的解.如图

8

所示

对f

oW

引入

F

seed

=

/

2

,则对应生成的子函数为/

7

与/

9

,

在上述四种处理方式中

,前两种利用己存在的逻辑门

无需额外代价

后两者基于选择函数的递归处

理在没有直接可用的逻辑门的情况下使用

.

808

Journal

of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

6

连接到两个逻辑门的组合

Figure

5

Appending

to

generated

logic

gates

7

使用选择函数公式递归生成逻辑电路

Figure

7

Generating

logical

circuit

using

selection

function

recursively

8

引入可变的

F

seed

生成逻辑电路

Figure

8

Generating

logical circuit

via

almost

arbitrary

Reed

4.4

S

盒实现结果比较

2

列出了使用选择函数和未使用选择函数时

S

盒实现中需要的逻辑门电路数量及实现时间.由于

AVX2

指令集中数据加载存储指令相对于逻辑操作指令迅速许多

,因此

S

盒的实现时间大致由逻辑门数

决定.未使用选择函数实现

S

盒所需逻辑门数约为

3000

最简与或式

使用

9

个选择函数和改进的搜索

算法所需的逻辑门数为

497.

31250

Mb

数据加密测试结果显示

未使用选择函数的实现时间为

30

秒,

使用

9

个选择函数和改进的搜索算法后

实现时间减少至

10.3

秒.

2

S

盒实现所需要的逻辑门数及实现时间比较

Table

2

Logical

gate

count

and

time

for

implementing

S

box

实现方法

未使用选择函数

逻辑门数

实现时间

s

3000

497

30

使用选择函数

10.3

5

实验结果

本节比较己有公开文献中关于

SM4

软件实现的效率

包括传统查表法

SIMD

技术查表法及比特切

片方法.利用

C

语言和汇编语言对

SM4

算法进行优化实现

在相同的硬件环境中

比较

SM4

算法不同

实现方法的效率.由于

PC

端内存资源相对丰富

故对于

4

GB

8

GB

内存不做区分

;处理器微架构和主

频对性能有较大影响

.

具体测试环境如表

3

所示.

4

总结在不同处理器上

SM

4

算法釆用查表法

选择函数优化法的软件实现性能.评估分组密码算

法软件实现性能的指标是每秒钟加

/解密的比特数

bps.

31

250

Mbit

数据进行加密测试.表

4

8-32

表示采用

8-

bit

输入

32-bit

输岀表.

张笑从

SM4

算法快速软件实现

809

3

测试环境参数

Table

3

Environments

for

efficiency

test

处理器微架构

主频

/GHz

2.40

2.80

内存

/GB

4

8

Intel

Core

i5~6200U

Sky

lake

Kabylake

Intel

Core

i7-7700HQ

4

软件实现方法在不同处理器上效率对比

Table

4

Efficiency

of

software

implementations

on

different

processors

平台

实现方法

S

盒形式

/

/

数据编排算法

/

/

未优化

综合性能

(

Mbps)

存储表

1

1

2

2

3

3

查表(8-32)

908

1795

查表

(8-32)+AVX

指令

比特切片

+

AVX2

指令

比特切片

+

AVX2

指令

比特切片

+

AVX2

指令

比特切片

+

AVX2

指令

最简与或式

选择函数

650

优化

20

未优化

优化

1301

2387

最简与或式

选择函数

720

2580

(1)

1

Mbps

=

2

20

bps

(2)

平台

1:

Intel

Core

i7-5500U(Broadwell-U)@2.40

GHz

[9]

(3)

平台

2

Intel

Core

i5-6200U(Skylake)@2.40

GHz

(4)

平台

3:

Intel

Core

i7-7700HQ(Kabylake)@2.80

GHz

由表

4

可以看出

使用

AVX2

指令的并行查表方法比普通查表方法在效率上有明显提升

908

Mbps

1795

Mbps

提升接近

1

倍.未优化的比特切片

+AVX2

指令方法效率不佳

而本文的比特

切片

+AVX

指令

+

选择函数优化方法在

Intel

Core

i5-6200U(Skylake)

@2.40

GHz

Intel

Core

i7-

7700HQ(Kabylake)@2.80

GHz

分别达到

2387

Mbps

2580

Mbps,

相对于近似的主频

(2.40

GHz)

架构

(Intel

Core

i7-5500U(Broadwell-U))

AVX2

指令并行查表方法有明显优势.

对于算法所需的内存开销

普通查表和并行查表需要

4

KB

内存存放代换表

对于资源受限的终端

并不合适

而本文的比特切片实现无需任何额外的内存开销来存储代换表

因此所需内存开销为

0.

此外,

查表法在内存中存储代换表并需要在加解密时访问对应的内存

除了需要额外的内存开销

还不能抵抗缓

存-计时侧信道攻击.本文的软件优化实现方法不需查表

因此能够抵抗该类侧信道攻击.

下面进一步给出对

31250

Mb

数据加密测试的详细结果.

5

软件实现方法效率测试

Table

5

Test

on

efficiency

of

software

implementations

平台

实现方法

比特切片

+AVX2

指令

数据编排

(

s)

10

S

盒实现

(s)

30

总时间

(

s)

40

效率提升

/

Intel

Core

i5-6200U

(Skylake)@2.40

Ghz

Intel

Core

i7-7700HQ

(Kabylake)

@2.80

Ghz

比特切片

+

AVX2

指令

+

选择函数优化

1.99

比特切片

+AVX2

指令

11.1

13.09

43

2.04

/

2.59

10

33

比特切片

+AVX2

指令

+

选择函数优化

1.81

10.3

12.11

由表

5

可知,

Intel

Core

i5-6200U(Skylake)@2.40

GHz

本文的基于选择函数优化法的实现时间

13.09

加密效率提升

2.04

倍.在

Intel

Core

i7-7700HQ(Kabylake)@2.80

GHz

该方法的实现时

间为

12.11

加密效率提升

2.18

倍.

此外

由表

5

可以看出

S

盒计算占全部计算约

80%,

进一步提升效

率的关键仍在于优化

S

盒的实现.

810

Journal

of

Cryptologic

Research

密码学报

Vol.

7,

No.

6,

Dec.

2020

6

总结

本文基于比特切片方法和

SIMD

技术

提出了一种新的

SM4

算法软件优化实现方法

并利用

X86

台的

AVX2

指令集给岀了高效的实现.新方法首先利用

AVX2

指令优化了数据编排算法

之后基于选择

函数提出了更灵活的化简

S

盒逻辑表达式的算法.在基于选择函数的优化方法中

构造了新的选择函数,

并基于新的选择函数改进了搜索算法

从而将

S

盒所使用的门电路数量从

3000

门降至

497

Intel

Core

i7-7700HQ(Kabylake)@2.80

GHz

环境下

同目前公开文献中

SM4

软件实现的最快速度

1.7

G

基于选择函数的优化方法加解密速度提升至

2.5

G,

提高了

43%.

同基于查表的软件实现方法相比

作品的软件实现方法可以抵抗

cache

攻击

从而提高了算法实现的安全性.本文提出的新的选择函数和搜

索算法具有通用性

可用于其它一般逻辑函数的化简.此外

优化方法具有可扩展性

不仅可以从

SM4

法扩展至目前所有的对称加密算法的软件优化实现

而且可以从

X86

平台的拓展指令集

AVX2

实现扩展

至利用

RISC

指令集在资源受限

安全性要求高的

ARM

等嵌入式平台上实现.

参考文献

[1]

LU

S

W,

LI

D

W,

ZHANG

C,

et

al.

GM/T0002

2012

SM4

block

cipher

algorithm[S].

Beijing:

China

Standard

Press,

2012.

吕述望

李大为

,张超,

等.

GM/T0002

2012

SM4

分组密码算法

[S].

北京

中国标准出版社

2012.

[2]

LU

S

W,

SU

B

Z,

WANG

P,

et

al.

Overview

on

SM4

algorithmfj].

Journal

of

Information

Security

Research,

2016,

2(11):

995-1007.

吕述望

苏波展

王鹏,

等.

SM4

分组密码算法综述

[J].

信息安全研究

2016,

2(11)

995-1007.

[3]

BIHAM

E.

A

fast

new

DES

implementation

in

software[C].

In:

Fast

Software

Encryption-

FSE

1997.

Springer

Berlin

Heidelberg,

1997:

260-272.

[DOI:

10.1007/BFb0052352]

[4]

KWAN

M.

Bitslice

DES[EB/OL].

http:

/

/de.

/bitslice/

[5]

Solar

Designer.

John

the

Ripper

1.7.8:

DES

speedup[EB/OL].

https

/

/

/lists

/

john-users

/2011/06/22/1

[6]

ADOMNICAI

A,

PEYRIN

T.

Fixslicing

AES-like

ciphers:

New

bitsliced

AES

speed

records

on

ARM-Cortex

M

and

R1SC-V[J].

IACR

Transactions

on

Cryptographic

Hardware

and

Embedded

Systems,

2021(1):

402-425.

[DOI:

10.46586

/tches.v202

l.i

1.402-425]

[7]

MATSUDA

S,

MORIAI

S.

Lightweight

cryptography

for

the

cloud:

Exploit

the

power

of

bitslice

implementa-

tion[C].

In:

Cryptographic

Hardware

and

Embedded

Systems

-CHES

2012.

Springer

Berlin

Heidelberg,

2012:

408-425.

[DOI:

10.1

007/978-3-642-33027-8_24]

[8]

NEVES

S,

AUMASSON

J

P.

Implementing

BLAKE

with

AVX,

AVX2,

and

XOP[J].

IACR

Cryptology

ePrint

Achieve,

2012:

2012/275.

https

://eprint.

/2012/

[9]

LANG

H,

ZHANG

L,

WU

W

L.

Fast

software

implementation

of

SM4[J].

Journal

of

University

of

Chinese

Academy

of

Sciences,

201&

35(2):

180-187.

郎欢,张蕾

吴文玲.

SM4

的快速软件实现技术

[J].

中国科学院大学学报

201&

35(2):

180-187.

[10]

PAPAPAGIANNOPOULOS

K.

High

throughput

in

slices:

The

case

of

PRESENT,

PRINCE

and

KATAN64

ciphers[C).

In:

Radio

Frequency

Identification:

Security

and

Privacy

Issues

RFIDSec

2015.

Springer

Cham,

2014:

137-155.

[DOI:

10.1007/978-3-319-13066-8_9]

[11]

LIU

F.

JI

W.

HU

L,

et

al.

Analysis

of

the

SMS4

block

cipher[C].

In:

Information

Security

and

Privacy

ACISP

2007.

Springer

Berlin

Heidelberg,

2007:

158-170.

[DOI:

10.1007/978-3-540-73458-

1_

13]

[12]

LIANG

H.

WU

L

J,

ZHANG

X

M,

et

al.

Design

of

a

masked

S-box

for

SM4

based

on

composite

field[C].

In:

Proceedings

of

Tenth

International

Conference

on

Computational

Intelligence

and

Security.

IEEE,

2014:

387-391.

[DOI:

10.1109/CIS.2014.59]

[13]

ZHANG

J,

MA

M,

WANG

P.

Fast

implementation

for

SM4

cipher

algorithm

based

on

bit-slice

technology[C].

In:

Smart

Computing

and

Communication

SmartCom

2018.

Springer

Cham,

201&

104

113.

[DOI:

10.1007/978-3-

030-05755-8_ll]

[14]

ELDOSOUKY

A,

SAAD

W.

On

the

cybersecurity

of

m-Health

IoT

systems

witli

LED

bitslice

implementation[C]

.

In:

Proceedings

of

2018

IEEE

International

Conference

on

Consumer

Electronics

(ICCE).

IEEE,

201&

1-6.

[DOI

10.1

109/ICCE.2018.8326298]

[15]

HAJIHASSANI

O,

MONFARED

S

K,

KHASTEH

S

H.

et

al.

Fast

AES

implementation:

A

high-throughput

bitsliced

approach

[J].

IEEE

Transactions

on

Parallel

and

Distributed

Systems,

2019,

30(10):

2211

2222.

[DOI:

张笑从等

SM4

算法快速软件实现

811

10.1109/TPDS.2019.2911278]

[16]

KONIGHOFER

R.

A

fast

and

cache-timing

resistant

implementation

of

the

AES[C].

In:

Topics

in

Cryptology

-

CT-RSA

2008.

Springer

Berlin

Heidelberg,

2008:

187-202.

[DOI:

10.1007/978-3-540-

79263-5_

12]

|17]

SCHNEIER

B,

KELSEY

J.

Unbalanced

Feistel

networks

and

block

cipher

design[C].

In:

Fast

Software

Encryption

FSE

1996.

Springer

Berlin

Heidelberg,

1996:

121-144.

[DOI:

10.

1007/3-540-60865-6_49]

[18]

Intel

Corporation.

Intel

Intrinsics

Guide[EB/OL].

/sites/landingpage/IntrinsicsGuide/

[19]

KWAN

M.

Reducing

the

gate

count

of

bitslice

DES[J].

IACR

Cryptology

ePrint

Archive,

2000:

2000/51.

https:

/

/eprint

.

/2000/251

.

pd

f

[20]

REBEIRO

C,

SELVAKUMAR

D,

DEVI

A

S

L.

Bitslice

implementation

of

AES[C].

In:

Cryptology

and

Network

Security

CANS

2006.

Springer

Berlin

Heidelberg,

2006:

203-212.

[DOI:

10.1007/1

1935070_14]

作者信息

张笑从

(1998-),

陕西西安人,

本科.主要研究领域密码算法

的设计与实现.

*****************

张习勇

(1975-),

湖北武穴人,

博士

副教授.主要研究领域

为密码算法的设计与分析.

************************

>

A

郭华

(

1980-),

河南郑州人

副教授.主要研究领域为密

码算法的设计

实现与分析.

V八

*************.cn

王闯

(1997-),

河南商丘人

科.主要研究领域为网络空间

安全.

*****************

刘建伟

(1964-),

山东烟台人

博士

教授.主要研究领域为

网络空间安全.

*******************.cn

本文标签: 实现逻辑算法方法选择函数