一个关于国密SM4的故事
一个关于国密SM4的故事
我的名字叫SM4,我还有三位兄长,分别是大哥SM1, 二哥SM2, 和三哥SM3。说起我的名字,故事要回到2006年的时候,我出生的时候并不是叫SM4的,而是叫做SMS4。只是2012年的时候我父亲给我改名了。虽然我起了一个洋气的名字,但我必须郑重地说,我是一个中国人。名字可能只是为了与国际接轨。
我的家族
先简单地介绍一下我的家族,我的父亲是国家密码管理局,我们几兄弟就主要负责起国家信息安全中的加密。我由一出生起,就不断地被家人提醒我要肩负重任。因此,我也非常努力,不断地学习和完善提升自我。
大哥主要负责硬件的加密,不知道是不是因为大哥身为长兄,所以份外地冷酷,他的加密算法和二哥三哥和我都不同,我们的算法都是公开的,但是大哥却埋藏得很深,我们都不知道他的算法是怎样的。
几兄弟里,我和二哥比较亲密,可能是因为他的业务名称和我比较像吧,他主要负责的是非对称加密。我有什么不懂都是经常跑去请教他的。
三哥主要负责哈希算法的。而我,则是负责对称加密。别看我现在说得头头是道,其实一开始我完全不理解这些名词到底是什么意思,于是我首先就走去问二哥。
我是干啥的
我说,二哥,父亲告诉我要负责对称加密,其实我到底是要做些什么呢?
二哥耐心地告诉我,在我们这个密码学的大家族里,加密算法主要可以分为两种,一个是非对称加密算法,另一个就是对称加密算法。也就是我和你主要负责的。对称加密简单来说就是有一个明文,通过一个密钥加密之后得到一个密文,这个密文可以通过相同的密要解密得出和原来相同的明文。
我听了之后觉得有点理解了,我说,那不是很简单吗,比如说明文是123 ,密码是456 ,我只要将123+456那就变成了579,别人不就看不懂了吗?
二哥哈哈大笑,你是不是看金田一和柯南的侦探小说太多了,你说的原理是没有错的,但是你太少瞧黑客和攻击者了,如此简单的加密算法,有经验的攻击者不用1秒钟就可以解开了,你肩负的是我们全国的安全啊,你必须要有一种安全的加密算法才可以。而且你这种算法必须是可以公开的,只要密钥足够复杂,别人就永远也解不开,这样才能形成一种标准,四弟,你需要像我一样成为一种标准,而不仅仅成为一种算法。
我眉头紧皱,心想算法也可以公开?这也太难了吧。我委屈地说,二哥,这个太难了,我不能学大哥那样子不公开算法吗?
二哥回答,我的算法也是公开的,不也是什么事也没有吗?你可以看看前人是怎么实现类似的功能,你应该在前人的基础上不断创新,而不是从零开始,因循守旧。
我恍然大悟,前人?有谁啊?
有非常多,早在1977年,美国就颁布了一种对称加密算法,叫DES。虽然这种算法已经被证明是不安全的,但是你也可以去学习学习。又比如比利时有两位密码学家,在1998年就提出了一种著名的对称加密算法,现在已经被全世界广泛使用,就是鼎鼎大名的AES,我们喜欢叫做算法,但其实他已经是一种标准了。
二哥果然是博古通今,我听后大受启发,马上就跑回书房跃跃欲试。
我的算法标准
我查了一下书籍,果然大有发现,对称加密分为了块加密和流加密,流比较偏门,于是我先跳过了,我把已经出现的块加密算法列举了一下。
于是我了解了一下目前公认比较安全的aes。
这个过程中,我还发现了一些秘密,原来其实大哥也是对称加密的,还有个名字另类的兄弟叫ZUC。我好像还有一些弟弟也是对称,叫SM7的,但是族谱里现在还没有看见,所以我也没有深入研究了。
研究了aes之后发现,要实现一个可靠的加密算法,效率非常重要,想像一下,要加密的明文长度比较短还可以接受,万一非常非常长的,加密的效率就非常重要了。要提高效率,我首先想到的就是并行计算,而要并行计算,就需要对明文首先划分成相同的长度,这个过程我称之为分组。
由于要划分成相同的长度才好实现统一的加密解密处理,那么就必然会出现分组后最后的那一组字符串会出现长度不够的问题,那么就需要把缺失的长度补充上去,这个过程我称之为填充。
像我刚才跟二哥说的那个例子一样,简单的一次加密计算,必然是很容易被破解的,所以要增加算法的安全性,就需要对明文的计算转换进行多次,我把每一次的计算称之为迭代。
太好了!我的加密算法主要可以切分三个:分组、填充、迭代。
迭代的算法是最为核心的部分,当然要参考最为著名的Feistel分组加密结构。
影响Feistel 结构的因素有如下5 个:
(1)块的大小:大的块会提高加密的安全性,但是会降低加密、解密的速度。截止至2013年,比较流行的这种方案是64 bit。而128 bit 的使用也比较广泛。
(2)密钥的大小:同上。现在流行的是64 bit ,而 128 bit 正逐渐成为主流。
(3)循环次数(轮次数):每多进行一轮循环,安全性就会有所提高。现阶段比较流行的是16轮。
(4)子密钥的生成算法:生成算法越复杂,则会使得密码被破译的难度增强,即,信息会越安全。
(5)轮函数的复杂度:轮函数越复杂,则安全性越高。
另外,还有很重要的一个迭代模式。目前也是有比较成熟的参考。
ECB模式:
CBC模式:
所有的迭代模式:
好了,我定义好自己的分组长度、填充标准、轮函数的算法,我的标准终于出来了!
我的实现
后面陆陆续续,有很多语言根据我的标准进行了实现,包括c、java、python等等。
要实现这个,还是很不容易的。首先要懂得线性代数,什么线性变换、非线性变换。对编程里的位运算也得熟悉。不过这些我都不管,让大家去实现吧,哈哈。下面贴一下我的好朋友java实现中的关键轮函数。
/**
* 轮函数F。
*
* 6 Round Function
一个关于国密SM4的故事的更多相关文章
- [转帖]一个关于国密SM4的故事
一个关于国密SM4的故事 https://www.cnblogs.com/ouyida3/p/10053862.html SM1 硬件SM2 非对称加密SM3 hash算法SM4 对称加密 一个关于国 ...
- 国密SM4对称算法实现说明(原SMS4无线局域网算法标准)
国密SM4对称算法实现说明(原SMS4无线局域网算法标准) SM4分组密码算法,原名SMS4,国家密码管理局于2012年3月21日发布:http://www.oscca.gov.cn/News/201 ...
- 一个支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱
转:https://blog.csdn.net/xuq09/article/details/91815366 The GmSSL Project网址:http://gmssl.org/docs/qui ...
- 国密SM4分组加密算法实现 (C++)
原博客 :http://blog.csdn.net/archimekai/article/details/53095993 密码学的一次课程设计,学习了SM4加密算法,目前应用于无线网安全. SM4分 ...
- 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法
国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...
- 关于国密算法 SM1,SM2,SM3,SM4 的笔记
国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...
- java sm4国密算法加密、解密
java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...
- Bytom国密网说明和指南
比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 国密算法 ...
- SM系列国密算法(转)
原文地址:科普一下SM系列国密算法(从零开始学区块链 189) 众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7. ...
随机推荐
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划
淘宝数据库OceanBase SQL编译器部分 源码阅读--生成物理查询计划 SQL编译解析三部曲分为:构建语法树,制定逻辑计划,生成物理执行计划.前两个步骤请参见我的博客<<淘宝数据库O ...
- DataFactory 5.6注册码
一.DataFactory 5.6注册码 数据工厂5.6注册码如下,希望能帮助需求之人 AuthKey: 0-87093-23830-05141-17507 SiteMsg: FREELAND EVO ...
- EF(Linq)框架使用过程中的小技巧汇总 dbfunctions
这篇博客总结本人在实际项目中遇到的一些关于EF或者Linq的问题,作为以后复习的笔记或者供后来人参考(遇到问题便更新). 目录 技巧1: DbFunctions.TruncateTime()的使用 技 ...
- 小心APP应用让你成为“透明人”
随着智能手机和平板电脑的迅猛发展,各式各样的APP在涌入这些移动终端的同一时候.吸费.窃取隐私等恶意程序也随之盛行. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5u ...
- A Practical Introduction to Blockchain with Python
A Practical Introduction to Blockchain with Python // Adil Moujahid // Data Analytics and more http: ...
- SAP系统更新模块
SAP 系统中,一些单据保存到数据库用的是 update mudule function. 命名是ME_UPDATE_* (业务说明) 例:PR save module: ME_UPDATE_REQU ...
- IE9不能直接引用Console
问题: 公司有个项目,功能很简单,读取业务数据,展示在页面上. 一个很简单的问题,却因为目标浏览器是IE9,卡了三天. 前端给的反馈是: 在IE9下,程序一会儿对,一会儿不对--第一次刷不出来,多刷几 ...
- mmwave
毫米波(mmWave) 致力于支持5G应用创新开发,集成在BEEcube BEE7基带平台上的赛灵思256QAM毫米波调制解调器IP为宽带回程原型设计提供完整的开箱即用型解决方案 赛灵思公司 (NAS ...
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用
目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,N ...
- 实现自定义xib和storyboard的加载,
一:加载xib 1.分别创建xib,.h .m文件继承自UIView. 在xib上绑定类名. 或者创建文件的时候直接勾选xib 2.在控制器中调用类方法 jyq52787网盘/ios/潭州学院/iO ...