2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法、密码杂凑SM3算法、分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等。
第1节 SM2非对称密码算法原理
国密SM2算法是商用的ECC椭圆曲线公钥密码算法,其具有公钥加密、密钥交换以及数字签名的功能。椭圆曲线参数并没有给出推荐的曲线,曲线参数的产生需要利用一定的算法产生。但在实际使用中,国密局推荐使用素数域256 位椭圆曲线,其曲线方程为y^2= x^3+ax+b。参数如下:
其中p是大于3的一个大素数,n是基点G的阶,Gx、Gy 分别是基点G的x与y值,a、b是随圆曲线方程y^2= x^3+ax+b的系数。
第2节 SM3密码杂凑算法原理
杂凑密码算法又称为哈希密码算法或散列密码算法,其可以将任意长度的字符串作为算法输入,并输出固定长度的字符串。当算法的结构设计足够精妙复杂时,基本上可以做到对于任意输入都有唯一确定的输出与之对应,相反该输出也可以唯一标识该输入。
一般可以从两个角度对杂凑算法安全性能进行评估:
1.计算不可逆性:即给定一输入消息A的杂凑值H(A),要得到原消息A在计算上是不可行的;
2.抗碰撞性:即给定一消息B,找到消息B?使H(B)=H(B')在计算上是困难的。
网络安全领域中,较为常用的杂凑算法主要有MD5、SHA-1以及SHA-256等,都具有良好的计算不可逆性以及抗碰撞性。但在2004年,由王小云教授提出的杂凑碰撞算法,极大地降低了对MD5以及SHA-1算法实施碰撞攻击的时间复杂度。
经过多年的研究,由王小云教授主导设计的SM3杂凑密码算法正式推出,该算法可以用于各类密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。
国密SM3商用密码杂凑算法应用于数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。对于长度为l(l<264)比特的信息,SM3杂凑算法经过填充和迭代压缩,生成杂凑值,其杂凑值长度为256比特(32字节),其安全性与SHA256相当。
第3节 SM4分组密码算法原理
国密SM4算法是一个对称分组密码算法,该算法的分组长度为16字节,密钥长度也为16字节。加密算法与密钥扩展算法都采用32轮非线性迭代过程,解密算法与加密算法的过程相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。SM4算法支持的四种加密模式如下表所示:
SM4 分组算法4种模式及安全MAC的算法标识如下表所示:
第4节 PYTHON实现
python实现代码已上传码云。
4.1 SM2测试截图
python3实现的国密SM2+SM3,SM3包括KDF功能,可配合SM2加解密(SM2调用了SM3模块)。SM2实现了各种素域下的签名、验签和加解密功能。
截图体现了SM2对“你好”的加解密过程。4.2 SM3测试截图
python编写的SM3密码杂凑算法代码。
对字符串abc、 abcd*16进行测试,结果如图:
4.3 SM4测试截图
python实现的国产加密sm4算法。
测试了ecb和cbc两种模式:
第5节 遇到的问题与解决过程
5.1 问题一
python中出现Non-ASCII character '\xe7' in file sm2.py on line 6, but no encoding declare的错误。可按照错误建议网址查看http://www.python.org/peps/pep-0263.html,发现是因为Python在默认状态下不支持源文件中的编码所致。解决方案有如下三种:
1)在文件头部添加如下注释码:
# coding=<encoding name>
例如,可添加# coding=utf-8
2)在文件头部添加如下两行注释码:
#!/usr/bin/python
# -*- coding: <encoding name> -*- 例如,可添加# -*- coding: utf-8 -*-
3)在文件头部添加如下两行注释码:
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
例如,可添加# vim: set fileencoding=utf-8 :
5.2 问题二
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 产生原因:因为默认情况下,Python采用的是ascii编码方式,而Python在进行编码方式之间的转换时,会将unicode 作为“中间编码”,但unicode最大只有128那么长,所以这里当尝试将ascii编码字符串转换成"中间编码" unicode时由于超出了其范围,就报出了如上错误。
有的解决办法参见cnblogs、csdn。但具体我是换了python3.7版本直接运行通过的。
5.3 问题三
python模块以及导入出现ImportError: No module named ‘xxx‘问题。
具体参见mamicode
python中,每个py文件被称之为模块,每个具有_init_.py文件的目录被称为包。只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import包来使用。
如果你要使用的模块(py文件)和当前模块在同一目录,只要import相应的文件名就好,比如在a.py中使用b.py:
import b
2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法的更多相关文章
- <网络攻防实践> 课程总结20169216
课程总结20169216 每周作业链接汇总 第一周作业:Linux基础入门(1-5).基本概念及操作 第二周作业:linux基础入门(6-11).网络攻防技术概述网络攻防试验环境搭构.Kali教学视频 ...
- 20169214 2016-2017-2 《网络攻防实践》第十一周实验 SQL注入
20169214 2016-2017-2 <网络攻防实践>SQL注入实验 SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术.通过把SQL命令插入到Web表 ...
- 2018面向对象程序设计(Java)第4周学习指导及要求
2018面向对象程序设计(Java) 第4周学习指导及要求(2017.9.19-2017.9. 26) 学习目标 掌握类与对象的基础概念,理解类与对象的关系: 掌握对象与对象变量的关系: 掌握预定 ...
- 2018面向对象程序设计(Java)第18周学习指导及要求
2018面向对象程序设计(Java) 第18周学习指导及要求(2018.12.27-2018.12.30) 学习目标 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设 ...
- 2018面向对象程序设计(Java)第17周学习指导及要求
2018面向对象程序设计(Java)第17周学习指导及要求(2018.12.20-2018.12.23) 学习目标 (1) 掌握线程同步的概念及实现技术: (2) Java线程综合编程练习 学习资 ...
- 2018面向对象程序设计(Java)第16周学习指导及要求
2018面向对象程序设计(Java)第16周学习指导及要求(2018.12.13-2018.12.16) 学习目标 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程 ...
- 2018面向对象程序设计(Java)第15周学习指导及要求
2018面向对象程序设计(Java)第15周学习指导及要求 (2018.12.6-2018.12.9) 学习目标 (1) 掌握Java应用程序打包操作: (2) 了解应用程序存储配置信息的两种方法 ...
- 2018面向对象程序设计(Java)第14周学习指导及要求
2018面向对象程序设计(Java)第14周学习指导及要求(2018.11.29-2018.12.2) 学习目标 (1) 掌握GUI布局管理器用法: (2) 掌握各类Java Swing组件用途及 ...
- 2018面向对象程序设计(Java)第13周学习指导及要求
2018面向对象程序设计(Java)第13周学习指导及要求 (2018.11.22-2018.11.25) 学习目标 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机 ...
随机推荐
- vue 自定义动态弹框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SummerVocation_Learning--java的String 类
java中String属于java.lang的package包,是一个类.代表不可变的字符序列. String类的常见构造方法: String(String original),创建一个对象为orig ...
- yum 安装percona mysql 5.7
Mysql5.7安装准备 1.基础信息: (1)可参考官方文档[https://www.percona.com/doc/percona-server/5.7/installation/yum_repo ...
- 【TP】TP如何向模板中的js传变量
<input type="hidden" class= "val" value = "{$value}" /> <scri ...
- psutil——获取系统信息的Python第三方模块
本文摘自廖雪峰大神个人网站:https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984 用Python来编写脚本简化日常的运维 ...
- 模拟:HDU1034-Candy Sharing Game
解题心得: 1.直接模拟每一次分一半就行了,模拟过程,记录轮数,但是也看到有些大神使用的是链表,估计链表才是真的做法吧. 题目: Candy Sharing Game Time Limit: 2000 ...
- HDU2586 How far away ?
一.描述 很久没写代码了,在之前一直在参与准备ASC比赛和美赛,现在又重新捡起来.目标是两个月后的邀请赛. 这题是树链拋分解决LCA问题的一个模板题. 首先介绍下树链拋分的基本思想. 对于任意一颗树, ...
- 《鸟哥的Linux私房菜》学习笔记(9)——条件判断
一.条件判断表达式 条件测试类型: 整数测试 字符测试 文件测试 条件测试的表达式 [ ...
- jvm探秘之三:GC初步
GC即垃圾收集器,虚拟机的必要组成部分. 不过这里说当然是,hotspot虚拟机(jvm的主要版本)的GC机制,前面说过了jvm的组成部分,那么想当然GC只需要负责方法区和堆就好了,虚拟机栈.本地方法 ...
- MySQL基础3-SQL语言
1.DQL语句分类 重点在于Select语句 2.Sql语句的书写规则 3.怎样使用Navicat导入已经写好的sql文件 (1)在Navicat中右击选中的数据库 (2)将sql文件所在的路径添加进 ...








