密码算法详解——Simon
0 Simon简介
详细文档请直接阅读参考文献[1]。
Simon是由NSA设计的轻量级分组密码算法(LIGHTWEIGHT BLOCK CIPHER)。主要应用于硬件或软件条件受限(例如:芯片面积要求小、微处理器、低功耗等),同时对安全有一定需求的低端设备。相比DES、AES等,Simon在结构上相对简单,轮函数操作也不复杂。因此在计算速度和资源消耗上更有优势,更能适应软硬件条件受限的情况。
为了适应不同的场合,Simon提供了不同的方案,如图0.

图0 Simon密码族

图1 Simon轮函数结构图
其中,
block size : 明文块大小,比特位;
key size : 初始密钥大小,比特位;
word size : "字"大小,比特位;
key words : 初始密钥包含"字"的个数;
const seq : 计算轮密钥应该使用的z的值;
rounds : 加解密的轮数。
1 算法流程
Simon的整个流程比较简单,接下来分别对加解密轮函数和密钥编排算法进行介绍。
1.1 轮加密
每一轮的操作如图1。明文被分成两个"字",每个"字"的二进制位数都为n(即word size),Xi+1和Xi分别表示高位部分和低位部分(个人认为,这个没有特别要求,Xi+1也可以表示低位、Xi表示高位部分,只要加解密按照同样的顺序即可。为了叙述统一,本文按照Xi+1表示高位、Xi表示低位)。
每轮的加密主要涉及到3种操作,如图2所示,分别是异或、按位与和循环左移(如果j是负数则表示循环右移)。每轮加解密的过程用公式表示如图3,其中x对应Xi+1、y对应Xi、k为轮密钥。

图2 Simon运算符号

图3 Simon轮加解密公式
在C++实现中,按位异或和与都有直接的操作符,对于循环移位可以按照如下方法实现。将x循环左移i(i>=0)位,假设x对应的二进制位数为n,则可以表示为: (x<<i) | (x>>(n-i))。当然,x应该是无符号的数,不然会出错。
/*
* 加密后的低32位是明文的高32位
*/
tempCipherLower = plainText[];
tempCipherHigher = plainText[] ^ keys[i] ^
( ((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-))) & ((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-))) ) ^
((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-)));
/*
* 重新将加密的结果复制到plainText中
*/
plainText[] = tempCipherHigher;
plainText[] = tempCipherLower;
1.2 密钥编排
密钥编排算法如图4,其中m表示的是原始密钥中"字"的个数。

图4 密钥编排算法
c为一个常数,它的二进制位数为n,最低两位为0,其余高位为1。
z是一个常数数组,值如图5,在每种情况下z的取值都是固定的(见图0),每轮加解密时只取一个比特位参与运算。
ki、ki+1、ki+2等都是轮密钥。
I表示不进行移位。

