文章目录

  • 1. 分组密码(Twine)
    • 1.1 加解密方式
      • 1.1.1 加密
      • 1.1.2 密钥生成算法
      • 1.1.3 解密
      • 1.1.4 全部代码
    • 1.2. 分组密码的模式
      • 1.2.1 ECB模式
      • 1.2.2 CBC模式
      • 1.2.3 CFB模式
      • 1.2.4 OFB模式
      • 1.2.5 CTR模式
  • 2.序列密码

如图,对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。具有算法公开、计算量小、加密速度快、加密效率高等特点。

1. 分组密码(Twine)

Twine是由Tomoyasu Suzaki,Kazuhiko Minematsu, Sumio Morioka和Eita Kobayashi在2011年的ECRYPT轻量级密码会议上首次提出的,并发表在2012年的SAC会议上。它的分组长度是64比特,密钥长度有80比特和128比特两个版本,其采用广义的Feistel结构(Generalized Feistel Structure,简称GFS),并由36轮轮函数构成,这里我们重点介绍80位的算法。

1.1 加解密方式

1.1.1 加密

Twine-80的加密算法如下所示:

该算法采用的是广义的Feistel结构,具体结构如下图所示:

我们可以看出,此算法在Feistel结构的基础上改造了位置交换的方法,我们称之为π置换(π-1置换用于解密):

Feistel结构中S盒如下表:

void Feistel(int r,int k)
{int i;char a;if(k == 1){if(r != 35)for(i = 0;i < 16;i += 2){OutPut[PI[i]] = InPut[i];a = S[InPut[i] ^ R_Key[r][i / 2]];OutPut[PI[i + 1]] = InPut[i + 1] ^ a;}elsefor(i = 0;i < 16;i += 2){OutPut[i] = InPut[i];a = S[InPut[i] ^ R_Key[r][i / 2]];OutPut[i + 1] = InPut[i + 1] ^ a;}}else{if(r != 35)for(i = 0;i < 16;i += 2){OutPut[Pi[i]] = InPut[i];a = S[InPut[i] ^ R_Key[35 - r][i / 2]];OutPut[Pi[i + 1]] = InPut[i + 1] ^ a;}elsefor(i = 0;i < 16;i += 2){OutPut[i] = InPut[i];a = S[InPut[i] ^ R_Key[35 - r][i / 2]];OutPut[i + 1] = InPut[i + 1] ^ a;}}
}

1.1.2 密钥生成算法

Twine-80的密钥生成算法如下所示:

方便起见,我们将算法用图画出:

其中轮常数Con如下:

void MakeRKey()
{int i,j,k;int choose[8] = {1,3,4,6,13,14,15,16};char ch,ConH,ConL;char key[20] = {0};for(i = 0;i < 10;i++){ch = fgetc(KEY);for(j = (2 * i) + 1;j >= 2 * i;j--){key[j] = ch & 0x0F;ch = ch >> 4;}}for(i = 0;i < 36;i++){for(j = 0;j < 8;j++)R_Key[i][j] = key[j];if(i < 35){key[1] = key[1] ^ S[key[0]];key[4] = key[4] ^ S[key[16]];ConL = CON[i] & 0x07;ConH = CON[i] >> 3;ConH = ConH & 0x07;key[7] = key[7] ^ ConH;key[19] = key[19] ^ ConL;ch = key[0];for(j = 0;j < 19;j++)key[j] = key[j + 1];key[j] = ch;for(k = 0;k < 3;k++){ch = key[0];for(j = 0;j < 18;j++)key[j] = key[j + 1];key[j] = ch;}}}
}

1.1.3 解密

由于轮函数的等价结构,解密算法与加密算法除π置换与轮密钥的注入顺序不同外,其余均相似。

1.1.4 全部代码

