c语言国密算法,向GCC学习C语言_国密SM3散列算法消息扩展函数实现相关

博客介绍了如何根据国密SM3标准文档实现消息扩展函数的C语言代码,并展示了GCC编译后的汇编代码。GCC通过优化将C代码转换为高效汇编,包括自动使用XOR指令、寄存器优化和避免减法操作。这表明在编写C语言代码时,考虑编译器优化可以提高代码的执行效率和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

依据国密SM3散列算法的标准文档,很容易写出其消息扩展函数的C语言实现:

#include

void expand_data(uint32_t W[68], uint32_t data[16])

{

uint32_tj, P1, X;

for(j = 0; j < 16; j++) W[j] = data[j];

for(j = 16; j < 68; j++) {

X = W[j-16] ^ W[j-9] ^ ((W[j-3]<<15) | (W[j-3]>>17));

P1 = X ^ ((X<<15)|(X>>17)) ^((X<<23)|(X>>9));

W[j] = ((W[j-13]<<7)|(W[j-13]>>25)) ^ W[j-6] ^ P1;

}

}

然而经过GCC编译成汇编语言之后,更接近下面的C语言实现

#include

void expand_data(uint32_t W[68], uint32_t data[16])

{

uint32_tj, X;

for(j = 0; j < 16; j++) W[j] = data[j];

for(j = 0; j < 52; j++) {

X = W[j] ^ W[j+7] ^ ((W[j+13]<<15) | (W[j+13]>>17));

W[j+16] = ((W[j+3]<<7)|(W[j+3]>>25)) ^ W[j+10] ^ X ^ ((X<<15)|(X>>17)) ^((X<<23)|(X>>9));

}

}

上述两份C语言代码编译之后得到的汇编代码是完全相同的:

.file"expand_data.c"

.text

.p2align 4,,15

.globl expand_data

.typeexpand_data, @function

expand_data:

.LFB0:

.cfi_startproc

xorl%eax, %eax#j = 0

.p2align 4,,10

.p2align 3

.L2:

movl(%rsi,%rax), %edx#edx = data[j]

movl%edx, (%rdi,%rax)#W[j] = edx

addq$4, %rax#j++

cmpq$64, %rax#(j == 16)

jne.L2#if (!=) goto .L2

xorl%edx, %edx#j = 0

.p2align 4,,10

.p2align 3

.L3:

movl28(%rdi,%rdx), %ecx#ecx = W[j+7]

movl52(%rdi,%rdx), %eax#eax = W[j+13]

xorl(%rdi,%rdx), %ecx#ecx ^ W[j+0]

rorl$17, %eax#eax = W[j+13]>>>17

xorl%eax, %ecx#ecx ^ W[j+13]>>>17

movl12(%rdi,%rdx), %eax#eax = W[j+3]

movl%ecx, %esi#esi = X

rorl$17, %esi#esi = X>>>17

rorl$25, %eax#eax = W[j+3]>>>25

xorl40(%rdi,%rdx), %eax#eax ^ W[j+10]

xorl%ecx, %eax#eax ^ X

rorl$9, %ecx#ecx = X>>>9

xorl%esi, %eax#eax ^ X>>>17

xorl%ecx, %eax#eax ^ X>>>9

movl%eax, 64(%rdi,%rdx)#W[j+16] = eax

addq$4, %rdx#j++

cmpq$208, %rdx#(j == 52)

jne.L3#if (!=) goto .L3

rep; ret

.cfi_endproc

.LFE0:

.sizeexpand_data, .-expand_data

.ident"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-23)"

.section.note.GNU-stack,"",@progbits

阅读GCC产生的汇编代码可知:

1、((x >> 15) | (x << 17))这种会自动变成xor指令,无须使用宏夹杂内联汇编代码污染C语言代码的可读性;

2、GCC会根据需要将临时变量进行寄存器优化,为了可读性多用几个临时变量没啥坏处;

3、GCC似乎不喜欢减法,所以在C语言程序编写时,循环变量也好,数组下标也好,尽量使用加法而不是减法;

管理后台HTML页面是Web开发中一种常见的实践,主要用于构建企业或组织内部的管理界面,具备数据监控、用户管理、内容编辑等功能。本文将探讨一套美观易用的二级菜单目录设计,帮助开发者创建高效且直观的后台管理系统。 HTML5:作为超文本标语言的最新版本,HTML5增强了网页的互动性和可访问性,提供了更多语义元素,如<header>、<nav>、<section>、<article>等,有助于清晰地定义网页结构。在管理后台中,HTML5可用于构建页面布局,划分功能区域,并集成多媒体内容,如图像、音频和视频。 界面设计:良好的管理后台界面应具备清晰的导航、一致的布局和易于理解的图标。二级菜单目录设计能够有效组织信息,主菜单涵盖大类功能,次级菜单则提供更具体的操作选项,通过展开和折叠实现层次感,降低用户认知负担。 CSS:CSS是用于控制网页外观和布局的语言,可对HTML元素进行样式设置,包括颜色、字体、布局等。在管理后台中,CSS能够实现响应式设计,使页面在不同设备上具有良好的显示效果。借助CSS预处理器(如Sass或Less),可以编写更高效、模块化的样式代码,便于维护。 文件结构: guanli.html:可能是管理页面的主入口,包含后台的主要功能和布局。 xitong.html:可能是系统设置或配置页面,用于管理员调整系统参数。 denglu.html:登录页面,通常包含用户名和密码输入框、登录按钮,以及注册或忘密码的链接。 image文件夹:存放页面使用的图片资源,如图标、背景图等。 css文件夹:包含后台系统的样式文件,如全局样式表style.css或按模块划分的样式文件。 响应式设计:在移动设备普及的背景下,管理后台需要支持多种屏幕尺寸。通过媒体查询(Media Queries)和流式布局(Fluid Grids),可以确保后台在桌面、平板和手机上都能良好展示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值