图5 z
C++代码实现如下(只包含block size为64,key size为96和128的两种情况):
/*
* Simon:计算密钥,字大小为32
* inputKey:初始的密钥
* keys:计算后得到的每轮密钥
*/
void setSimonKeys32 ( unsigned int * inputKey, unsigned int * keys ) {
/*
* 算法中的常数c,大小为2^n - 4,其中n是字的长度,即SIMON_WORD_SIZE
* 转化为二进制,即最低两位为0,其它位全为1
*/
unsigned int c = 0xfffffffc;
int i;
; i < SIMON_KEY_WORDS; i++ ) {
keys[i] = inputKey[i];
}
/*
* 求解后面轮的密钥
* 先求其它的异或,最后求Zji,如果为1则对最低位进行修改,否则不变
*/
) {
; i < SIMON_ROUNDS-SIMON_KEY_WORDS; i++ ) {
keys[i+SIMON_KEY_WORDS] = c ^ keys[i] ^
((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-))) ^
((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-)));
// SIMON_WORD_SIZE为32时,无论SIMON_KEY_WORDS为3还是4,周期都是62
] == ) {
keys[i+SIMON_KEY_WORDS] ^= 0x1;
}
}
} ) {
// int cycle = (SIMON_SEQUENCE_NUMBER == 0 || SIMON_SEQUENCE_NUMBER == 1)?31:62;
unsigned int temp = 0x00000000;
; i < SIMON_ROUNDS-SIMON_KEY_WORDS; i++ ) {
temp = ((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-))) ^ keys[i+];
keys[i+SIMON_KEY_WORDS] = c ^ keys[i] ^ temp ^ ((temp>>) | (temp<<(SIMON_WORD_SIZE-)));
] == ) {
keys[i+SIMON_KEY_WORDS] ^= 0x00000001;
}
}
}
}
参考文献
[1] Beaulieu R, Shors D, Smith J, et al. The SIMON and SPECK Families of Lightweight Block Ciphers[J]. IACR Cryptology ePrint Archive, 2013, 2013: 404.
密码算法详解——Simon的更多相关文章
- 密码算法详解——AES
0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...
- 密码算法详解——DES
0 DES简介 在20世纪60年代后期,IBM公司成立了一个由Horst Feistel负责的计算机密码学研究项目.1971年设计出密码算法LUCIFER后,该项目宣告结束.LUCIFER被卖给了伦敦 ...
- AES密码算法详解(转自https://www.cnblogs.com/luop/p/4334160.html)
0 AES简介 我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256.但二十世纪中后期正是计算机飞速发展的阶段,元器件 ...
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- BM算法 Boyer-Moore高质量实现代码详解与算法详解
Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...
- kmp算法详解
转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
- [转] KMP算法详解
转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段. 我们这里说的K ...
- 【转】AC算法详解
原文转自:http://blog.csdn.net/joylnwang/article/details/6793192 AC算法是Alfred V.Aho(<编译原理>(龙书)的作者),和 ...
随机推荐
- spark快速入门之最简配置 spark 1.5.2 hadoop 2.7 配置
配置的伪分布式,ubuntu14.04上 先配置hadoop,参见这个博客,讲的很好 http://www.powerxing.com/install-hadoop/, 但是我在配的过程中还是遇到了问 ...
- linux之SQL语句简明教程---ALTER TABLE
在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变.常见的改变如下: 加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变.ALTER TA ...
- linux之普通用户与root用户之间切换
- uva540 Team Queue by sixleaves
这道题目.主要是对队列的灵活应用.其实就是一道模拟题目,只要你洞察出题目的本质就十分简单.题目意思大体是有多组测试数据,每组的一开始是一个数字t,代表一共有多少的团队,接着是t行输入,每一行都由一个数 ...
- Silence.js高效开发移动Web前端类库
基于Zepto的轻量级移动Web前端JavaScript类库. 编写这个类库原因及目的: 采用MVC设计模式,使代码工程化结构化. 使用RouterJS,提升前端交互性能,延长页面使用时间,并通过Aj ...
- Oracle运维 专业的事情交给专业的人来做
关于Oracle运维的重要性,随便写了几句,放在这儿和大家共勉. Oracle数据库在RDBMS中独占熬头,07年统计其市场份额占关系数据库市场的48.6%稳居首位,而且逐年增加,上升势头强劲.在使用 ...
- SQL高级查询的练习题
Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题 ...
- js数组(二)
一.位置方法 indexOf()和laseIndexOf() indexOf是从数组的第0项开始向后查找,没有找到返回-1,要求使用=== var numbers = [1,2,3,4,5,4,3,2 ...
- 通宵疯狂积累VB.NET基础知识
VB.NET中Module的概念 为什么VB.NET中会有一个Module的东西,而在C#等语言中是没有的 首先,这是一个历史原因.早先的VB语言都有模块和类模块的概念.所谓模块一般就是存放公用的一些 ...
- WCF 启用multipleSiteBindingsEnabled 情况下报终结点地址错误
报错信息如下: Server Error in '/MyWcfService' Application. When 'system.serviceModel/serviceHostingEnviron ...