代码作用是将plaintext0.txt中的数据加密为ciphertext.txt,然后再解密为plaintext.txt:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>FILE *KEY;
int flag;
int PI[16] = {5,0,1,4,7,12,3,8,13,6,9,2,15,10,11,14};
int Pi[16] = {1,2,11,6,3,0,9,4,7,10,13,14,5,8,15,12};
char S[16] = {0x0c,0x00,0x0f,0x0a,0x02,0x0b,0x09,0x05,0x08,0x03,0x0d,0x07,0x01,0x0e,0x06,0x04};
char CON[35] = {0x01,0x02,0x04,0x08,0x10,0x20,0x03,0x06,0x0c,0x18,0x30,0x23,0x05,0x0a,0x14,0x28,0x13,0x26,0x0f,0x1e,0x3c,0x3b,0x35,0x29,0x11,0x22,0x07,0x0e,0x1c,0x38,0x33,0x25,0x09,0x12,0x24};
char InPut[16] = {0},OutPut[16] = {0};
char R_Key[36][8] = {0};
char plain[16] = {0},cipher[16] = {0};void Read(FILE *OUT,int k)
{int i,j;char ch;for(i = 0;i < 8;i++){ch = fgetc(OUT);if(ch == -1){ch = 0;flag = 0;if(i == 0){flag = -1;return;}}for(j = (2 * i) + 1;j >= 2 * i;j--){if(k == 1)plain[j] = ch & 0x0F;elsecipher[j] = ch & 0x0F;ch = ch >> 4;}}
}void Write(FILE *IN,int k)
{int i,j;char ch;for(i = 0;i < 8;i++){ch = 0x00;for(j = 2 * i;j <= (2 * i) + 1;j++){ch = ch << 4;if(k == 1)ch =  ch | cipher[j];elsech =  ch | plain[j];}fputc(ch,IN);}
}void MakeRKey()
{int i,j,k;int choose[8] = {1,3,4,6,13,14,15,16};char ch,ConH,ConL;char key[20] = {0};for(i = 0;i < 10;i++){ch = fgetc(KEY);for(j = (2 * i) + 1;j >= 2 * i;j--){key[j] = ch & 0x0F;ch = ch >> 4;}}for(i = 0;i < 36;i++){for(j = 0;j < 8;j++)R_Key[i][j] = key[j];if(i < 35){key[1] = key[1] ^ S[key[0]];key[4] = key[4] ^ S[key[16]];ConL = CON[i] & 0x07;ConH = CON[i] >> 3;ConH = ConH & 0x07;key[7] = key[7] ^ ConH;key[19] = key[19] ^ ConL;ch = key[0];for(j = 0;j < 19;j++)key[j] = key[j + 1];key[j] = ch;for(k = 0;k < 3;k++){ch = key[0];for(j = 0;j < 18;j++)key[j] = key[j + 1];key[j] = ch;}}}
}void Feistel(int r,int k)
{int i;char a;if(k == 1){if(r != 35)for(i = 0;i < 16;i += 2){OutPut[PI[i]] = InPut[i];a = S[InPut[i] ^ R_Key[r][i / 2]];OutPut[PI[i + 1]] = InPut[i + 1] ^ a;}elsefor(i = 0;i < 16;i += 2){OutPut[i] = InPut[i];a = S[InPut[i] ^ R_Key[r][i / 2]];OutPut[i + 1] = InPut[i + 1] ^ a;}}else{if(r != 35)for(i = 0;i < 16;i += 2){OutPut[Pi[i]] = InPut[i];a = S[InPut[i] ^ R_Key[35 - r][i / 2]];OutPut[Pi[i + 1]] = InPut[i + 1] ^ a;}elsefor(i = 0;i < 16;i += 2){OutPut[i] = InPut[i];a = S[InPut[i] ^ R_Key[35 - r][i / 2]];OutPut[i + 1] = InPut[i + 1] ^ a;}}
}int main()
{int mode,i,r;FILE *M,*C;if((KEY = fopen("key.txt","rb")) == NULL){printf("\nkey.txt Fail,Close!");getchar();exit(1);}MakeRKey();while(1){flag = 1;printf("Plase choose:\n1. encrypt \n2. decrypt \n3. exit \n");scanf("%d",&mode);if(mode == 1){if((M = fopen("plaintext0.txt","rb")) == NULL){printf("\nplaintext.txt Fail,Close!");getchar();exit(1);}if((C = fopen("ciphertext.txt","wb")) == NULL){printf("\nciphertext.txt Fail,Close!");getchar();exit(1);}while(flag){Read(M,1);if(flag == -1)break;for(i = 0;i < 16;i++)InPut[i] = plain[i];for(r = 0;r < 36;r++){Feistel(r,1);for(i = 0;i < 16;i++)InPut[i] = OutPut[i];}for(i = 0;i < 16;i++)cipher[i] = OutPut[i];Write(C,1);}fclose(M);fclose(C); }if(mode == 2){if((C = fopen("ciphertext.txt","rb")) == NULL){printf("\nciphertext.txt Fail,Close!");getchar();exit(1);}if((M = fopen("plaintext.txt","wb")) == NULL){printf("\nplaintext.txt Fail,Close!");getchar();exit(1);}while(flag){Read(C,2);if(flag == -1)break;for(i = 0;i < 16;i++)InPut[i] = cipher[i];for(r = 0;r < 36;r++){Feistel(r,2);for(i = 0;i < 16;i++)InPut[i] = OutPut[i];}for(i = 0;i < 16;i++)plain[i] = OutPut[i];Write(M,2);}fclose(M);fclose(C); }if(mode == 3){fclose(KEY);exit(0);}system("pause");system("cls");}return 0;
}

1.2. 分组密码的模式

在数组密码中,如何将长的明文数据分成算法要求的长度也是一个问题。为此,人们提出了分组密码的分组模式:

