国密算法实现

国密算法实现

1、国产密码算法介绍

国产密码算法(国密算法)是指国家密码局认定的国产商用密码算法,在金融领域目前主要使用公开的SM二、SM三、SM4三类算法,分别是非对称算法、哈希算法和对称算法。python

  • 1.SM2算法:SM2椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括SM2-1椭圆曲线数字签名算法,SM2-2椭圆曲线密钥交换协议,SM2-3椭圆曲线公钥加密算法,分别用于实现数字签名密钥协商和数据加密等功能。SM2算法与RSA算法不一样的是,SM2算法是基于椭圆曲线上点群离散对数难题,相对于RSA算法,256位的SM2密码强度已经比2048位的RSA密码强度要高。算法

    • 椭圆曲线参数并无给出推荐的曲线,曲线参数的产生须要利用必定的算法产生。但在实际使用中,国密局推荐使用素数域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算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可知足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不该过短,例如MD5输出128比特杂凑值,输出长度过短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,所以SM3算法的安全性要高于MD5算法和SHA-1算法。编程

  • 3.SM4算法:SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具有足够的密钥长度,SM4算法与AES算法具备相同的密钥长度分组长度128比特,所以在安全性上高于3DES算法。安全

具体参见国家密码局公布的细则

地址:http://www.oscca.gov.cn/函数


具体实现

安装了实验环境

  • python-3.6.5
工具
  • pycharm

SM2实现

python3实现的国密SM2+SM3,SM3包括KDF功能,可配合SM2加解密(SM2调用了SM3模块)。SM2实现了各类素域下的签名、验签和加解密功能。工具

SM3实现

SM3密码杂凑算法的设计原理
SM3密码杂凑算法的设计主要遵循如下原则:
  • 可以有效抵抗比特追踪法及其余分析方法;
  • 在保障安全性的前提下,综合性能指标与SHA-256同等条件下至关.
(1)压缩函数的设计原则

压缩函数的设计具备结构清晰、雪崩效应强等特色,采用了如下设计技术:性能

  • 消息双字介人。输人的双字消息由消息扩展算法产生的消息字中选出。为了使介入的消息尽快产生雪崩效应,采用了模2^23算术加运算和P置换等
  • 每一步操做将上一步介入的消息比特非线性迅速扩散,每一消息比特快速地参与进一步的扩散和混乱
  • 采用混合来自不一样群运算,模2^23算术加运算、异或运算、3元布尔函数和P置换
  • 在保证算法安全性的前提下,为兼顾算法的简介和软硬件及智能卡实现的有效性,非线性运算主要采用布尔运算和算术加运算
  • 压缩函数参数的选取应使压缩函数知足扩散的彻底性、雪崩速度快的特色
(2)消息扩展算法的设计

消息扩展算法将512b的消息分组扩展成2176b的消息分组。经过线性反馈移位寄存器来实现消息扩展,在较少的运算量下达到较好的扩展效果.消息扩展算法在SM3密码杂凑算法中做用主要是增强消息比特之间的相关性,减少经过消息扩展弱点对杂凑算法的攻击可能性。消息扩展算法有如下要求:学习

  • 消息扩展算法知足保墒性
  • 对消息进行线性扩展,使扩展后的消息之间具备良好的相关性
  • 具备较快的雪崩效应
  • 适合软硬件和智能卡实

SM4实现

SMS4算法的加密过程
  • 1.读入数据加密

  • 2.计算轮密钥中间变量设计

  • 3.计算轮密钥

  • 4.SMS4算法第i+1轮加密

  • 5.SMS4算法最终加密输出

SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。
SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具有足够的密钥长度,SM4算法与AES算法具备相同的密钥长度分组长度128比特,所以在安全性上高于3DES算法。

SM4 密码算法基本运算有两部分:
  • 1.模2加:⊕,32比特异或运算
  • 2.循环移位: <<< i ,把32位字循环左移i位
SM4基本密码部件为
  • 1非线性字节变换S盒(起混淆做用)
    • S盒的置换规则:输入的高半字节为行号,低半字节为列号,行列交叉点处的数据即为输出。设输入为 “5F”,则行号为5,列号为F,因而S盒的输出值为表中第5行和第F列交叉点的值。
  • 2 非线性字变换 τ:起混淆做用,具体为4个S盒并行置换,设输入字 A=(a0,a1,a2,a3),输出字B=(b0,b1,b2,b3),B = τ(A)=(S_box(a0), S_box(a1), S_box(a2), S_box(a3)

  • 3 字线性部件 L变换: 起扩散做用
    32位输入,32位输出。
    设输入为 B,输出为C运算规则:
    C=L(B)=B⊕(B<<<2)⊕((B<<<10)⊕(B<<<18) ⊕(B<<<24)
    4 字合成变换 T:
    由非线性变换 τ 和线性变换 L复合而成;
    T(X) =L(τ(X))。(先S后L)

总结

这次实验是小组实验,对虽然在前期有了必定的python基础,可是要真正的编程去实现一个完整、复杂的算法仍是感受有点困难,因此咱们的代码是在csdn中下载以后研究并作出必定修改。永健、孟亚和我每一个人主要负责研究一个算法,以后在小组讨论,对算法作本身的汇报,是整个小组都懂得实现机制。我负责的是sm4的实现,这部分代码是由c语言转编译而来,这样的作法也开阔了本身的学习思路。

相关文章
相关标签/搜索