ae开发实验报告(通用6篇)
篇1:ae开发实验报告
AE实验报告
一、实验目的
1.熟悉3D层的操作。2.掌握虚拟摄像机的使用。
3.结合平时所学习的一些特效的制作,能够创新,做出自己的作品。4.充分运用常见的粒子效果的制作。
二、实验设备
计算机及系统软件 Adobe After Effects CS4影视合成软件
素材光盘以及自己收集的相关资料
监听音箱或耳机
Photoshop CS2.0
三、实验内容
这个实验的主要内容就是要熟练Adobe After Effects CS4影视合成软件的使用和在实验课上所学到的一些特效的制作,把实验课上所学到的内容运用到自己的作品中来。同时,结合参考书籍上的一些特效,做出自己想要的效果。这个作品中运用3D图层结合相关的图片做出三维效果,还应用了粒子特效和其他特效。
四、实验环节
1.选题的确定
我的作品的主题是关于婚庆的的,名字是《薇薇婚庆》。主要是利用特效展示浪漫。在做这个作品之前,我上网找了很多用AE做出来的特效,别人的作品很多好的效果都是用平面的图片来做出了三维的效果。在此基础上,我决定做一个关于婚庆的作品。首先是对这个感兴趣,可以借助于人物来做出三维的效果。这个做平可以完全脱离老师平时所讲的内容,做出完全属于自己的东西,这样对于自己能力的提高有很大的好处,并且有可以把平时所学的应用到自己的作品中,所以我决定用这个主题。另外,我也觉得这个主题利用真是的人物来展示,展示出来的三维效果会比较真实,在这方面就充分应用了AE做3d的特点。因此,我最后决定用这个主题。
2.方案的设计想法的构思
在这个作品中,我主要是用了particular粒子属性制作出三维云层,照片墙,梦幻心等效果,particular的功能特别强大,我们可以做出各种各样的效果来。利用3D图层并且结合摄像机可以做出立体的效果。
通过上网搜索别人利用AE做出来的特效片头和片尾,我发现别人的作品之所以好看,很多都是利用合理的布局,结合3D图层与摄像机做出三维的感觉。看着十分绚丽、精彩。所以,我决定在自己的作品中同样利用3D图层来做出比较动感的画面。
我的作品主要分为三个部分。首先是利用particular做出一个三维云层,很梦幻的场景,但是仅仅有云层显得很单调。在中间插入文字效果,看起来就很浪漫。然后也是利用particular作出的一个照片墙的效果,很动感,最后出现的是用particular制作的两个心动画,一个代表男,一个代表女,主题鲜明。
这样的组合,显得没有那么单调,而且也很好的展示了主题。在最后的一段合成里面,利用部分到整体的思想,也能够很好地将整个主题表现出来。
3.制作的过程或步骤
一、“粒子云”合成设置。
(1)启动AE软件,另存为“微微婚庆”。
(2)新建合成组,命名为“粒子云”,如图所示:
(3)新建固态层,命名为“粒子云”。拖动“particular”到固态层上,对这个插件的相关属性进行设置,如图所示:
(4)新建一个摄像机,再建一个空物体,将摄像机的父级拉动到空物体上,将空物体的三维开关打开,按P键,设置位置的相关参数为如图所示:
(5)添加背景,新建固态层,命名为“背景”,拖动一个渐变特效到背景图层上,设置参数如图所示:
(6)新建固态层,命名为“太阳光”,拖动“光工厂EZ”到“太阳光”图层上,设置参数如图所示:
(7)将做好的文字“薇薇婚庆”拖到时间线窗口,将三维开关打开,并且 运用曲线和调色对文字进行修饰。
(8)选中“粒子云”图层,按CTRAL+D复制“粒子云”,将粒子云拖动到文字层上方,为其透明度作如图所示的动画,(9)新建固态层,命名为“CC粒子”,为这个图层添加“CC粒子仿真世界”效果,设置参数如图所示:
(10)粒子云合成的整体效果如图所示:
二、粒子图片合成设置。
(1)新建固态层,命名为“粒子图片”,如图所示:
(2)新建固态层,取名为“粒子”拖动“particular”特效到固态层上,设置参数如图所示:
(3)将准备好的“需要替换的图片”拖到时间线窗口,排列好。
(4)新建一个摄像机,再新建一个空物体层,拖动父级到空物体层设置其参数如图哦所示:
(5)复制“粒子云”图层,将“positionXY”设置为“-1237”。
(6)新建一个空物体,将下一个空物体绑定到这个空物体,设置其参数:
(7)再新建一个空物体层,将下一个空物体绑定到这个空物体,设置其参数:
(8)新建一个固态层,取名为“背景”,为其添加光工厂特效如图所示:
(9)整
体
效
果
如
图
所
示
:
三、心形粒子合成设置。
(1)新建一个合成,取名为“心形粒子”。新建一个固态层,取名为“心MASK”,在PHOTOSHOP软件中绘制一个心形,复制到“心MASK”中,并调整其大小。(2)新建一个空物体,选择“心MASK”,按M键,复制,再选中空物体层,按P键,选择位移属性,粘贴,这样就将心的路径绑定到空物体上。并为空物体添加动画。如图所示:
(3)新建图层,命名为“粒子”,为其添加“particular”粒子特效,并修改其参数。
(7)添加辉光特效,如图:
(8)复制“粒子”图层,取名为“粒子线”,设置其属性为:
(9)合并“粒子”,“粒子线”,“空白三图层”。选择“图层”/“预合成”。复制心形粒子特效合成,调整其位置,作出双心效果。
(10)新建固态层,取名为背景,我们利用光效为其添加背景。(11)整体效果如图所示:
(12)拖动准备好的音乐素材到时间线窗口,准备完成后渲染。(13)打开成品,观察效果。
五、实验总结:
1.作品的评价
在作品的整体布局和安排上,我觉得还是做得比较有条理的,作品中首先展示梦幻的云层,太阳在运动,云在运动,文字在云中运动,蓝色的天空,白色的云朵,很好的运用了particular粒子和3D图层的效果,显得十分梦幻。然后做出的是很多很多的粒子婚纱照片在三维空间运动,动感十足,整个作品还是花了一点心思的。特别是后面一起出现的两个心,一个代表男的一个代表女的,很浪漫混温馨,又有点像放礼花的效果更是花了不少心思。音乐和画面也很相配。但是粒子图片的大小没有设置好,心心相应的画面中应该添加一点文字。最后当我渲染完成后,就把原文件给损坏了,现在我仍然没有找出原因。总之,还存在很多细节的问题。
2.得失与反思 在上实验课的时候,基本上很认真的学习了每一个实验内容,但是在做作品的过程中才发现我们学到的东西是很少的,效果也比较单一,要想做出一个比较好的作品仅仅只是靠老师上课时将的一些知识,是远远不够的。很多特效的制作都需要我们自己去摸索和尝试。在做完这个作品后,给我最大的感触就是——要想做好一个好的片头是要花很多功夫的。虽然只是短短的20多秒钟,可是花了功夫做出来的作品和没有花时间就照着老师平时讲课内容
做出来的是完全相反的效果。在实验中,要想做出属于自己的东西,不仅要有好的构思,还需要很好的耐心去做完每一个部分。因为很多都是很细节的部分,比如说一个关键帧的位置应该设在哪一个位置,一个图片的摆放应该是怎样的,这些都需要自己慢慢去摸索,去尝试出最好的效果。
另外,在运用3D图层的时候,挑战了我们的空间想象能力。要想在三维的空间里面运用图片做出三维的效果,就必须从各个视图看图片的位置,顾及到每一个方面的话,最后才能做出比较真实的效果。看了别人的作品之后,我发现自己的空间想象能力还是很有限,对于摄像机的运用掌握得也不是十分好,在以后的学习中,我想自己在这些方面还是需要更大的提高。
最后,从这个作品的制作中,我感觉我有了一些对于学习软件的兴趣,我觉得这是最重要的收获了。以前总是觉得别人在动手操作方面比我要强很多,以至于我总是缺乏信心,但是从这次制作的过程中我才知道大家都是一样的,只是花的时间不同而已,只要肯付出肯努力用于探索乐于请教他人,没有什么是学不好的。
篇2:ae开发实验报告
名:选择课题:系:专
业:学
号:指导教师:
本科实验报告
信息与通信安全
C/C++实现加解密算法及其应用(实验一)
信电系 信息与通信工程
****年**月**日
目录
1.实验内容与要求.......................................................................................................................3 2.实验原理....................................................................................................................................3
2.1 AES原理..........................................................................................................................3
2.1.1 AES总体结构.......................................................................................................3 2.1.2 AES详细结构.......................................................................................................4 1.1 2.CMAC原理................................................................................................................7
实验环境...........................................................................................................................9
4. 代码实现...............................................................................................................................9
4.1字节代替变换.................................................................................................................9 4.2 行移位变换..................................................................................................................11 4.3列混淆变换...................................................................................................................14 4.4 轮密钥加......................................................................................................................17 4.5 AES的加密与解密的实现............................................................................................22 4.6 CMAC代码实现............................................................................................................23 5.思考题...................................................................................................................................27 6.心得体会...............................................................................................................................27 附录(完整程序).....................................................................................................................28
1.实验内容与要求
(1).复习AES原理。
(2).用C/C++编写AES算法并调试通过。(3).复习CMAC原理。
(4).在实现AES基础上,用C/C++编写CMAC算法并调试通过。(5).回答下列思考题。
AES解密算法和AES的逆算法之间有什么不同? CMAC与HMAC相比,有什么优点?
2.实验原理
2.1 AES原理 2.1.1 AES总体结构
下图展示了AES加密过程的总体结构。明文分组长度为128位即16字节密钥长度可以为16,24或32字节(在本次设计中选择16字节)。
加密和解密算法是输入是一个128位的分组。在FIPS PUB 197中,这个分组被描述为4*4的字节方阵。这个分组被复制到state数组,饼子啊加密或解密的各个阶段被修改。同样,密钥也被描述为字节的方阵,并被扩展为44字的密钥字序列。
密码由N轮组成,其中轮数依赖于密钥长度,16字节密钥是10轮,前N-1轮由4个不同的变换组成:字节代替,行位移,列混淆,轮密钥加。最后一轮包含三个变换,而在第一轮的前面有一个起始的单变换(轮密钥加),可视为第0轮。每一个变换输入一个活多个4*4的矩阵,并输出一个4*4的矩阵,最后一轮输出为密文。同样,密钥扩展函数为N+1轮密钥,它们是互不相同的4*4矩阵。每一个轮密钥作为每轮的轮密钥加变换的一种输入。
2.1.2 AES详细结构
1)
AES算法未使用Feisel结构,而是在每一轮都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。
2)输入的密钥被扩展为44个32位字所组成的数组w[i],每轮由四个不同的字作为该轮的轮密钥。3)由四个不同的阶段组成,包括一个置换和三个代替。字节代替:
用一个S盒完成分组的字节到字节的代替。行位移:
一个简单的置换。列混淆:
利用GF(2^8)上的算术特性的一个代替。轮密钥加:
当前分组和扩展秘钥的一部分进行按位异或。
(一)字节代替变换
如上图,字节代替变换是一个简单的查表操作。AES定义了一个S盒,它由16*16个字节组成的矩阵,包含了8位所能表示的256个数的一个置换。State中 的每个字节按照如下的方式映射为一个新的字节,把改字节的搞4位作为行值,低四位作为列值,以这些行列值作为索引从S盒的对应位置取出元素作为输出。而其逆向操作则是有对应的逆S盒可进行查表。
(二)行移位变换
如上图,其正向行移位变换中,state的第一行保持不变,把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移四个字节。例如:
逆向行移位变换将state中的后三行执行相反方向的一位操作即可。
(三)列混淆变换
如上图,列混淆的正向变换是对每列单独进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字通过函数变换得到。这个变换可有下面基于state的矩阵乘法表示:
乘积矩阵中的每个元素军事一行和一列中对应元素的乘积之和。这里的乘法和假发都是定义在GF(2^n)上的。状态中单列的列混淆变换可表示为:
其中一个例子如下:
(四)轮密钥加变换
如上图,在轮密钥加变换中,128位的state按位与128位的轮秘钥XOR。该操作可以视为state的一列中的四个字节与轮秘钥的一个字进行列间的操作,例如:
(五)AES密钥扩展
AES密钥扩展算法的输入值是一个4个字,输出值是一个由44个字组成的移位线性数组。
输入密钥字节被复制到扩展密钥数组的前4个字。然后每次用四个字填充扩展密钥数组余下的部分。在扩展数组中,每一个新增的字w[i]的值依赖于w[i-1]和w[i-4]。在4
个情形中,三个使用了异或。对w数组中下标为4的倍数的的元素采用了更复杂的函数来计算:
(1)字循环的功能时使一个字中的四个字节的循环左移一个字节,即将输入字[B0,B1,B2,B3]变成为[B1,B2,B3,B0].(2)字代替利用S盒对输入字中的每个字节进行字节代替。(3)步骤1和步骤2的结果再与轮常量Rcon[j]相异或。
1.1 CMAC原理
基于密码的消息认证码(CMAC)对于AES,3DES适用,它使用三个密钥:一个密钥长为K,用在密文分组链接的每一步,两个长度为n的密钥,其中k是密钥长度,n为密文分组长度。并且两个n位的密钥可以从加密密钥导出,而不是单独提供。首先,当消息长度是分组长度b的n倍时,我们考虑CMAC的运算情况。对AES,b=128,对于3DES,b=64.这个消息被划分为n组,(M1,M2…,Mn)。算法使用了k比特的加密密钥K和n比特的常数K1。对于AES,密钥长度k为128,192和256比特,对于3DES,密钥长度为112或168比特。CMAC按如下方式计算:
C1E(K,M1)C2E(K,[M2C1])C3E(K,[M3C2])...CnE(K,[MNCn1K1])TMSBTlen(Cn)其中:
T——消息认证码,也称为tag Tlen——T的比特长度
MSBs(X)——比特串X最左边的s位
如果消息不是密文分组长度的整数倍,则最后分组的右边(低有效位)填充一个1和若干个0,使得最后的分组长度为b。除了使用一个不同的n比特密钥K2代替K1外,与前面所述一样进行CMAC运算。
两个n比特的密钥由k比特的加密密钥按如下方式导出:
LE(K,0n)K1LxK2LX2(Lx)x其中乘法(·)是在域GF(2^n)内进行,X和X^2是该域的一次和二次多项式。因此X的二元表示为n-2个0,后跟10,X^2的二元表示为n-3个0,后跟100。对于AES,已获批准的分组长度为X^128 +X^7 +X^2 +X+2.。
当消息长度是分组长度的整数倍:
当消息长度不是分组长度的整数倍:
2.实验环境
装有C_Free 的笔记本
4. 代码实现
首先是实现AES的各个子模块,在验证其正确以后,再进行CMAC的认证算法的实现。
4.1字节代替变换
#include
static unsigned char Sbox[256] =
{ //AES的S盒
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
static unsigned char InvSbox[256] = { // AES的逆S盒
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
//字节代替变换
void Sub_Byte(unsigned char state[4][4]){ int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=Sbox[state[i][j]];
} //逆向字节代替
void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=InvSbox[state[i][j]];
}
int main(){ unsigned char state[4][4]={
{0xea,0x04,0x65,0x85},{0x83,0x45,0x5d,0x96},{0x5c,0x33,0x98,0xb0},{0xf0,0x2d,0xad,0xc5}
};int i,j;//正向替换 Sub_Byte(state);
printf(“正向代替结果:n”);for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%x ”,state[i][j]);
printf(“n”);
}
printf(“n”);//反向替换
Inv_Sub_Byte(state);
printf(“反向代替结果:n”);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%x ”,state[i][j]);
printf(“n”);
}
}
其测试结果如下,可见该功能可实现是正确的。
4.2 行移位变换
#include
//行移位
void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;
} //第一行保持不变,第二行左移一位
temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp;
//第三行左移2位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;
temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;
//第四行左移3位
temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1];state[3][0]=temp;
//逆向行移位
void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;
//第一行保持不变,第二行右移一位
temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp;
//第三行右移二位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;
temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;
//第四行右移三位 temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;}
int main(){ int i,j;unsigned char state[4][4]={
{0x87,0xf2,0x4d,0x97},{0xec,0x6e,0x4c,0x90},{0x4a,0xc3,0x46,0xe7},{0x8c,0xd8,0x95,0xa6}
};
Row_Shift(state);printf(“正向行移位变换:n”);for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%02x ”,state[i][j]);
printf(“n”);
}
printf(“n”);
Inv_Row_Shift(state);
printf(“反向向行移位变换:n”);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%02x ”,state[i][j]);
printf(“n”);
} } 测试结果如下
通过比较,可知结果正确,因此该子模块实现。
4.3列混淆变换
#include
unsigned char x_time2(unsigned char state)//乘2处理
{
unsigned char temp;
if(state>=0x80)
temp=(state<<1)^0x1b;//判断b7=1?
else
temp=(state<<1);
return temp;}
unsigned char x_time3(unsigned char state)//乘3处理
{
state=state^x_time2(state);
return state;}
unsigned char x_time4(unsigned char state)//乘4处理
{
state=x_time2(x_time2(state));
return state;}
unsigned char x_time8(unsigned char state)//乘8处理14
{
state=x_time2(x_time2(x_time2(state)));
return state;}
unsigned char x_time9(unsigned char state)//乘9处理
{
state=state^x_time8(state);
return state;}
unsigned char x_timeB(unsigned char state)//乘B处理
{
state=state^x_time2(state)^x_time8(state);
return state;}
unsigned char x_timeD(unsigned char state)//乘D处理
{
state=state^x_time4(state)^x_time8(state);
return state;}
unsigned char x_timeE(unsigned char state)//乘E处理
{
state=x_time2(state)^x_time4(state)^x_time8(state);
return state;}
void MixColumns(unsigned char state[4][4]){
int i,j;unsigned char state_1[4][4];
for(i=0;i<4;i++)for(j=0;j<4;j++)
state_1[i][j]=state[i][j];
for(j=0;j<4;j++)
{
state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j];
state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j];
state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]);
state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} } //逆向列混淆
void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4];
for(i=0;i<4;i++)for(j=0;j<4;j++)
state_1[i][j]=state[i][j];
for(j=0;j<4;j++){
state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]);
state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]);
state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]);
state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]);} } int main(){ int i,j;unsigned char state[4][4]={
{0x87,0xf2,0x4d,0x97},{0x6e,0x4c,0x90,0xec},{0x46,0xe7,0x4a,0xc3},{0xa6,0x8c,0xd8,0x95}
};
MixColumns(state);
printf(“正向列混淆结果: n”);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%x ”,state[i][j]);
printf(“n”);
}
printf(“n”);
Inv_MixColumns(state);
printf(“逆向列混淆结果: n”);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%x ”,state[i][j]);
printf(“n”);
}
} 其测试结果如下:
通过比较,可知结果正确,因此该子模块实现。
4.4 轮密钥加
#include
{ //AES的S盒
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 };
//秘钥扩展
void key_Expansion(unsigned char key[16]){ int i,j,k;
unsigned char temp[4];//用于寄存w[i-1]
unsigned char t;
unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};
unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0},};
//轮常量
for(i=0;i<16;i++)//将输入秘钥复制到扩展秘钥数组的前四个字
{
ex_key[i]=key[i];
}
for(i=16;i<176;i+=4)//秘钥扩展
{
for(j=0;j<4;j++)
temp[j]=ex_key[i-4+j];//用于寄存w[i-1]
if(i%16==0)//对于w[i]中下标为的4的倍数要使用函数g来计算
{
//循环左移
t=temp[0];
for(k=0;k<3;k++)
temp[k]=temp[k+1];
temp[3]=t;
//字代替
for(k=0;k<4;k++)
temp[k]=Sbox[temp[k]];
//与轮常量相异或
for(k=0;k<4;k++)
temp[k]=temp[k]^Rcon[i/16-1][k];}
// 得到最后的w[i],w[i]=w[i-1]^w[i-4]
for(k=i;k
ex_key[k]=ex_key[k-16]^temp[k-i];
}
} //第k轮的轮密钥加
void RoundKey(unsigned char state[4][4],int k){ int i,j;
for(i=0;i<16;i++)round_key[k][i]=ex_key[16*k+i];//第k轮的轮密钥生成 for(i=0;i<4;i++)
for(j=0;j<4;j++)
state[i][j]=state[i][j]^round_key[k][4*j+i];
}
int main(){
unsigned char key[16]={0x0f,0x15,0x71,0xc9,0x47,0xd9,0xe8,0x59,0x0c,0xb7,0xad,0xd6,0xaf,0x7f,0x67,0x98};unsigned char state[4][4]={
{0xb9,0x94,0x57,0x75},{0xe4,0x8e,0x16,0x51},{0x47,0x20,0x9a,0x3f},{0xc5,0xd6,0xf5,0x3b}
};int i,j;
key_Expansion(key);
for(i=0;i<11;i++)
{
for(j=0;j<16;j++)round_key[i][j]=ex_key[16*i+j];//第k轮的轮密钥生成}
for(i=0;i<11;i++)
{
printf(“第%d轮密钥:n”,i);
for(j=0;j<16;j++)
{
printf(“%02x ”,round_key[i][j]);
if((j+1)%4==0)
printf(“n”);
}
printf(“n”);
}
RoundKey(state,1);
printf(“第一轮结束后的state输出:n”);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf(“%02x ”,state[i][j]);
printf(“n”);
}
return 0;} 扩展密钥数组如下:
经过比对,可知,密钥扩展是正确的。我又选取了第一轮的轮密钥加:
测试结果如下:
经过比对,可知道轮密钥加的结果是正确的。
4.5 AES的加密与解密的实现
(程序请见附录)参照书上给的例子: Plaintext[16]={ 0x01,0x23,0x45,0x67, 0x89,0xab,0xcd,0xef, 0xfe.0xdc,0xba,0x98, 0x76,0x54,0x32,0x10 } key[16]={ 0x0f,0x15,0x71,0xc9, 0x47,0xd9,0xe8,0x59, 0x0c,0xb7,0xad,0xd6, 0xaf,0x7f,0x67,0x98 };其理论结果为:
测试结果如下,经过比对可知结果正确。
4.6 CMAC代码实现
//先用k=128的加密秘钥key产生两个n位的秘钥key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n)
//计算k1=L*x,其中多项式为x^128+x^7+x^2+x+1
if(L[0]>=0x80)
//判断最高位是否是1,若是,则需要约化,即左移一位后,再异或1000 0111=0x87
{
for(i=0;i<16;i++)
key_1[i]=L[i]<<1;//左移一位
key_1[15]=key_1[15]^0x87;
} else {
for(i=0;i<16;i++)
key_1[i]=L[i]<<1;}
//产生key_2=L*x^2=key_1*x
if(key_1[0]>=0x80){
for(i=0;i<16;i++)
key_2[i]=key_1[i]<<1;//左移一位
key_2[15]=key_2[15]^0x87;
}
} else {
for(i=0;i<16;i++)
key_2[i]=key_1[i]<<1;}
//对消息不是密文分组的整数倍,要在分组最后右边填充1及若干个0 //*last_text是最后一个不完整分组,length是最后一组的长度,out_text是填充后的输出
void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i;
for(i=0;i<16;i++){
if(i out_text[i]=last_text[i]; else if(i==length) out_text[i]=0x80; else out_text[i]=0x00; } } void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l;int flag=0;//用于标记密文分组是否完整 unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中间数据 unsigned char key_1[16],key_2[16];//分组密钥 unsigned char last[16],Cn[16]; n=(length+15)/16;//用于确定分几组 last_l=length%16; k1_k2(key,key_1,key_2); if(last_l==0) flag=1;//表明是分组长度b=128的整数倍 if(flag==0) fill(&Mass[16*(n-1)],last_l,last);//对前n-1轮 for(i=0;i for(j=0;j<16;j++) M_C2[j]=M_C1[j]^Mass[16*i+j]; Encryption(M_C2,key,M_C1); } if(flag==1) { for(i=0;i<16;i++) M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i]; Encryption(M_C_K,key,Cn); } else { for(i=0;i<16;i++) M_C_K[i]=last[i]^M_C1[i]^key_2[i]; Encryption(M_C_K,key,Cn); } for(i=0;i<16;i++)mac[i]=Cn[i];} int main(){ unsigned char key[16],Mass[64],T[16]; int i,j,length; printf(“请输入消息(64byte):n”);//输入消息 for(i=0;i<64;i++) scanf(“%x”,&Mass[i]); printf(“请输入密钥: n”);//输入密钥 for(i=0;i<16;i++) scanf(“%x”,&key[i]); printf(“需要使用的次数repeat=:n”); scanf(“%d”,&repeat); for(i=0;i { printf(“请输入不同的密文分组长度length:n”); scanf(“%d”,&length); printf(“AES-CMAC输出结果: n”);AES_CMAC(Mass,key,length,T);for(i=0;i<16;i++) printf(“%x ”, T[i]);printf(“n”);} } 测试结果如下: 根据查阅的资料,可知测试结果是正确的。且从上述结果可知,对于不同的分组长度,输出结果相差很大。 5.思考题 1.AES解密算法和AES的逆算法之间有什么不同? AES解密算法与其逆算法不同点在于解密算法对密文是先进行轮密钥加(对AES-128而言其扩展密钥是w[40,43])然后开始第一轮的逆向求解,而逆算法时对加密算法的求逆,即将第十轮的算法倒推回去,所以这里有区别。这是由AES特定结构所决定的。 2.CMAC与HMAC相比,有什么优点? CMAC使用分组密码算法,而HMAC使用散列函数。因为HMAC是基于其所应用的hash函数的,若hash函数的结构存在缺陷,则HMAC的安全性就会大大降低。而CMAC的安全性采用的是分组密码算法,其安全性在于密钥的长度。CMAC的长度可以通过Tlen的变化而变化,输出位数更加灵活。 6.心得体会 首先,刚开始由于这方面知识掌握不是很好,在看完书后又查阅了大量资料,包括一些程序。在这样的一个基础上,对整个编程的思路有了一些认识,按照书本上的AES加密顺序,最先做的就是密钥扩展和轮密钥加。这个部分也是难度最大的部分,主要是输入的都是字节大小的,但密钥扩展后要求是以字为单位输出的。刚开始这个方面纠结了很久,最后为了整个程序比较清晰,还是决定全都以字节为单位,经过一定转换来得到相当于字的效果。 在完成密钥扩展且测试正确后,就开始按顺序设计,字节代替,行移位,列混淆。其中3盒和逆S盒是直接从网上下载的,其他的就是按照书上给的公式和流程图来完成,还是比较顺利的。其解密算法和加密算法也是大同小异的,只是在每个函数中修改一下相应的代码即可。在加密和解密算法都写完后,就是写main函数进行测试,刚开始发现结果总是不对,经过较长时间的查错,发现还是错在轮密钥加中数组转置引起的问题。 在AES设计万仇就是设计CMAC。关于这个程序书上涉及的也较少,但算法还是比较简单的,主要涉及产生两个子密钥和对不完整的分组填充。由于书上没有现有的例子可以参考,因此,我是参照其他同学的例子,进行比较,验证结果是正确的。 附录(完整程序) #include static unsigned char key[16];//输入秘钥 static unsigned char ex_key[176];//扩展密钥,其中每四个拼成的就是一个字的秘钥数组 //即w[i]=(ex_key[4*i],ex_key[4*i+1],ex_key[4*i+2],ex_key[4*i+3])static unsigned char round_key[11][16];//轮密钥 static unsigned char Sbox[256] = { //AES的S盒 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; static unsigned char InvSbox[256] = { // AES的逆S盒 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; //乘法处理部分 unsigned char x_time2(unsigned char state)//乘2处理 { unsigned char temp; if(state>=0x80) temp=(state<<1)^0x1b;//判断b7=1? else temp=(state<<1); return temp;} unsigned char x_time3(unsigned char state)//乘3处理 { state=state^x_time2(state); return state;} unsigned char x_time4(unsigned char state)//乘4处理 { state=x_time2(x_time2(state)); return state;} unsigned char x_time8(unsigned char state)//乘8处理 { state=x_time2(x_time2(x_time2(state))); return state;} unsigned char x_time9(unsigned char state)//乘9处理 { state=state^x_time8(state); return state;} unsigned char x_timeB(unsigned char state)//乘B处理 { state=state^x_time2(state)^x_time8(state); return state;} unsigned char x_timeD(unsigned char state)//乘D处理 { state=state^x_time4(state)^x_time8(state); return state;} unsigned char x_timeE(unsigned char state)//乘E处理 { state=x_time2(state)^x_time4(state)^x_time8(state); return state;} //秘钥扩展 void key_Expansion(unsigned char key[16]){ int i,j,k; unsigned char temp[4];//用于寄存w[i-1] unsigned char t; unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36}; unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0}, }; //轮常量 for(i=0;i<16;i++)//将输入秘钥复制到扩展秘钥数组的前四个字 { ex_key[i]=key[i]; } for(i=16;i<176;i+=4)//秘钥扩展 { for(j=0;j<4;j++) temp[j]=ex_key[i-4+j];//用于寄存w[i-1] if(i%16==0)//对于w[i]中下标为的4的倍数要使用函数g来计算 { //循环左移 t=temp[0]; for(k=0;k<3;k++) temp[k]=temp[k+1]; temp[3]=t; //字代替 for(k=0;k<4;k++) temp[k]=Sbox[temp[k]]; //与轮常量相异或 for(k=0;k<4;k++) temp[k]=temp[k]^Rcon[i/16-1][k];} // 得到最后的w[i],w[i]=w[i-1]^w[i-4] for(k=i;k ex_key[k]=ex_key[k-16]^temp[k-i]; } } //第k轮的轮密钥加 void RoundKey(unsigned char state[4][4],int k){ int i,j; for(i=0;i<16;i++) round_key[k][i]=ex_key[16*k+i];//第k轮的轮密钥生成 for(i=0;i<4;i++) for(j=0;j<4;j++) state[i][j]=state[i][j]^round_key[k][4*j+i]; } //字节代替变换 void Sub_Byte(unsigned char state[4][4]){ int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) state[i][j]=Sbox[state[i][j]]; } //行移位 void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp; //第一行保持不变,第二行左移一位 temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp; //第三行左移二位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp; temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp; //第四行左移三位,即右移一位 temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1]; state[3][0]=temp;} //列混淆变换 void MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4]; for(i=0;i<4;i++)for(j=0;j<4;j++) state_1[i][j]=state[i][j]; for(j=0;j<4;j++){ state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j]; state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j]; state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]); state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} } //前9轮每轮有4个步骤 void Round_4(unsigned char state[4][4], int k){ Sub_Byte(state);Row_Shift(state);MixColumns(state);RoundKey(state,k);} //第10轮有3个步骤 void Round_3(unsigned char state[4][4]){ Sub_Byte(state);Row_Shift(state);RoundKey(state,10);} //加密算法,明文 Plaintext,密文CipherText,密钥 key void Encryption(unsigned char Plaintext[16], unsigned char key[16], unsigned CipherText[16]) char { int i,j;unsigned char state[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) state[j][i]=Plaintext[4*i+j]; key_Expansion(key);//密钥扩展 //初始轮秘钥加 RoundKey(state,0);//1~10轮 for(i=1;i<10;i++) Round_4(state,i); Round_3(state); //产生密文 for(i=0;i<4;i++) for(j=0;j<4;j++) CipherText[4*i+j]=state[j][i]; } /*////////////////////////////解密////////////////////////////////*/ //逆向行移位 void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp; //第一行保持不变,第二行右移一位 temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp; //第三行右移2位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp; temp=state[2][1];state[2][1]=state[2][3]; } state[2][3]=temp; //第四行右移三位,即左移1位 temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;//逆向字节代替 void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j; for(i=0;i<4;i++) for(j=0;j<4;j++) state[i][j]=InvSbox[state[i][j]]; } //逆向列混淆 void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4]; for(i=0;i<4;i++)for(j=0;j<4;j++) state_1[i][j]=state[i][j]; for(j=0;j<4;j++){ state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]); state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]); state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]); state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]); } } //前9轮每轮有4个步骤 void Inv_Round_4(unsigned char state[4][4], int k){ Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,k);Inv_MixColumns(state);} //第10轮有3个步骤 void Inv_Round_3(unsigned char state[4][4]){ Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,0);} //解密算法,明文 Plaintext,密文CipherText,密钥 key void Dencryption(unsigned char CipherText[16], unsigned char key[16], unsigned char Plaintext[16]){ int i,j;unsigned char state[4][4]; for(i=0;i<4;i++) for(j=0;j<4;j++) state[i][j]=CipherText[4*j+i]; key_Expansion(key);//密钥扩展 //初始轮密钥加 RoundKey(state,10); //1~10轮 for(i=9;i>0;i--) Inv_Round_4(state,i);Inv_Round_3(state); //产生明文 for(i=0;i<4;i++) for(j=0;j<4;j++) Plaintext[4*i+j]=state[j][i]; } /*/////////////////////////CMAC////////////////////////////*/ //先用k=128的加密秘钥key产生两个n位的秘钥key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n) //计算k1=L*x,其中多项式为x^128+x^7+x^2+x+1 if(L[0]>=0x80) //判断最高位是否是1,若是,则需要约化,即左移一位后,再异或1000 0111=0x87 { for(i=0;i<16;i++) key_1[i]=L[i]<<1;//左移一位 key_1[15]=key_1[15]^0x87; } else { for(i=0;i<16;i++) key_1[i]=L[i]<<1;} //产生key_2=L*x^2=key_1*x if(key_1[0]>=0x80){ for(i=0;i<16;i++) key_2[i]=key_1[i]<<1;//左移一位 key_2[15]=key_2[15]^0x87; } else { for(i=0;i<16;i++) key_2[i]=key_1[i]<<1;} } //对消息不是密文分组的整数倍,要在分组最后右边填充1及若干个0 //*last_text是最后一个不完整分组,length是最后一组的长度,out_text是填充后的输出 void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i; for(i=0;i<16;i++){ if(i out_text[i]=last_text[i]; else if(i==length) out_text[i]=0x80; else out_text[i]=0x00; } } void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l; int flag=0;//用于标记密文分组是否完整 unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中间数据 unsigned char key_1[16],key_2[16];//分组密钥 unsigned char last[16],Cn[16]; n=(length+15)/16;//用于确定分几组 last_l=length%16; k1_k2(key,key_1,key_2); if(last_l==0) flag=1;//表明是分组长度b=128的整数倍 if(flag==0) fill(&Mass[16*(n-1)],last_l,last);//对前n-1轮 for(i=0;i for(j=0;j<16;j++) M_C2[j]=M_C1[j]^Mass[16*i+j]; Encryption(M_C2,key,M_C1); } if(flag==1) { for(i=0;i<16;i++) M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i]; Encryption(M_C_K,key,Cn); } else { for(i=0;i<16;i++) M_C_K[i]=last[i]^M_C1[i]^key_2[i]; Encryption(M_C_K,key,Cn); } for(i=0;i<16;i++)mac[i]=Cn[i];} /*///////////////////////////主函数//////////////////////*/ int main(){ unsigned char Plaintext_1[16]={0x00};unsigned char Ciphertext[16]={0x00};unsigned char Plaintext_2[16]={0x00};unsigned char Mass[64],T[16]; int i,j,length,repeat;//输入明文 printf(“请输入需要加密的明文 :n”); for(i=0;i<16;i++)scanf(“%x”,&Plaintext_1[i]); //输入密钥 printf(“请输入密钥:n”);for(i=0;i<16;i++)scanf(“%x”,&key[i]); //加密 Encryption(Plaintext_1,key,Ciphertext); printf(“加密后的输出密文:n”); for(i=0;i<16;i++) printf(“%02x ”,Ciphertext[i]); printf(“n”); //解密 Dencryption(Ciphertext,key,Plaintext_2); printf(“解密后的输出明文:n”); for(i=0;i<16;i++) printf(“%02x ”,Plaintext_2[i]); printf(“n”); //CMAC printf(“请输入消息(64byte):n”);//输入消息 for(i=0;i<64;i++) { printf(“%02x ”,Mass[i]); if((i+1)%8==0) printf(“n”); } printf(“需要使用的次数repeat=:n”); scanf(“%d”,&repeat); for(j=0;j { printf(“请输入不同的密文分组长度length:n”); scanf(“%d”,&length); printf(“AES-CMAC输出结果: n”); AES_CMAC(Mass,key,length,T); for(i=0;i<16;i++) printf(“%02x ”, T[i]); printf(“n”); } 经过中国合格评定国家认可委员会(CNAS)认可的检测校准实验室承担着对社会出具公证性的检测报告、校准证书等任务。在日常的检测校准实验室工作中,科研人员用了大量的精力在做一些查找和填写原始数据、重新计算不确定度等重复性的工作,影响了我们的工作效率,降低了工作效果。如果能够设计一套检测报告生成系统,能够智能完成数据的录入、检索、结果生成,便于科研人员修改和进一步编程,能够对原始数据、不确定度、报告等信息进行统一管理,将会大大的提高日常的工作效率。经试验研究利用Excel2007结合VBA可有效满足需求。 1 需求分析 “检测校准实验室检测报告生成系统”需要完成的功能有:完成各实验室的原始数据输入与存储、环境条件记录、不确定评定、检定-校准-检测报告的自动生成、存储和打印。操作界面简单、友好,方便二次开发。 Excel2007是Microsoft公司开发的Office系列软件之一,已经广泛的应用到办公自动化工作中来。相对以前的版本,其开发工具选项被单独列出,更方便使用者的二次开发。而且其具有更为友好的输入操作和控制界面,拥有优秀计算能力,普通人易于上手和操控,是一个非常优秀的报表制作软件。VBA是EXCEL中宏编辑功能,是VB以EXCEL的宿主的编程软件。用VBA可以通过代码和控件来读写Excel表格中的数据,可以控制Excel使其生成优秀的报表。 2 设计规划 2.1 功能描述“检测校准实验室检测报告生成系统”可以按照 预先制定的模板,分别填写“样品基础信息”、“检测基础信息”、“不确定评定”;对“报告”进行确认、存储、打印;报告的模板可以根据需求做二次修改、重复性的数据从数据库中选取即可;数据库的内容方便报告管理者进行修订。 2.2 结构设计 根据功能描述的要求,对于需求进行建模。所采用的方法就是“实体—联系”方法(Entity-Relationship Approach)。该实体联系模型简称E-R图。其中“检测校准实验室检测报告生成系统”E-R图(图1)可以说明该软件系统的设计的逻辑和思想。本项目所建立的E-R图如下: 3 编程实例 下面以国家海洋标准计量中心水处理设备检测部的“检测校准实验室检测报告生成系统”的编程为例来解释如何使用VBA操作Excel2007从而出具有效的检测报告。该系统采用的是VB代码控制自动化的流操作结合Excel自身嵌合的核心算法与数据库进行的。 3.1 开发平台激活 在VBA中要想调用Excel,需要打开VB编程环境。具体方法是:Excel2007选项-常用-在功能区显示“开发工具”选项卡,选择“开发工具”-“设计模式”即可进入到VBA编程界面。 因为EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素[1]。 第一层:Application对象,即Excel本身;第二层:workbooks对象集,指Excel的工作簿文件;第三层:worksheets对象集,表示的是Excel的一个工作表;第四层:Cells和Range对象,指向Excel工作表中的单元格。 3.2 界面设置 根据本项目的需求,将workbooks中设立如下几个worksheets:主选择页面1个、数据库页面1个、报告模板页面1个、基础信息输入页面N个、检测原始数据页面N个、不确定度页面N个。根据本部门的授权检测项目,对N进行设定。分别建立了设定了“平板微滤膜检测”、“中空超滤膜检测”等8个子项目,即N为8。然后在“开发工具”-“插入”-“Active控件”中选择需要的控件进行选择,采用Visual Basic控件和代码对所操作的对象进行读取和写入。在主页选择页面、基础信息输入页面(图2)、数据库页面、报告模板页面、检测原始数据页面、不确定度页面利用VBA控件分别进行设定和数据存储。 3.3 系统的核心代码 3.3.1信息输入选择的实现: 3.3.2不同截留物质选择项目联动的实现: 3.3.3生成按钮的激活 3.3.4报告生成和打印 MsgBox"报告生成完毕,请到"D:检测报告"目录下再次校对、打印。" Else MkDir FilePath'建立保存路径 End If Shell"explorer.exe"&Chr(34)&FilePath&Chr(34),vbNormalFocus'打开报告存储目录 3.4 其他编程说明 3.4.1 报告模板的设计 本报告的模板将单页分为233*98个单元格,行高和列宽分别设为0.11cm和0.16cm。这样设置便于处理正式报告页面格式的个性化需求。通过合并单元格的方法,可以设计出适合于各种需求的报告模板。 3.4.2 下拉列表框的设置 下拉列表框ComboBox可根据需求,建立一个系列。在每个拉列表框的属性中分别设置ComboBox(n).ListFillRange的数值,例如将其数值设为“数据库!﹩W﹩3:﹩W﹩13”意味着该下拉列表框中的数据列表采集自“数据库”页面的“W3:W13”单元格。 3.4.3 报告页数的确认 由于每种产品的检测项目不同,所以出具的报告页数也不同。在设计模板时,应设计出超过最多报告数50%的报告页面备用。报告页面数量的判断可以通过在“主页选择页面”中每个按钮控件单击事件的过程中进行赋值来完成。在点击“生成报告”按钮控件的事件中判断删除多少页面,保留多少页面。 4工作流思想的探讨 “工作流”是一系列相互衔接、自动进行的业务活动或任务。将整个业务过程看作是一条河,其中流过的就是工作流。人与电脑共同工作的自动化协调、控制和通讯,在电脑化的业务过程上,通过在网络上运行软件,使所有命令的执行都处于受控状态。在工作流管理下,工作量可以被监督,分派工作到不同的用户达成平衡。 虽然通过Excel2007结合VBA设计的单机版“报告生成系统”能够较好的满足我们日常出具检测报告的需求。然而如果能很好的结合“工作流”的思想,将检测报告每个部分进行模块化授权,使不同参与出具检测报告的工作人员根据各自的权限对不同的模块进行操作,这样将会更好的提高我们的工作效率。 笔者认为,关于Excel2007编程的“工作流”设计,可以采用SQLserver服务器将局域网内的各台参与的计算机联系起来,Excel2007生成的程序模块对不同计算机的授权。这项功能有望通过设计第三方软件得以实现[2]。 参考文献 [1]王宏升.利用计算机打印检定证书、校准报告的方法[J].计量与测试技术.2004,6:46-48. 关键词:本土母语音乐 校本课程开发 课堂教学 实验报告 红河 一、问题的提出 1.国内新一轮基础教育课程改革启动并进入实施阶段。2001年教育部《基础教育课程改革纲要(试行)》的颁布,为我国基础教育课程改革的启动拉开了序幕,而《课程标准》及新教材的编写和试用标志着课程改革已进入具体实施阶段,是建国以来规模最大、改革力度最大、国家投入资金最多的一次课程改革,涉及培养目标的变化、课程结构的调整、国家课程标准的制定、课程实施与教学改革、教材改革、课程资源的开发、评价体系的建立和师资培训以及保障支撑系统等,可以肯定此举必将牵动整个基础教育的全面改革。 2.我国素质教育全面推进和三级课程管理制度正式实行。以校为本的“关注学生实际发展需要、关注教师专业研究能力、关注学校办学特色构建”的新一轮基础教育课程改革“校本课程开发”应运而生,并将成为我国今后至少三十年内课程改革的重大课题。以此为契机,我国少数民族地区音乐教育发展方向应立足于本区域的母语音乐,其核心动力及培养目标应着重放在本土情感的回归上,并通过课堂教学体系的长期探索与不断完善推动母语音乐教育的发展进程。 3.真正发展以“中华文化为母语”的音乐教育新体系。毋庸置疑的是,早在1995年12月广州召开的第六届国民音乐教育改革研讨会上提出的“以中华文化为母语”的音乐教育新理念,就是要把学校基础音乐教育作为少数民族本土母语音乐传承的主要基地,在少数民族地区着力发展本土母语音乐教育,以推行这一新理念的具体实践。只有这样,我国边疆少数民族地区的民族音乐才能得以有效挖掘、整理和研究。然而,这些少数民族本土母语音乐在当前学校基础音乐教育中的发展地位和课堂教学如何,是问题提出的关键因素。 4.只有民族的才是世界的。中国民族音乐是世界音乐的重要组成部分,而作为我国民族音乐组成部分的少数民族本土母语音乐则是汉族音乐之外的重要音乐存在。从当前的相关情况看,汉族音乐因其人口等多方面的因素在传承上占据着绝对优势,而各少数民族的本土母语音乐却不同程度地面临着“传承逐步断层,情感不断流失”的尴尬局面,并伴随着失传或正在失传的危险,即使以非物质文化遗产的形式保护起来也是有局限性的,非物质文化遗产不能成为没有发展的传承。 5.新世纪对人才的挑战。以人为本的国家发展战略首先重视的是人才,人才的培养除借鉴外部力量外,最终还是要立足本国本民族的传统和创新。飞速发展的信息社会强烈地冲击着世界各国各个民族本土母语音乐的传承与发展,而中国因受“欧洲音乐中心论”和“汉族音乐优势论”的影响,致使我国边疆少数民族地区的本土母语音乐正面临“沙漠化”的严峻挑战,其形势的紧迫性已刻不容缓,故而探讨本土母语音乐校本课程开发问题已形势紧迫了。改观这一形势的有效途径是鼓励和探索学校基础音乐教育不同民族区域实施不同民族音乐校本课程开发模式。 二、指导性思想 1.彰显人文内涵。中国当代先进文化的建立是以弘扬本土民族的优秀文化传统为核心内容的,汉族之外55个少数民族的“本土母语音乐”则正是这一核心内容的重要组成部分。如何将其融入学校音乐教育,使之得到更广泛、更深入的传承与发展,通过“校本课程开发”则是其彰显人文内涵最行之有效的途径和方法。 2.聚合教育资源。课程改革是教育改革的核心内容,是提高人才培养质量的关键,而校本课程问题正成为当前我国基础教育课程改革的一个焦点。无论是作为推动基础教育课程教学改革的音乐学科,还是作为推进素质教育教学目标的音乐学科,在我国尤其是在少数民族地区的多民族环境下“本土母语音乐”进入“校本课程开发”的范畴是必然的。而本土母语音乐的校本课程开发过程,也正是将弱势的本土文化整合、聚集并融入课程和引入课堂的过程。从学校基础音乐教育改革的层面看,聚合教育资源是改观这一局势的最佳选择。 三、理论性依据 1.从“本土母语音乐”与“校本课程开发”的本质内涵思考,二者之间有着不同的社会需求功能,前者承载着强烈的社会情感功能,而后者则承载着浓厚的社会教育功能。事物的最终发展取决于实践与理论的互动效应,“本土母语音乐”与“校本课程开发”的结合本身就内涵着实践与理论的一种互动关系,其效应将直接促进“本土母语音乐”与“校本课程开发”的共同发展与繁荣。对于我国以“校本课程开发”为重点的课程改革和以“中华文化为母语”的音乐教育而言,音乐课程改革下的本土母语音乐将直接促进音乐教育的健康发展,音乐教育主导下的本土母语音乐也将直接推动音乐课程的改革进程。 2.新世纪是以知识的创新与应用为特征的知识经济时代,尤其创新人才的培养已成为影响整个民族生存和发展的关键。应对这种挑战则迫切需要基础教育加快全面推进素质教育的步伐,并培养具有创新精神和实践能力的人才。基础教育课程改革是促进素质教育取得突破性进展的关键环节,而基础音乐教育课程改革则是关键中的关键。通过本土母语音乐校本课程开发这一举措,在音乐实践活动中,逐步培养学生的民族审美情趣和独立的民族自主创新意识,并潜移默化地增强学生的民族情感意识,最终达到素质教育音乐课堂教学所应有的整体效益。 四、实验准原则 1.教育与情感相结合原则:培养学生全面发展,提高人的精神境界,塑造人的情感主体意识。音乐教育是情感的教育,母语音乐教育则是培养民族情感的重中之重。 2.审美与实践相结合原则:让学生在音乐实践活动中树立正确的审美趣向,在本土母语音乐的熟悉过程中激发人文主体情感,发展音乐创造力和培养音乐实践能力。 3.知识与技能相结合原则:教学实验要侧重民俗学与音乐学的融合,深层挖掘本土音乐文化的内涵结合音乐技能训练,探求音乐实践能力的综合培养。 4.因材施教与面向全体原则:实验过程既要关注全体学生发展的共同规律与特点,又要承认和关注学生个体差异而不忽略学生个性发展、不放弃学生“慢性”发展。 5.寓教于乐与快乐课堂原则:音乐教学的课堂一定要快乐,避免死硬的说教和枯燥的灌输,通过优美感人的音乐艺术形象唤起学生的求知情感,在快乐中自愿自然地接受美,学习从聆听开始。 6.科学系统与循序渐进原则:音乐是一门学科,音乐教育则是一门科学,其课堂教学有其内在的科学性和系统性,无论是母语本身的含混不清还是音乐本身艰涩难懂,都需要循序渐进。 五、方法与过程 音乐教育的主导在于音乐教师的教学,而我国边疆少数民族地区在因地制宜地将本土母语音乐全面引入课堂教学时,其教学的关键则在于确立并完善一套科学的建立在本土母语音乐内容基础上的教学模式。本土母语音乐素材的教法研究是重中之重,其核心在组织原则上是对音乐教学模式的研究。查有梁在《教育建模》一书中说:“模式是一种重要的科学操作与科学思维的方法”,它是“处于实践和理论之间的中介方法”。通过教学模式的构建,能把教学实践上升为教学理论,反过来又给实践以指导。实验过程就是构建教学模式的过程,应遵循“教学有法,教无定法”的原则,应遵循“教学有模,教无定模”的规律和要求给音乐课程改革提供反馈信息,从而加快音乐课程改革的进程,加大音乐教育改革的力度。 本土母语音乐与校本课程开发的内在联系以及二者在结合过程中所产生的实践应用层面上的灵活性、有效性和可操作性问题,是本土母语音乐校本课程开发的主题之所在。相关教学实验以红河区域音乐素材为例—— 1.第一阶段——实验课前准备阶段:一方面收集并分析“校本课程开发”的相关政策及理论,教育学提供的相关文献资料和研究成果将有效地解决“校本课程开发理论”中的疑难问题;另一方面把握当前形势下红河区域本土民族的母语音乐课程资源之挖掘、整理与研究的深度和广度,尤其是彝族和哈尼族的民间音乐通过走出去实地采风和请进来学习艺人都是行之有效的方法。 2.第二阶段——实验课堂模式探索:本土母语音乐校本课程开发在模式上是不固定的,但有一个基本模式观念是:开发内容要因地制宜,内容设置要因人而异。 一方面要注重内容与形式的两相融合:红河区域有10余个世居民族,其本土母语音乐多彩纷呈,当然其繁杂性也是不言而喻的。从课堂教学的适用对象考虑,可以从红河区域的哈尼族和彝族的代表性民族歌舞素材音乐入手,以校本课程的简约灵活为框架,结合音乐学“雏形→原型→变型→无型”的“传统与创新”方法开展课堂教学,具体素材选择如红河建水彝族民歌《采花行》、《郎采合》等,当然使用民间小调如《螃蟹歌》、《鲜花调》等也是不错的选择。总之一个准则:优美、熟悉、简练。校本课程开发的表层模式在于把“音乐学中的本土母语音乐资源”和“教育学中的校本课程开发理论”进行内容与形式的两相融合,其实质是音乐教育学效应。 另一方面要注重实践与理论的两相互动:事物的最终发展取决于实践与理论的互动效应。本土母语音乐校本课程开发的深层模式是在对各个区域民族“本土母语音乐”了解与把握和对基础教育课程改革“校本课程开发”学习与研究的双层基础上拟行展开的,是实践与理论的两相互动,是探索适合不同区域民族特色的校本化音乐教育体系的构建基础。这一构建过程,将逐步提高我们对民族母语音乐文化的认知水平,将进一步增强我们的民族本位意识,并对弘扬民族优秀文化传统以及当代先进文化的建设都将有着非常积极的理论意义和实践意义。随着实践与理论的互支互动不断深入,本土母语音乐校本课程开发在基础音乐教育课程改革中成熟起来的方法基础,又可为艺术教育的其他姊妹学科的校本化课程建设提供宝贵的研究经验。 3.第三阶段——实验课后完善阶段:主要是教师课后的自我评估以及学生的信息反馈,当然最终还是要落实到教师完善的课堂设计和课堂教学上。我们注意到音乐教育改革中,课程改革是音乐教育改革的核心内容,少数民族地区音乐教育应着重发展不同地区不同民族的特色音乐教材,致力于实施富有本区域民族特点的本土母语音乐教育,其教师除具有基本的音乐知识和技能外,同时还应具备与本土母语音乐教材建设相适应的“教学手段和教学理念”以及“教学风格和教学心理”等,这些素质的培养途径大多需要在“职后继续教育”中实现,任重而道远,但前景可观。 六、实验数据链 本土母语音乐校本课程开发的着力点在于如何结合校本课程“关注学生实际发展需要、关注教师专业研究能力、关注学校办学特色构建”上,这“三个关注”的实际成效最终还是要落实在课堂教学过程中。本次教学实验重点放在红河本土主体民族哈尼族和彝族母语音乐“课堂教学应用谱例”的开发和设计上,其方法与过程按照上述第二阶段实验课堂模式探索,在内容与形式的融合上,采取“欣赏学习从聆听开始→情感认知从素材入手”的启蒙式课堂,逐渐进入“单素材多变→多素材组合”的兴趣式课堂,进而呈现“改编→综合”的创新式课堂,这样一个从“启蒙→兴趣→创新”的课堂过程即是本土母语音乐与校本课程开发在实践与理论互动中的过程,同时也是对民族文化继承与发展的过程。由此,我们的实验数据链设计如下图: 本实验数据链的设计项目均为变量数据参考,不存在固定值因素,即从“民族民间音乐文化”的课堂过程到“创新意识”的目标培养不受上图“九个点”的绝对比例影响,而是由课堂主体(包括不同年级不同程度班级与相同程度班级不同程度学生)和课堂主导(包括不同程度专业教师)决定各因素影响浮动比例,进一步讲这一课堂过程的目标培养不局限于学生共性和教师个性。从长远看,这种实验数据链的比例是多变的,是全体学生发展、教师个体发展和学校特色发展的核心因素数据链。 本实验数据链对教师的课堂教学及教学课型(包括专项课和综合课)不要求有固定的教案,但一定要有丰富多元的教案设计,不仅要有教学内容的共性体现,还要有教学对象的个性表达。这一长期的摸索过程对教师的执教素质和学生的学习品质都是双赢的。事实将证明:本土母语音乐的校本化建设是音乐学科教育发展的有效途径。限于篇幅,详细内容与动态数据恕不细述。 七、面临的问题 对于一项极富创新意识的教学实验而言,其过程出现一些困扰和疑惑在所难免,但俗话说“办法总比问题多”,作为新时代的音乐教育工作者,我们相信,以扎实的专业基础和丰富的教学经验,以及对民族音乐文化的浓厚兴趣和不遗余力的创新热情,本土母语音乐校本课程开发从“强化意识”到“规范过程”再到“目标实现”,虽任重而道远,但展望前景令人卓然欣慰。在本实验过程中我们面临的问题以及解决的办法: 1.实验过程中对本土母语音乐从民族音乐学角度展开研究的知识欠缺。针对这一问题我们主要采取“专家讲座和实地采风”相结合的办法解决,依靠民族音乐学方面的专家学者开展讲座以及与民间艺人直接贴身感受。 2.实验过程中对校本课程开发理论在广度和深度上的理解偏差。针对这一问题我们主要采取“独立钻研与集体研讨”相结合的办法解决,依靠积极主动的个人主观能动性和集体奋发向上的团队精神解决实际问题。 3.课堂教学实验阶段出现的一些新问题、新情况,有可能造成执教者失去信心、思维混乱。针对这一问题我们主要采取“教学模式与理性反思”相结合的方法解决,在课堂上善于发现新问题并不断革新教学具体模式,在课下善于反思新情况并理性看待教学实际效果。 八、实验准结论 实验结果是实验预期目标的最后回应,但需要说明的是,本实验客观地讲只有准结论而没有定结论,艺术学科不是所有的教学实验都必须要有定结论。本实验结果之所以存在“准”的定性,在于本土母语音乐校本课程开发在课堂教学应用层面上可能缺乏操作上的灵活性,从时间上可能也难以完成预期方案,其教学的有效性有待更大范围内更长时间的教学实体进行尝试。针对这一情况我们只能“具体对象具体分析具体应对”地摸着石头过河,依靠不同学校的不同条件借鉴其理论的不同角度的不同理解,在教学过程中用最小的资金投入争取最大的教学成效。本实验的准结论是:①传统音乐教育培养出来的师资基本不具备本土母语音乐的从教能力,通过本实验明显改观,主要表现在民俗民风的母语文化方面;②大多数学生从独钟现代流行音乐到关注本土母语音乐的兴趣意识大为改观,主要表现在对本土情感的回归上。 九、反思与展望 兴趣是最好的老师,兴趣因需要和欲望而产生,一件事情如此,一项事业更是如此。中国音乐教育必须走民族化道路毋庸置疑。在本土母语音乐校本课程开发中,无论教师和学生,这种兴趣在心理上和课堂上都实际地经受着“作品聆听困难,美感认知模糊,情感体验受阻”的三重障碍。但随着必要的硬件设施如音响资料和教学设备等投入力度加大所带来的课堂氛围将得到改善,以及在必须的软件需求如大到教师的在岗培训和小到教师的教案设计等方面下大功夫、下真功夫,这三重障碍必将突出重围。 参考文献: [1]戴定澄.音乐教育展望[M].上海:华东师范大学出版社,2001. [2]刘 沛.音乐教育的实践与理论研究[M].上海:上海音乐出版社,2004. [3]曹 理.普通学校音乐教育学[M].上海:上海教育出版社,1993. [4]查有梁.教育建模[M].广西:广西教育出版社,1998. [5]鱼 霞.情感教育[M].北京:教育科学出版社,1999. [6]杨恩寰.审美教育学[M].沈阳:辽宁大学出版社,1978. [7]崔允漷.校本课程开发:理论与实践[M].北京:教育科学出版社,2000. [8]刘旭东 张宁娟 马丽.校本课程与课程资源开发[M].北京:中国人事出版社,2002. 课程名称 面向对象程序设计 实验项目名称 Java开发环境实验 学生姓名 专业班级 学号 一.实验目的和要求 1. 建立并熟悉Java开发环境,熟悉Eclipse集成开发环境 2. 能够编写简单的Java应用程序 二.实验内容 1.安装和配置Java SDK 2.安装和配置Eclipse集成开发环境 3.编写在屏幕上输出信息的Java应用程序 三.实验结果与分析(可将程序运行结果截屏,也可简单分析运行结果) 1.用Java SDK开发屏幕输出“Hello World”的程序。程序运行结果如下: 2.用Eclipse开发屏幕输出“Hello World”的程序。程序运行结果如下: 3.用Java SDK开发屏幕输出“你好,我开始学OOP了”的程序。程序运行结果如下: 4.用Eclipse开发屏幕输出“你好,我开始学OOP了”的程序。程序运行结果如下: 四.讨论、心得(可写遇到的问题及解决方法,或者对技术的理解等) 1.public类有何特点? 有public的类可以在包外使用,否则不可以,与此同时,源文件名必须和类名相同。 2.Java语言是否区分大小写? JAVA语言本身是区分大小写的,但是在用文件路径、文件名对文件进行操作时,这里的文件名和路径是不区分大小写的,这是因为文件系统不区分大小写。 3.JVM和JRE都是什么? JVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java运行环境(Java Runtime Environment,简称JRE)是一个软件,由太阳微系统所研发,JRE可以让电脑系统运行Java应用程序(Java Application)。 JRE的内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类函数库(Class Library)。 4.Java如何做到平台无关的? 课 程 设 计 报 告 专 业: 计算机应用基础 系 别: 信息工程系 报 告 人: 徐 蒙 奇 班 级: 计 1131 指 导 教 师: 周洁 杨静 AE课程设计报告 徐蒙奇 软件简介 现在影视媒体已经成为当前最大众化,最具有影响力的媒体表现形式。从好莱坞创造的幻想世界,到电视新闻所关注的现实生活,再到铺天盖地的广告,无一不影响到我们的生活。 过去,影视节目的制作是专业人员的工作,对大众来说似乎还蒙著一层神秘的面纱;十几年来,数字合成技术全面进入影视制作过程,计算机逐步取代了原有的影视设备,并在影视制作的各个环节中发挥了巨大的作用。但是,在不久前影视制作所使用的一直是价格极为昂贵的专业硬件和软件,非专业人员很难见到这些设备,更不用说用它来制作自己的作品了。 但现在,随著PC性能的显著提高,价格不断降低,影视制作从以前的专业硬件设备逐渐向PC平台上转移,原来身份极高的专业软件也逐步移植到PC平台上来,价格日益大众化,同时影视制作的应用也扩大到电脑游戏,多媒体,网络等更为广阔的领域,许多这些行业的人员或业余爱好者都可以利用手中的电脑制作自己喜欢的东西了。 合成技术指将多种素材混合成单一复合画面的。早期的影视合成技术主要在胶片,磁带的拍摄过程及胶片洗印过程中实现的,工艺虽然落後,但效果是不错的。诸如,“扣像”、“叠画”等合成的方法和手段,都在早期的影视制作中得到了较为广泛的应用。与传统合成技术相比,数字合成技术,利用先进的计算机图像学的原理和方法,将多种源素材采集到计算机里面,并用计算机混合成单一符合图像,然後输入到磁带或胶片上的这一系统、完整的处理过程。 理论上,我们我们把影视制作分为前期和后期。前期主要工作包括诸如策划,拍摄,及三维动画创作等工序;当前期工作结束后我们得到的是大量的素材和半成品,将它们有机的通过艺术手段结合起来就是后期合成工作。 至此,可以引出本文主角——After Effects(简称AE)了,后期合成软件的佼佼者!它可以非常方便地调入Photoshop,Illustrator的层文件;Premire的项目文件也可以近乎完美的再现于AE中;甚至还可以调入Premire的EDL文件。新版本还能将二维和三维在一个合成中灵活的混合起来。用户可以在二维或者三维中工作或者混合起来并在层的基础上进行匹配。使用三维的层切换可以随时把一个层转化为三维的;二维和三维的层都可以水平或垂直移动;三维层可以在三维空间里进行动画操作,同时保持与灯光,阴影和相机的交互影响!并且AE支持大部分的音频,视频,图文格式,甚至还能将记录三维通道的文件调入进行更改。 在PC的视讯应用上,由Adobe公司所研发的Premiere与After Effect等数字影片编辑产品,多年来一直是业界使用最频繁的软件,在国内也有非常多的学校系所,或是私立的计算机学院是以这两套软件相互搭配,来做为影片后制的授课内容。 另一方面,许多第三协力厂商也研发专供这两项产品作为外挂(plug-ins)之用的外挂程序,使得Premiere与After Effect主程序功能更增添实用性与便利性。 让您的创意栩栩如生,Adobe After Effects软件可以帮助您高效且精确地创建无数种引人注目的动态图形和震撼人心的视觉效果。利用与其他Adobe软件无与伦比的紧密集成和高度灵活的 2D和3D合成, 以及数百种预设的效果和动画,为您的电影、视频、DVD和Macromedia Flash 作品增添令人耳目一新的效果。 AE课程设计报告 徐蒙奇 一实训目的 在老师的指导下,培养学生的影视后期处理的综合能力,包括视频的设计,素材设计,特效应用以及输出合成,培养学生影视视频的脚本设计,综合创意能力。 使学生能熟练使用软件的工具和插件,灵活运用软件实现设计内容,初步开展艺术设计。全方位培养动手设计能力强的影视广告设计师;具备扎实的操作视频编辑软件的技能,熟练掌握各软件间的协调和整合运用,为将来能够轻松胜任各行业的影视广告设计师岗位,从事广告、宣传、影视动画设计相关工作的人员或有兴趣从事影视广告设计工作鉴定基础。 通过这次课程设计,巩固加深所学习的知识,培养学生查阅资料的习惯,提高学生独立思考、分析、解决问题的能力。 AE课程设计报告 徐蒙奇 二 实训题目 第一天 第二天 第三天 第四天 第五天 第六天 第七天 第八天 第九天 第十天 主持人的三维效果 主持人的三维效果 舞动的光线 穿越城市的光线 涂鸦的墙 汽车水墨广告 综合案例一:美丽嫁期 综合案例一:美丽嫁期 制作课程设计汇总视频并着手课程设计报告完善课程设计报告及作品展示答辩 AE课程设计报告 徐蒙奇 三 实训结果 美丽假期: 舞动的光线: AE课程设计报告 徐蒙奇 穿越城市的光线: 主持人三维效果: AE课程设计报告 徐蒙奇 四 心得 通过此次课程设计,使我更加扎实的掌握了有关AE方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。 过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。课程设计,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了很多在平时上课中不太接触的知识,并且能够熟练的运用所学的知识建造各种有难度的图片,让我更加熟练的运用了AE这个软件,也学习了如何去渲染图片,也体会到了渲染的区别,更学会了修改场景。 我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结 AE课程设计报告 徐蒙奇 合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。 实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。 此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。经过了两周的AE专业课堂的实训,从中学到了很多,也感悟了很多。 之前对影视合成这门课没怎么深入的学习,学到的东西自然而然就很少,很多的工具都不懂得用,导致之前很多效果都弄不出来。原因是少做。从不懂到懂,再到熟练。这就是此次实训所达到的成果。 【ae开发实验报告】相关文章: 软件开发工具实验报告06-01 软件开发技术基础的实验报告05-24 网络信息资源开发与利用实验报告05-18 ae实验报告04-25 创新实验开发06-27 信息系统开发 实验心得07-24 楚雄开发区实验小学04-21 海安开发区实验中学07-21 安卓开发实验指导书08-05 特校书画课题开发实验论文04-26篇3:ae开发实验报告
篇4:ae开发实验报告
篇5:Java开发环境实验报告
篇6:AE 实训报告