1.2.1 ECB模式

加密:

解密:

1.2.2 CBC模式

加密:

解密:

1.2.3 CFB模式

加密:

解密:

1.2.4 OFB模式

加密:

解密:

1.2.5 CTR模式

加密:

解密:

2.序列密码

序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。
1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试,或者说“一次一密”的密码方案是序列密码的雏形。如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。若能以一种方式产生一随机序列(密钥流),这一序列由密钥所确定,则利用这样的序列就可以进行加密,即将密钥、明文表示成连续的符号或二进制,对应地进行加密,加解密时一次处理明文中的一个或几个比特。
在序列密码中,密钥流由密钥流发生器f产生:zi=f(k,si),这里的si是加密器中存储器(记忆元件)在i时刻的状态。根据加密器中的记忆元件si的存贮状态是否依赖于明文字符,序列密码可进一步分成同步和自同步两种。如果si独立于明文字符则称为同步流密码,否则称为自同步流密码。
序列密码算法主要依靠(线性)反馈移位寄存器,这里就不过多说明了。

密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)相关推荐

  1. 数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF

    数字图像处理学习笔记(三):ORB算法(尺度不变特征变换)Oriented FAST and Rotated BRIEF 一.概述 参考:特征点匹配+特征检测方法汇总 ORB的全称是Oriented ...

  2. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  3. cart算法_决策树学习笔记(三):CART算法,决策树总结

    点击上方"Python数据科学",选择"星标公众号" 关键时刻,第一时间送达! 作者:xiaoyu 介绍:一个半路转行的数据挖掘工程师 推荐导读:本篇为树模型系 ...

  4. CAS单点登录学习笔记二之部署CAS Server

    CAS Server 服务器部署 [b]简介[/b] CAS Server 是一套基于 Java 实现的服务,该服务以一个 Java Web Application 单独部署在与 servlet2.3 ...

  5. motan学习笔记 二 motan架构分析

    motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...

  6. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

  7. 基于MVS的三维重建算法学习笔记(五)— 立体匹配经典算法PatchMatch论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(五)- 立体匹配经典算法PatchMatch论文翻译及要点解读 声明 问题提出 问题建模 通过PatchMatch获取平面参数--Inference via Patc ...

  8. July深度学习笔记之神经网络与反向传播算法

    July深度学习笔记之神经网络与反向传播算法 一.神经网络 神经网络的大致结构如下: 大致可以分为输入层.隐藏层与输出层. 而我们可以单独拿出来一个结点,可以发现,其实它就是类似一个逻辑回归(LR), ...

  9. 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...

  10. Mysql学习笔记(二)——表格及数据的插入

    Mysql学习笔记(二)--表格及数据的插入 文章目录 Mysql学习笔记(二)--表格及数据的插入 1.Mysql常用指令 2.创建表格 A.数据类型 B.完整性约束条件 3.查看表格 4.修改表格 ...

最新文章

  1. DataGrid删除确认及Item颜色交替
  2. HDU4009(最小树形图)
  3. SAP HUM 如何把HU号码与Outbound Delivery 解除Assignment?
  4. 《python核心编程第二版》第5章习题
  5. jquery.easing.js(转)
  6. MappedByteBuffer VS FileChannel 孰强孰弱?
  7. Android 的 生命周期_ 界面的切换 和 吐司
  8. .NET 深度指南:Colors
  9. mysql加锁语法_MySql 加锁问题
  10. 1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...
  11. object detection错误之Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
  12. pythonredis实例_Python读写Redis数据库操作示例
  13. myftpadmin+proftpd+mysql架设ftp服务器_[教程]在CentOS7上配置 FTP服务器 Proftpd 支持 MySQL 虚拟用户加密认证以及磁盘限额(Quota)...
  14. 一文搞定学术英语写作 (斯坦福SCI论文写作课程笔记)
  15. 0-day漏洞,1-day漏洞,n-day漏洞各自是什么意思?
  16. 人工智能基础——知识的概念
  17. latex怎样让题号顶格_笔记本-latex写作问题集锦
  18. 极海APM32F072RB开发环境测试
  19. linux 统计字数 行数
  20. android 获取年月日

热门文章

  1. 医院营销要多条腿走路
  2. 大数据如何对大型设备进行故障预测及健康管理的?
  3. 蓝桥杯「贪心的自助餐」
  4. Python3:最简短明了的requests, get json 请求
  5. Python新手入门英文词汇笔记(转)
  6. IBDP课程是什么?IBDP课程怎么学?
  7. 亚马逊平台儿童玩具CPC认证解决方案
  8. 2021 CPSE | 鼎桥通信精彩亮相深圳会展中心
  9. 2021-08-30 linux find查找文件夹命令 find -name -type d
  10. 全景视频如何下载 - 免费绿色纯净无广告的全景视频下载软件