DES CFB and OFB模式 文件
- 格式:doc
- 大小:76.50 KB
- 文档页数:12
《密码学基础》课程教学大纲(Fundamentals of Cryptography)课程编号: 1223527课程性质:专业课适用专业:计算机科学与技术先修课程:线性代数、概率论与数理统计、离散数学后续课程:总学分:2学分一、教学目的与要求1. 教学目的密码学包含两个密切相关的方面,其一是密码编码学,研究编写出好的密码系统的方法;其二是密码分析学,研究攻破一个密码系统的途径,恢复被隐蔽信息的本来面目。
通过本课程的学习使学生初步掌握密码编码学的知识、了解密码分析学的基本概念和方法。
2. 教学要求通过本课程的学习,要求学生能初步掌握密码学的主要内容,包括:公钥密码,分组密码,伪随机序列发生器,序列密码,数字签名等等。
要求重点掌握各种密码算法和密码协议及其设计原理,掌握密钥管理、数字签名、身份认证、散列函数等核心技术。
二、课时安排三、教学内容1. 密码学的基本概念(2学时)(1)教学基本要求了解:信息安全模型;信息安全与密码学的关系;密码学的发展方向。
理解:密码学的发展与分类;密码学的基本概念;现代密码学的理论基础。
(2)教学内容①对安全威胁的被动攻击(截获)与主动攻击(中断、篡改、伪造);②信息安全的三个特性(保密性Confidentiality、完整性Integrity、可用性Availability);③密码学的分类(密码编码学、密码分析学、密码密钥学);④密码编码学的分类(对称密码与非对称密码);⑤密码分析及对密码系统攻击能力等级。
2. 分组密码(4学时)(1)教学基本要求了解:DES;对DES的攻击方法;分组密码设计的一般原理;IDEA;Double-DES,Triple-DES;AES的产生背景。
理解:DES算法;分组密码(DES)的使用模式;IDEA的总体结构;AES算法;逆元的计算;分组密码的工作模式。
(2)教学内容①DES算法的整体结构(重点);②初始置换、逆初始置换、乘积变换、16轮迭代、函数f、S-盒、P置换;③子密钥的生成及DES的解密过程;④DES的雪崩效应、DES的弱密钥及半弱密钥、对DES的攻击;⑤Double-DES与Triple-DES;⑥分组密码设计的一般原理及分组密码的工作模式(ECB、CBC、CFB、OFB);⑦IDEA的总体结构,8轮迭代、输出变换、密钥调度、乘积运算;⑧逆元的计算;⑨DES,Double-DES,Triple-DES,IDEA的安全性;⑩AES分组密码算法(轮变换、加轮密钥、密钥调度、密钥扩展等)。
对称密码算法的几种模式
对称密码算法主要有四种加密模式,分别是:
1. 电子密码本模式(Electronic Code Book,ECB):在这种模式中,加密的数据被分成若干组,每组的大小与加密密钥长度相同,然后每组都用相同的密钥进行加密。
这种模式的优点是加密速度快,缺点是如果原消息中有重复的明文块,那么加密后的密文块也会重复,因此它只适合加密小消息。
2. 加密块链模式(Cipher Block Chaining,CBC):在这种模式中,明文被分成固定长度的块,然后将前面一个加密块输出的密文与下一个要加密的明文块进行异或操作,将计算结果再用密钥进行加密得到密文。
这种模式的优点是安全性好,适合传输长度长的报文,缺点是需要一个初始化向量(IV)。
3. 加密反馈模式(Cipher Feedback Mode,CFB):在这种模式中,使用流加密法,通过将前面加密块输出的密文作为下一块明文的加密密钥。
这种模式的优点是加密速度快,缺点是如果密文被篡改,可能会影响后续密文的安全性。
4. 输出反馈模式(Output Feedback Mode,OFB):在这种模式中,加密的密钥是由前面加密块输出的密文生成的,然后将这个密钥与下一个要加密的明文块进行异或操作得到密文。
这种模式的优点是加密速度快,缺点是如果密文被篡改,可能会影响后续密文的安全性。
这些模式各有优缺点,需要根据具体的应用场景和需求来选择适合的加密模式。
DES操作规范范文DES(Data Encryption Standard)是一种对称密码算法,用于保护敏感数据的机密性。
DES操作规范是指在使用DES算法时应遵守的一系列操作规则和安全标准。
以下是关于DES操作规范的一些要点:1.密钥长度:DES算法的密钥长度为56位,通常表示为64位,其中8位用于错误检测和验证。
在加密过程中,这64位密钥被分为16个48位的子密钥。
2.密钥安全:由于DES算法使用的密钥较短,存在被暴力破解的风险。
因此,在使用DES算法时必须采取额外的安全措施来保护密钥的安全性。
例如,密钥应定期更换,避免将密钥存储在不安全的位置,限制密钥的访问权限等等。
3. 初始置换(Initial Permutation):在进行DES加密之前,需要对输入数据进行初始置换,以增加加密的复杂性和安全性。
初始置换是通过一个固定的置换表进行的,将输入的64位数据重新排列。
4. 加密过程:DES加密中的核心是Feistel网络结构。
加密过程包括16个轮次,每个轮次对输入数据进行一系列的变换操作,包括数据的置换、替代和异或等。
每轮结束时,左半部分数据和右半部分数据进行交换,然后进入下一轮。
5.填充机制:DES算法是以64位为块进行加密的,因此如果输入数据长度不是64的倍数,则需要进行填充。
填充机制可以选择使用一些特定的算法,例如PKCS6. 密文反转(Ciphertext Stealing):DES算法生成的密文与明文长度相同,因此在一些情况下可能导致最后一个分组不完整。
密文反转是一种技术,可以解决这个问题,使得最后一个分组长度和其他分组一样。
7. 密文模式(Cipher Modes):DES算法可以使用不同的密文模式来提供不同的加密和解密功能。
常用的密文模式包括ECB、CBC、CFB和OFB等。
选择合适的加密模式可以根据应用需求来确定。
8. 密码块链(Key Schedule):DES算法中的子密钥生成是通过一个称为密码块链的过程实现的。
第3章分组密码体制3.1分组密码概述图3.1分组密码框图3.1.1代换图3.2代换结构2现代密码学(第2版)3.1.2扩散和混淆3.1.3 Feistel密码结构1. Feistel加密结构图3.3 Feistel网络2. Feistel解密结构现代密码学(第2版) 3图3.4 Feistel加解密过程4现代密码学(第2版)3.2数据加密标准3.2.1DES描述图3.5 DES加密算法框图1. 初始置换现代密码学(第2版) 52. 轮结构图3.6 DES加密算法的轮结构图3.7函数F(R,K)的计算过程6现代密码学(第2版)3. 密钥的产生现代密码学(第2版)7图3.8二重DES8现代密码学(第2版)3.2.3两个密钥的三重DES图3.9两个密钥的三重DES 3.2.4 3个密钥的三重DES3.3差分密码分析与线性密码分析3.3.1差分密码分析3.3.2线性密码分析3.4分组密码的运行模式现代密码学(第2版)93.4.1电码本(ECB)模式图3.10 ECB模式示意图10现代密码学(第2版)3.4.2密码分组链接(CBC)模式图3.11 CBC模式示意图3.4.3密码反馈(CFB)模式图3.12 CFB模式示意图3.4.4输出反馈(OFB)模式图3.13 OFB模式示意图3.5 IDEA3.5.1设计原理1. 密码强度图3.14 MA 结构2. 实现3.5.2加密过程图3.15 IDEA的加密框图1. 轮结构图3.16 IDEA第1轮的轮结构图3.17 IDEA的输出变换2. 子密钥的产生3. 解密过程图3.18 IDEA加密和解密框图3.6 AES 算法——Rijndael3.6.1 Rijndael的数学基础和设计思想1. 有限域GF(28)2. 系数在GF(28)上的多项式3. 设计思想3.6.2算法说明1. 状态、种子密钥和轮数2. 轮函数图3.19字节代换示意图图3.20行移位示意图图3.21列混合运算示意图图3.22密钥加运算示意图3. 密钥编排图3.23 Nb=6且Nk=4时的密钥扩展与轮密钥选取4. 加密算法5. 加解密的相近程度及解密算法习题。
物联网安全技术课程大作业姓名:***专业:物联网工程班级:2013级1班AES加密技术尹鹏舟长江师范学院摘要:AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。
目前是美国联邦政府采用的一种区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
2006年,AES已然成为对称密钥加密中最流行的算法之一。
AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。
其几乎能抵御所有已知的攻击,且在各种平台上都易于实现,速度快。
本文主要对AES加密技术的发展背景及其应用进行概述,比对众多加密技术分析该技术的应用及发展方向。
关键词:AES加密算法;DES加密算法;发展背景;发展方向;AES encryption technologyYin PengzhouYangtze Normal University Abstract:AES (Advanced Encryption Standard) is The U.S. national institute of standards and technology is used to encrypt The specification of The electronic data. Now is the federal government adopts a block encryption standard, this standard is used to replace the original DES, has been used by various analysis and all over the world. In 2006, AES has become one of the most popular algorithm in the symmetric key encryption. AES, as a new generation of data encryption standard brings together strong security, high performance, high efficiency, easy to use and flexible, etc. It almost can resist all known attacks, and on a variety of platforms are easy to implement, fast. In this paper, development background and application of AES encryption technology overview, than many encryption technology analysis and development prospect of the application of the technology.Key words:AES encryption algorithm. DES encryption algorithm. The development background; The development direction;目录第一章AES加密技术背景1.1 AES加密技术的背景1.2 AES加密技术的来源第二章AES加密技术2.1AES加密算法基本内容2.2 AES加密算法加密模式第三章AES加密技术应用3.1 AES应用方法举例3.2 AES的各领域应用3.3 AES的安全性第四章AES加密技术发展前景及方向总结第一章AES加密技术背景1.1 AES加密技术的背景随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。
第三章习题1简述分组密码算法的基本工作原理。
答分组密码在加密过程中不是将明文按字符逐位加密而是首先要将待加密的明文进行分组每组的长度相同然后对每组明文分别加密得到密文。
分组密码系统采用相同的加密密钥和解密密钥这是对称密码系统的显著特点。
例如将明文分为m块0121mPPPP每个块在密钥作用下执行相同的变换生成m个密文块0121mCCCC每块的大小可以任意长度但通常是每块的大小大于等于64位块大小为1比特位时分组密码就变为序列密码如图是通信双方最常用的分组密码基本通信模型。
加密算法解码算法明文x密文y明文x密钥k密钥kkExykDyxAliceBob不安全信道安全信道密钥k攻击者图分组密码基本通信模型图在图中参与通信的实体有发送方Alice、接收方Bob。
而攻击者是在双方通信中试图攻击发方或者收方信息服务的实体攻击者经常也称为敌人、对手、搭线者、窃听者、入侵者等并且攻击者通常企图扮演合法的发送方或者接收方。
2为了保证分组密码算法的安全对分组密码算法的要求有哪些答为了保证分组密码的安全强度设计分组密码时应遵循如下的基本原则1分组长度足够长防止明文穷举攻击例如DESData Encryption Standard、IDEAInternational Data Encryption Algorithm等分组密码算法分组块大小为64比特在生日攻击下用322组密文破解成功概率为0.5同时要求32152642bitsMB大小的存储空间故在目前环境下采用穷举攻击DES、IDEA等密码算法是不可能而AES明文分组为128比特同样在生日攻击下用642组密文破解成功概率为0.5同时要求存储空间大小为644821282bitsMB采用穷举攻击AES算法在计算上就更不可行。
2 密钥量足够大同时需要尽可能消除弱密钥的使用防止密钥穷举攻击但是由于对称密码体制存在密钥管理问题密钥也不能过大。
3密钥变换足够复杂能抵抗各种已知攻击如差分攻击、线性攻击、边信道攻击等即使得攻击者除了穷举攻击外找不到其它有效攻击方法。
分组密码常用的工作模式
分组密码常用的工作模式包括以下几种:
1. 电子密码本模式(Electronic Codebook, ECB):将明文分为固定大小的块,每个块使用相同
的密钥进行加密。
这种模式简单,容易并行处理,但在相同的明文块可能会产生相同的密文块,因此不适合加密具有规律性的数据。
2. 密码分组链接模式(Cipher Block Chaining, CBC):将每个明文块与前一个密文块进行异或
操作,然后再进行加密。
首先使用初始化向量(IV)对第一个明文块进行加密,然后将该块密文与下一个明文块进行异或操作,并依次进行。
这种模式的优点是每个密文块的加密过程都依
赖于前一个密文块,因此更难被攻击者破解。
3. 输出反馈模式(Output Feedback, OFB):类似于CBC模式,但是将前一个密文块作为输入,通过加密算法生成一个伪随机数流(密钥流),再与明文块进行异或操作得到密文块。
OFB
模式可以将加密算法转化为加密流密码。
4. 密码反馈模式(Cipher Feedback, CFB):类似于OFB模式,但是将前一个密文块的一部分
作为输入,通过加密算法生成一个伪随机数,再与明文块进行异或操作得到密文块。
5. 计数器模式(Counter, CTR):将明文块按顺序与计数器相加,再使用相同的密钥进行加密。
CTR模式可以将加密算法转化为加密流密码,且可以被并行处理,因此适用于大量数据的加密。
这些工作模式在使用分组密码进行加密时提供了不同的特性,可以根据具体需求选择合适的工
作模式。
常用的分组密码
常用的分组密码 1
分组密码是一种一次只能处理一段特定长度数据的算法。
每个块就是一个块,块中的比特数称为块长。
但是,当加密内容超过分组密码的分组长度时,必须对分组密码算法进行迭代,这种迭代方法称为分组密码模式。
例如:DES和AES都是分组密码算法,DES和三重DES的分组长度都是64比特,AES的分组长度为128比特。
分组密码的模式主要有以下五种:
ECB模式(电子密码本模式)ECB模式是将明文消息分成固定大小的分组,当最后一个分组的内容小于分组长度时,需要用特定的数据进行填充以至于长度等于分组长度,每个分组的加密和解密都是独立的,可以进行并行操作,但是安全性较低。
CBC模式(密码分组链接模式)CBC模式中的第一个分组需要用初始化向量IV(一个随机的且长度为一个分组长度的比特序列)进行异或操作再进行加密,而后面的每一个分组都要先和前一个分组加密后的密文分组进行异或操作,然后再加密。
加密是连续的,不能进行并行操作。
CFB模式(密文反馈模式)CFB模式是将前一个分组的密文加密后和当前分组的明文进行异或操作生成当前分组的密文,第一个明文分组通过初始化向量lV进行加密再与之进行异或操作得到第一个密文分组。
OFB模式(输出反馈模式)OFB模式是通过将明文分组和密码算法的输出进行异或操作来产生密文分组的,也需要使用初始化向量(IV)
CTR模式(计数器模式)在CTR模式中,每次加密时都会生成一个不同的值来作为计数器的初始值,每个分组对应一个逐次累加的计数器,通过对计数器进行加密来生成密钥流,再将密钥流与明文分组进行异或操作得到密文分组,。
等保三级数据加密算法
等保三级数据加密算法是指基于国家保密标准的一种数据加密
技术,适用于等级保护三级及以上的信息系统。
该算法采用了对称加密与非对称加密相结合的方式,同时应用了哈希算法、随机数发生器、消息认证码等技术,以提高数据的保密性、完整性和可靠性。
等保三级数据加密算法的具体实现方式包括了多种加密模式,例如ECB、CBC、CFB、OFB等。
其中,ECB模式是一种最基础的加密模式,每个数据块独立加密,容易受到攻击;而CBC模式则采用了前一个数据块的加密结果作为下一个数据块的输入,增强了数据的安全性。
CFB和OFB模式则是将加密算法作为伪随机数生成器使用,以提高加密效率。
除了加密模式,等保三级数据加密算法还应用了多种密码算法,例如DES、3DES、AES、SM4等。
DES是一种对称加密算法,具有加密速度快、实现简单等优点,但是被认为已经不够安全;而AES和SM4则是一种更加安全的加密算法,具有更高的加密强度和更好的性能表现。
总之,等保三级数据加密算法是一种适用于等级保护三级及以上的信息系统的安全数据加密技术,具有良好的保密性、完整性和可靠性,可以有效地保护机密信息的安全。
- 1 -。
密码技术(图解密码技术的学习总结)⼀、对称密码1、机密性(看不到明⽂)2、算法:DES(Data Encryption Standard):已被暴⼒破解 三重DES(3DES、EDEA):过程加密(秘钥1)-解密(秘钥2)-加密(秘钥3) (1)DES-EDE2:秘钥1和秘钥3相同和 (2)DES-EDE3:秘钥均不同 特点:安全性可以,但处理速度不⾼。
AES(Advanced Encryption Standard 美国通过组织AES公开竞选算法,免费供全世界使⽤):取代DES和三重DES的标准算法。
特点:安全、快速 选定的算法为Rijndael算法。
3.DES与AES属于分组密码,只能加密固定长度的明⽂。
更多密⽂时需要分组、迭代加密。
如AES分组长度为128⽐特、可以⼀次性加密128⽐特的明⽂,并⽣成128⽐特的密⽂4.分组密码模式 ECB模式:每个组直接⽤相同秘钥直接加密。
绝对不可⽤ CBC模式:推荐 CTR模式:推荐 CFB模式:推荐 OFB模式:推荐ps:SSL/TLS协议使⽤了CBC模式,⽤了三重DES的3DES_EDE_CBC以及AES_256_CBC缺点:秘钥配送的问题。
-->可以⽤公钥密码(⾮对称加密)解决。
尝试解决配送问题:(1)事先共享秘钥 当然能见⾯、打电话确认或者邮件确认的⽅式实现共享秘钥⾃然可以,这类场景不会存在配送的问题。
能事先共享秘钥时也有问题:⼈与⼈之间都需要不同的秘钥。
数量太多。
如果有N个⼈,那么就需要N*(N-1)/2个秘钥 但其他场景,⽐如浏览器与服务器,怎样建⽴起信任?刚认识的朋友之间的消息,如何信任呢?(2)秘钥分配中⼼:每个⼈都通过中⼼分配。
缺点:数据库保存太多的秘钥、同时秘钥分配中⼼责任重⼤(3)Diffie-Hellman秘钥交换⽅式(4)公钥密码(⾮对称加密)⼆、⾮对称密码(公钥密码)1、机密性(看不到明⽂)2、原理:消息接收者A⽣成秘钥对,包含公钥和私钥。
分组密码模式分组密码模式分组密码与流密码分组密码:每次只能处理特定长度的⼀块数据的⼀类算法,“⼀块”就称为分组(block )。
⼀个分组的⽐特数就称为分组长度(block length)。
流密码: 对数据流进⾏连续的处理的⼀类密码。
只有⼀次性密码本属于流密码,⽽DES 、三重DES 、AES 等⼤多数对称密码算法都属千分组密码。
模式分组密码算法只能加密固定产固定的分组,若加密的铭⽂的长度超过分组密码的长度,需要对分组密码算法进⾏迭代,以便将所有的密码全部加密。
明⽂分组和密⽂分组主动攻击者Mallory窃听者Eve 只能被动地进⾏窃听,⽽主动攻击者则可以主动介⼊发送者和接收者之间的通信过程,进⾏阻碍通信或者是篡改密⽂等活动。
这样的攻击者⼀般称为Mallory 。
ECB模式使⽤ECB 模式加密时,相同的明⽂分组会被转换为相同的密⽂分组,也就是说,我们可以将其理解为是⼀个巨⼤的“明⽂分组⼀密⽂分组”的对应表,因此ECB 模式也称为电⼦密码本模式。
当最后⼀个明⽂分组的内容⼩于分组长度时,需要⽤⼀些特定的数据进⾏填充( padding )。
CBC 模式在CBC 模式中,⾸先将明⽂分组与前⼀个密⽂分组进⾏XOR 运算,然后再进⾏加密。
ECB 和 CBC 的区别初始化向量当加密第⼀个明⽂分组时,由于不存在“前⼀个密⽂分组”,因此需要事先准备⼀个长度为⼀个分组的⽐特序列来代替“前⼀个密⽂分组”,这个⽐特序列称为初始化向量(Initialization Vector) ,通常缩写为IV 。
⼀般来说,每次加密时都会随机产⽣⼀个不同的⽐特序列来作为初始化向量。
CBC模式的特点明⽂分组在加密之前⼀定会与“前⼀个密⽂分组”进⾏XOR 运算,因此即便明⽂分组 1和 2 的值是相等的,密⽂分组1 和 2 的值也不⼀定是相等的。
这样⼀来,ECB 模式的缺陷在CBC模式中就不存在了。
在CBC 模式中,我们⽆法单独对⼀个中间的明⽂分组进⾏加密。
cfb加密原理
CFB加密(Cipher Feedback)是一种分组密码模式,可用于对块密码进行加密和解密。
它基于密码块反馈模式(CBC)和
输出反馈模式(OFB),在加密和解密过程中通过使用密码块的输出来生成密钥流。
CFB加密的原理如下:
1. 将明文分组进行初始处理,通常是与初始向量(IV)进行
异或运算,得到初始的加密输入。
2. 使用初始的加密输入和密钥进行加密操作,得到密文输出。
3. 将密文输出与下一组明文分组进行异或运算,得到下一轮的加密输入。
4. 重复第2和第3步,直到对所有明文分组进行加密。
CFB解密的原理如下:
1. 将密文分组进行初始处理,通常是与初始向量(IV)进行
异或运算,得到初始的解密输入。
2. 使用初始的解密输入和密钥进行加密操作,得到解密输出。
3. 将解密输出与下一组密文分组进行异或运算,得到下一轮的解密输入。
4. 重复第2和第3步,直到对所有密文分组进行解密。
CFB加密的特点是使用密码块的输出来生成密钥流,使得每
个密文分组的加密都依赖于前一组密文分组的加密结果,增加了加密的随机性和安全性。
此外,CFB加密不需要填充处理,可以对任意长度的数据进行加密。
需要注意的是,CFB加密的安全性依赖于初始向量的选择和保密,并且要求初始向量在每次加密时都是不同的。
否则,如果相同的明文分组使用相同的IV进行加密,将会产生相同的密文分组,可能导致信息泄露。
WS中的文件加密和解密功能介绍文件加密和解密是WS中的重要功能之一,它可以帮助用户更好地保护自己的敏感信息和隐私。
本文将介绍WS中文件加密和解密的功能,以及如何使用它们来保护文件的安全。
一、文件加密功能介绍文件加密是一种将文件内容转换为非可读形式的过程,只有经过授权的人才能解密和访问文件内容。
WS提供了一种强大且易于使用的文件加密功能,可以帮助用户快速加密各种类型的文件。
1.1 加密算法WS使用了一系列高级加密算法来保护文件的安全性。
其中最常用的是对称加密算法和非对称加密算法。
对称加密算法使用相同的密钥来加密和解密文件,速度较快,但密钥的传输需要保持秘密。
在WS中,用户可以选择不同的对称加密算法,如AES、DES等,以满足不同的文件加密需求。
非对称加密算法使用一对密钥,即公钥和私钥,公钥用于加密文件,私钥用于解密文件。
这种算法更安全,但速度较慢。
在WS中,用户可以生成自己的密钥对,并选择使用RSA等非对称加密算法进行文件加密。
1.2 加密模式WS支持多种加密模式,包括ECB、CBC、CFB、OFB等。
这些加密模式可以提供不同程度的安全性和性能。
ECB模式是最简单的加密模式,它将文件分成固定大小的块,并对每个块进行独立加密。
这种模式的安全性较低,因为相同的明文块将产生相同的密文块。
CBC模式在加密过程中引入了初始向量,可以有效地避免ECB模式下的安全问题。
每个明文块都与前一个密文块进行异或运算,增加了密文的随机性。
CFB和OFB模式是流密码模式,它们将明文转换为流进行加密。
这种模式更适合进行实时传输和流式处理。
二、文件解密功能介绍文件解密是将加密的文件恢复为可读形式的过程。
WS提供了简便易用的文件解密功能,用户只需要输入正确的解密密钥即可轻松解密文件。
2.1 解密方式WS支持两种解密方式:对称解密和非对称解密。
对称解密需要输入与加密时使用的密钥相同的密钥。
用户只需要输入正确的密钥,WS即可将文件解密并恢复为可读形式。
分组加密的四种模式(ECB、CBC、CFB、OFB)加密⼀般分为对称加密(Symmetric Key Encryption)和⾮对称加密(Asymmetric Key Encryption)。
对称加密⼜分为分组加密和序列password。
分组password。
也叫块加密(block cyphers)。
⼀次加密明⽂中的⼀个块。
是将明⽂按⼀定的位长分组,明⽂组经过加密运算得到密⽂组,密⽂组经过解密运算(加密运算的逆运算),还原成明⽂组。
序列password。
也叫流加密(stream cyphers),⼀次加密明⽂中的⼀个位。
是指利⽤少量的密钥(制乱元素)通过某种复杂的运算(password算法)产⽣⼤量的伪随机位流,⽤于对明⽂位流的加密。
解密是指⽤相同的密钥和password算法及与加密相同的伪随机位流,⽤以还原明⽂位流。
分组加密算法中,有ECB,CBC,CFB,OFB这⼏种算法模式。
1)ECB(Electronic Code Book)/电码本模式DES ECB(电⼦密本⽅式)事实上很easy。
就是将数据依照8个字节⼀段进⾏DES加密或解密得到⼀段8个字节的密⽂或者明⽂,最后⼀段不⾜8个字节,依照需求补⾜8个字节进⾏计算,之后依照顺序将计算所得的数据连在⼀起就可以。
各段数据之间互不影响。
特点:1.简单。
有利于并⾏计算。
误差不会被传送。
2.不能隐藏明⽂的模式;repetitions in message may show in cipher text/在密⽂中出现明⽂消息的反复3.可能对明⽂进⾏主动攻击;加密消息块相互独⽴成为被攻击的弱点/weakness due to encrypted message blocks being independent2)CBC(Cipher Block Chaining)/密⽂分组链接⽅式DES CBC(密⽂分组链接⽅式)有点⿇烦。
它的实现机制使加密的各段数据之间有了联系。
#include "stdio.h"#include "memory.h"#include "time.h"#include "stdlib.h"#include"string.h"#define PLAIN_FILE_OPEN_ERROR -1#define KEY_FILE_OPEN_ERROR -2#define CIPHER_FILE_OPEN_ERROR -3#define OK 1typedef char ElemType;//初始置换表IPint IP_Table[64] ={58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7 };//初始置换表//逆初始置换表IP^-1int IP_1_Table[64] ={40, 8, 48, 16, 56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30,37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25 };//末置换表//扩充置换表Eint E_Table[48] ={32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1};//扩展置换表//置换函数Pint P_Table[32] ={16, 7, 20, 21, 29, 12, 28, 17,1, 15, 23, 26,5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19,13, 30, 6, 22,11, 4, 25};//p盒置换表//S盒int S[8][4][16] =//S1{{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}},//S2{{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}},//S3{{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}},//S4{{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}},//S5{{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}},//S6{{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}},//S7{{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}},//S8{{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}}}; //置换选择1int PC_1[56] ={57, 49, 41, 33, 25, 17, 9,1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27,19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15,7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29,21, 13, 5, 28, 20, 12, 4};//置换选择2int PC_2[48] ={14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,41, 52, 31, 37, 47, 55,30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53,46, 42, 50, 36, 29, 32};//密钥压缩表//对左移位数表int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};void ByteToBit(ElemType ch,ElemType bit[8]);//字节转换成二进制void BitToByte(ElemType bit[8],ElemType *ch);//二进制转换成字节void Char8ToBit64(ElemType ch[8],ElemType bit[64]);//将长度为8的字符串转为二进制位串void DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);//生成子密钥void DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);//密钥置换void DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);//密钥扩展void DES_ROL(ElemType data[56], int time);//密钥移动方法void DES_IP_Transform(ElemType data[64]);//初始变换void DES_IP_1_Transform(ElemType data[64]);//末置换void DES_E_Transform(ElemType data[48]);//数据右部扩展void DES_P_Transform(ElemType data[32]);//p置换void DES_SBOX(ElemType data[48]);//s置换void DES_XOR(ElemType R[48], ElemType L[48],int count);void DES_Swap(ElemType left[32],ElemType right[32]);void DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);void DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);//加密方法int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile); //解密方法int CFB_Decrypt(ElemType plain[100],ElemType key[8],ElemType cipher[100]);int CFB_Encrypt(ElemType plain[100],ElemType key[8],ElemType cipher[100]);//字节转换成二进制void ByteToBit(ElemType ch, ElemType bit[8]){for(cnt = 0;cnt < 8; cnt++){*(bit+cnt) = (ch>>cnt)&1;}}//二进制转换成字节void BitToByte(ElemType bit[8],ElemType *ch){int cnt;for(cnt = 0;cnt < 8; cnt++){*ch |= *(bit + cnt)<<cnt;}}//将长度为8的字符串转为二进制位串void Char8ToBit64(ElemType ch[8],ElemType bit[64]){int cnt;for(cnt = 0; cnt < 8; cnt++){ByteToBit(*(ch+cnt),bit+(cnt<<3));}}//将二进制位串转为长度为8的字符串void Bit64ToChar8(ElemType bit[64],ElemType ch[8]){int cnt;memset(ch,0,8);for(cnt = 0; cnt < 8; cnt++){BitToByte(bit+(cnt<<3),ch+cnt);}}//生成子密钥void DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56];int cnt;DES_PC1_Transform(key,temp);//PC1置换for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥DES_ROL(temp,MOVE_TIMES[cnt]);//循环左移DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥}}//密钥置换方法void DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){for(cnt = 0; cnt < 56; cnt++){tempbts[cnt] = key[PC_1[cnt]-1];}}//密钥扩展方法void DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){ int cnt;for(cnt = 0; cnt < 48; cnt++){tempbts[cnt] = key[PC_2[cnt]-1];}}//循环左移void DES_ROL(ElemType data[56], int time){ElemType temp[56];//保存将要循环移动到右边的位memcpy(temp,data,time);memcpy(temp+time,data+28,time);//前28位移动memcpy(data,data+time,28-time);memcpy(data+28-time,temp,time);//后28位移动memcpy(data+28,data+28+time,28-time);memcpy(data+56-time,temp+time,time);}//IP置换void DES_IP_Transform(ElemType data[64]){int cnt;ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_Table[cnt]-1];}memcpy(data,temp,64);}//IP逆置换void DES_IP_1_Transform(ElemType data[64]){ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_1_Table[cnt]-1];}memcpy(data,temp,64);}//扩展置换void DES_E_Transform(ElemType data[48]){int cnt;ElemType temp[48];for(cnt = 0; cnt < 48; cnt++){temp[cnt] = data[E_Table[cnt]-1];}memcpy(data,temp,48);}//P置换void DES_P_Transform(ElemType data[32]){int cnt;ElemType temp[32];for(cnt = 0; cnt < 32; cnt++){temp[cnt] = data[P_Table[cnt]-1];}memcpy(data,temp,32);}//异或void DES_XOR(ElemType R[48], ElemType L[48] ,int count){ int cnt;for(cnt = 0; cnt < count; cnt++){R[cnt] ^= L[cnt];}}//S盒置换void DES_SBOX(ElemType data[48]){int cnt;int line,row,output;int cur1,cur2;for(cnt = 0; cnt < 8; cnt++){cur1 = cnt*6;cur2 = cnt<<2;//计算在S盒中的行与列line = (data[cur1]<<1) + data[cur1+5];//每组第一位乘2加上第六位row = (data[cur1+1]<<3) + (data[cur1+2]<<2)+ (data[cur1+3]<<1) + data[cur1+4];//每组第二位乘8加上第三位乘4加上第四位乘2加上第五位output = S[cnt][line][row];//化为2进制data[cur2] = (output&0X08)>>3;data[cur2+1] = (output&0X04)>>2;data[cur2+2] = (output&0X02)>>1;data[cur2+3] = output&0x01;}}//交换void DES_Swap(ElemType left[32], ElemType right[32]){ElemType temp[32];memcpy(temp,left,32);memcpy(left,right,32);memcpy(right,temp,32);}//加密单个分组void DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){ElemType plainBits[64];ElemType copyRight[48];int cnt;Char8ToBit64(plainBlock,plainBits);//初始置换(IP置换)DES_IP_Transform(plainBits);//16轮迭代for(cnt = 0; cnt < 16; cnt++){memcpy(copyRight,plainBits+32,32);//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(plainBits,copyRight,32);if(cnt != 15){//最终完成左右部的交换DES_Swap(plainBits,plainBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(plainBits);Bit64ToChar8(plainBits,cipherBlock);}//解密单个分组void DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){ElemType cipherBits[64];ElemType copyRight[48];int cnt;Char8ToBit64(cipherBlock,cipherBits);//初始置换(IP置换)DES_IP_Transform(cipherBits);//16轮迭代for(cnt = 15; cnt >= 0; cnt--){memcpy(copyRight,cipherBits+32,32);//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(cipherBits,copyRight,32);if(cnt != 0){//最终完成左右部的交换DES_Swap(cipherBits,cipherBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(cipherBits);Bit64ToChar8(cipherBits,plainBlock);}int DES_Encrypt(ElemType IV[64],ElemType key[8],ElemType Sfrist[8]){ElemType IVBlock[64],bKey[8],subKeys[16][48],cipherBlock[8],cipherBits[64];Bit64ToChar8(IV,IVBlock);Char8ToBit64(key,bKey);//生成子密钥DES_MakeSubKeys(bKey,subKeys);DES_EncryptBlock(IVBlock, subKeys, cipherBlock);Char8ToBit64(cipherBlock,cipherBits);for(int i=0;i<8;i++){Sfrist[i]=cipherBits[i];}return OK;}int CFB_Encrypt(ElemType plain[100],ElemType key[8],ElemType cipher[100]) {ElemType plainbit[8];ElemType Sfrist[8],Cbit[8];ElemType IV[64],IVBlock[8]={0};Char8ToBit64(IVBlock,IV);//DES_Encrypt(IV,key,Sfrist);for(int i=0;i<strlen(plain);i++){DES_Encrypt(IV,key,Sfrist);ByteToBit(plain[i], plainbit);for(int j=0;j<8;j++){Cbit[j]=plainbit[j]^Sfrist[j];}for(j=0;j<56;j++){IV[j]=IV[j+8];}for(j=0;j<8;j++){IV[j+56]=Cbit[j];}BitToByte(Cbit,&cipher[i]);}printf("cipher:\n%s\n",cipher);return 0;}int CFB_Decrypt(ElemType CFB_plain[100],ElemType key[8],ElemType cipher[100]) {ElemType cipherbit[8];ElemType Sfrist[8],Pbit[8];ElemType IV[64],IVBlock[8]={0};Char8ToBit64(IVBlock,IV);for(int i=0;i<strlen(cipher);i++){DES_Encrypt(IV,key,Sfrist);ByteToBit(cipher[i], cipherbit);for(int j=0;j<8;j++){Pbit[j]=cipherbit[j]^Sfrist[j];}for(j=0;j<56;j++){IV[j]=IV[j+8];}for(j=0;j<8;j++){IV[j+56]=cipherbit[j];}BitToByte(Pbit,&CFB_plain[i]);}printf("%s\n",CFB_plain);return 0;}int CFB(){/* clock_t a,b;a = clock();b = clock();a = clock();b = clock();printf("解密消耗%d毫秒\n",b-a);//system("pause");//getchar();*/ElemType plain[100]={0},CFB_plain[100]={0},plainbit[8],key[8],cipher[100]={0};printf(" DES in CFB mode\n");printf("plesse interput plain\n");scanf("%s",&plain);printf("please interput key(8)\n");scanf("%s",&key);CFB_Encrypt(plain,key,cipher);printf("\nDecrypt:\n");CFB_Decrypt(CFB_plain,key,cipher);return OK;}int OFB_DeEncrypt(ElemType plain[100],ElemType key[8],ElemType cipher[100]) {ElemType plainbit[8];ElemType Sfrist[8],Cbit[8];ElemType IV[64],IVBlock[8]={0};Char8ToBit64(IVBlock,IV);//DES_Encrypt(IV,key,Sfrist);for(int i=0;i<strlen(plain);i++){DES_Encrypt(IV,key,Sfrist);ByteToBit(plain[i], plainbit);for(int j=0;j<8;j++){Cbit[j]=plainbit[j]^Sfrist[j];}for(j=0;j<56;j++){IV[j]=IV[j+8];}for(j=0;j<8;j++){IV[j+56]=Sfrist[j];}BitToByte(Cbit,&cipher[i]);}return 0;}int OFB(){ElemType plain[100]={0},OFB_plain[100]={0},plainbit[8],key[8],cipher[100]={0};printf(" DES in OFB mode\n");printf("plesse interput plain\n");scanf("%s",&plain);printf("please interput key(8)\n");scanf("%s",&key);OFB_DeEncrypt(plain,key,cipher);printf("cipher:\n%s\n",cipher);printf("\nDecrypt:\n");OFB_DeEncrypt(cipher,key,OFB_plain);printf("%s\n",OFB_plain);return OK;}void main(){int i=0;char buttern;loop:printf(" chose the mode of des\n");printf(" 1 CFB 2 OFB\n ");scanf("%d",&i);if(i==1)CFB();else OFB();printf("Do you want to continune\n(Y/N)\n");scanf("%c",&buttern);if(buttern='y')goto loop;}。