密码学专题 对称加密算法

  • 一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式
  • OpenSSL的对称加密算法指令主要用来对数据进行加密和解密处理输入输出的方式主要是文件,当然,也可以是默认的标准输入输出设备
  • OpenSSL基本上为所有其支持的对称加密算法都提供了指令方式的应用,这些应用指令的名字基本上都是以对称加密算法本身的名字加上位数、加密模式或其他属性组合而成。比如DES算法的CBC模式,其对应的指令就是des-cbc。
  • 要查找最新版本的OpenSSL支持哪些对称加密算法指令,只要在OpenSSL应用程序提示符下输入“-help”,就可以看到在输出信息最后部分(Ciphercommands)有很多我们熟悉的算法名称,这些就是OpenSSL支持的对称加密算法指令。OpenSSL还将所有的对称加密算法指令集成在一个指令程序中,那就是enc指令
  • enc指令是OpenSSL中对称加密算法指令的集大成者,用户可以在它的一个参数中指定使用哪种加密算法和模式,从而统一了对称加密算法指令的入口。enc指令的格式跟单独一个对称加密算法指令的格式是基本一样的,但是增加了一个算法类型的选择参数选项。
  • 比如,下面两种形式的指令是等价的:

  • OpenSSL的对称加密算法指令还可以增加BASE64编解码的功能,也就是说,可以在数据加密后将数据进行BASE64编码后输出保存,然后在解密的时候先将数据进行BASE64解码后再进行解密。这样,对于加密后数据的保存和处理就更加方便,因为BASE64编码将加密后的很多不可见字符都编码成可见的字符了。当然,如果你愿意,也可以单独使用BASE64编码的功能,OpenSSL为此也提供了专门的指令,其使用形式跟其他对称加密算法指令是一致的。
  • OpenSSL的对称加密算法指令还可以作为使用第三方加密库(通常是硬件加密设备)的应用接口,也就是说,它可以使用第三方的加密库作为完成加密操作的真正设备。这是通过OpenSSL的Engine机制实现的。当然,使用第三方加密库的前提是你已经安装了第三方的加密设备并成功通过Engine机制加载到了OpenSSL中。 
  • 不过,对OpenSSL的所有指令,包括对称加密算法指令,你不能期望过高,这些指令虽然功能强大,但是并没有支持所有可能的加密算法和模式,只是提供了固定的部分功能。比如对称加密算法指令就不支持76位的RC2加解密或者84位的RC4加解密等功能。如果你想使用这些灵活的加密模式和算法,那么就需要对OpenSSL进行进一步的深入研究,即使用OpenSSL的API。

 

  • 对于大部分块加密对称加密算法,OpenSSL都提供了CBC、CFB、ECB和OFB四种加密模式。需要注意的是,对于使用两个密钥和三个密钥EDE方式的三重DES算法,其ECB模式的指令名称并没有明确标出,很容易跟CBC模式混同,因为块加密算法使用最多的是CBC方式。 
  • 如果要单独使用BASE64编码而不进行数据的加密和解密,那么只要简单地忽略算法类型参数并加上“a”或者“base64”选项就可以了,当然,你如果不愿意忽略算法类型,也可以输入“-none”选项。下面三种形式是等价的,仅使用BASE64编码的指令:

  • 从表还可以看出,对于绝大部分对称加密算法来说,都有enc参数式的指令和单独的指令两种方式,它们都是等价的,至于选择哪一种,主要取决于用户本身的偏好。不过,enc指令可能会更快地支持新的对称加密算法,而单独的对称加密算法指令就不一定能得到及时的更新。这跟enc实现的机制是有关系的,因为enc使用的是OpenSSL内部定义的对称加密算法简称作为类型输入参数,只要是OpenSSL定义的对称加密算法模式,enc程序都能通过接口API自动支持,不需要因为增加了新的对称加密算法而进行enc应用程序的修改。 
  • 相对于其他指令来说,对称加密算法的指令参数比较少,使用起来也相对容易。对称 加密算法指令的参数形式如下:

  • iphername是在表7-1中第二列和第三列中出现的参数值之一。如果你选择第一种指令形式,那么就需要选择表7-1第二列的参数形式;如果你选择的是后一种独立对称加密算法指令方式,那就应该使用表7-1第三列的参数形式。对于第一种对称加密算法指令使用方式来说,如果你不需要进行任何加密或解密处理,那么可以输入none选项替代ciphername,当然,你也可以简单忽略ciphername选项,其效果是一样的。

(2)in和out选项

  • 这两个选项分别用于指令输入和输出文件,对于加密操作来说,输入的应该是明文文件,也就是要加密的文件,输出的是密文文件,即经过加密的文件;对于解密操作来说,输入的是经过加密的文件,而输出的是恢复的明文文件。输入和输出文件名本身是没有任何限制的,只要符合习惯的文件名形式即可。需要注意的是,一般不要试图编辑和改变加密后的文件,那样做可能引起文件的部分甚至全部内容不能进行正确的解密!默认的输入和输出文件是标准输入和输出设备,对于Windows来说,就是指令行界面。需要注意的是,如果提供的输出文件名是已经存在的文件,那么程序会首先将该文件内容清空!

(3)口令输入选项pass,k和kfile

  • 如果你不愿意输入繁杂的用来加密数据的密钥和初始向量,那么可以使用从口令中提取密钥和初始向量的方法。OpenSSL对称加密算法指令中输入口令的目的正在于此,事实上,OpenSSL中几乎所有输入的口令都是用作提取密钥的材料,而不是直接用作加密的密钥。pass选项提供了最灵活的口令输入方式,输入的源可以是标准输入设备、指令行直接输入、提示输入、文件、环境变量和文件描述符,具体的格式介绍读者可以参考7-4节的应用实例。k选项和kfile选项都是为了兼容以前的版本而保留的,它们的功能目前都可以使用pass选项来实现。k选项后面输入的参数是口令字符。kfile选项后面输入的参数是作为口令的文件名,当然,必要的时候应该也提供路径。OpenSSL的口令文件以第一行作为输入口令。

(4)e和d选项

  • e和d选项分别表示执行加密操作(encryption)和解密操作(decryption),两个参数是互斥的,不能同时出现,但是可以同时不出现,这时候就执行默认的操作,即执行加密操作。这两个选项都不带参数。

(5)base64,a和A选项

  • 选项a和base64的作用是相同的,就是将文件进行BASE64的编解码操作。对于加密操作来说,就在数据加密之后进行BASE64编码;对于解密操作来说,就在解密操作之前执行BASE64解码。A选项跟a或者base64选项一起使用才能生效,如果出示了A选项,则程序将努力将所有加密数据作为一行进行BASE64编码,而不是按照文件原有的换行格式进行BASE64编码。需要注意的是,在文件比较大的时候,A选项经常会导致指令执行失败。上述三个选项都不带参数。

(6)K和IV选项

  • 如果你使用这两个选项,意味着你不相信OpenSSL从口令提取加密密钥和初始向量的方法,而使用自己直接提供的加密密钥和初始向量,那么这时候你就不再需要使用口令选项。K选项后面的参数是加密密钥,是以十六进制的方式表示,长度不能超过64个字符。IV选项只有在分组加密算法的某些模式才需要,其参数也是以十六进制的方式表示,长度不能超过32个字符。如果输入的参数不是十六进制的字符,那么程序就会报错。上述选项参数输入的长度如果不够,就在后面补零替代。

(7)salt,nosalt和S选项

  • salt选项指明在从口令提取密钥的过程中使用盐值,这可以增强被加密数据的安全性,事实上,即便不出示此选项,默认指令也会使该选项生效。nosalt选项跟salt选项相反,告诉指令在密钥提取的过程中不使用盐值,一般来说,如果不是特别地为了跟OpenSSL一些老版本兼容,不要做这样降低安全性的事情。S选项后面的输入参数是十六进制编码的真正使用的盐值,其长度不能超过16个字符。所有这些选项只有跟口令输入选项一起使用才会生效,如果你使用K和IV选项方式输入加入密钥,那么这些选项将不会产生任何作用。

(8)engine选项

  • 该选项的参数是OpenSSL支持的Engine的名称,一般是以字符串表示,比如“cswift”,“nuron”和“pkcs11”等。如果你不知道目前你的OpenSSL支持的Engine特征字符串,可以输入下列指令,其中有效的Engine都会提示出来:
  • OpenSSL>engine -t
  • 如果你使用了有效的Engine,那么你所执行的加密操作实际上都是在第三方加密设备中执行,而不再是使用OpenSSL密码库的软件算法。

(9)p和P选项

  • p选项打印出对称加密算法真正使用的加密密钥和初始向量,输出的格式是十六进制的形式。如果出示了P选项,则程序在打印出加密密钥和初始向量后就立刻退出,而不执行真正的加密或解密操作。

(10)nopad,bufsize和debug选项

  • 这几个选项之间其实并没有联系,这里之所以放在一起,只是为了节省篇幅。nopad选项指定不使用默认的PKCS#5标准的补丁方式,如果这样做,那么就要确保在块加密算法中输入的数据是加密块长度的整数倍,比如使用DES算法,就要保证输入的数据是8字节的整数倍。
  • bufsize选项的参数指定了读写文件的I/O缓存,指定的数字以字节为单位,也可以在数字后面加“k”表示是以1024字节为单位。比如,下面的格式都是可以被接受的:
  • -bufsize 256 或者 -bufsize 8k
  • 如果你指定的缓存小于80字节,指令程序会自动将它增加为80字节,这是进行BASE64一行编码所需要的最小长度。
  • 使用debug选项后,OpenSSL的对称加密算法指令会将整个执行过程中I/O操作相关的BIO列出来。这主要是为了调试目的而使用,对于一般用户来说,该选项很少使用。

例子

  • 本节将给出对称加密算法指令的一些具体实例,在下面的例子中,“pln.txt”表示明文文件,“enc.txt”表示经过加密的密文文件,而“rcv.txt”表示恢复的明文文件。
  • 下面指令将文件pln.txt的内容复制到文件enc.txt中:

  • 使用的时候 需要指定文件的绝对路径 

  •  OpenSSL对称加密算法加密数据的时候需要使用密钥,对于块加密算法的某些模式,还需要初始向量,既可以直接输入加密密钥和初始向量,也可以通过口令来提取加密密钥和初始向量
  • 就口令输入来说,也有多种不同的方式,本节将给出多种输入口令和密钥的例子。
  • 下面是DES算法CBC模式指令直接使用加密密钥和初始向量的例子:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络防火墙单向和双向_单向晶闸管与双向晶闸管之间的不同之处

晶闸管是回一个可以控导点开关,能以弱电去控制强电的各种电路。晶闸管常用于整流,调压,交直流变化,开关,调光等控制电路中。具有提交小,重量轻,耐压高,容量大,效率高&…

python版本切换_怎么切换python版本

展开全部 (1)分别安2113装 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官网下载的) 顺序无所谓(为5261了看着4102方便,我把安装路径修改统一了1653) (2)配置…

react.lazy 路由懒加载_Vue面试题: 如何实现路由懒加载?

非懒加载import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源码剖析 deque双端队列 概述

vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间。deque可以在头尾两端分别进行元素的插入和删除操作vector和deque的差异 1,deque允许常数时间内对于头端元素进行插入和删除操作2,deque没有所谓容量(capacity)的概念&…

STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

Stack是一种先进后出的数据结构,他只有一个出口stack允许 新增元素、移除元素、取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为Stack定义的完整列表 (双端队列作为Stack的底层容器) 将deque作为Stack的底部结构&#…

python怎么实现图像去噪_基于深度卷积神经网络和跳跃连接的图像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者:Xiao-Jiao Mao、Chunhua Shen等本文提出了一个深度的全卷积编码-解码框架来解决去噪和超分辨之类的图像修复问题。网络由多层的卷积和反卷积组成&a…

STL源码剖析 queue队列概述

queue是一种先进先出的数据结构,他有两个出口允许新增元素(从最底端 加入元素)、移除元素(从最顶端删除元素),除了对于顶端和底端元素进行操作之外,没有办法可以获取queue的其他元素即queue没有…

python为什么运行不了_python为什么会环境变量设置不成功

学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装 Windows 打开Python官方下载网站 x86:表示是32位电脑 x86-64:表示是64位电脑 目前Python版本分为2.x版本和3.x版本。推荐大家使用3.x版本。 设置环境变量&…

STL 源码剖析 heap堆

heap不属于STL容器的组件,属于幕后角色,是priority_queue的助手priority_queue 允许用户以任何次序将任何元素推入容器内,但是取出的时候需要从优先级最高(也就是数值最高)的元素开始取,这种思想是基于heap的函数实现如果使用list…

java 打印星号

代码1 package lesson.l2_for; //6列4行 //****** //****** //****** //****** public class ForDemo8 {public static void main(String[] args) {for (int i1;i<4;i){for (int j 1; j <6 ; j) {System.out.print("*");}System.out.println();}} }代码2 pa…

python从小白到大牛百度云盘_Java从小白到大牛 (关东升著) 中文pdf+mobi版[36MB]

《Java从小白到大牛》是一本Java语言学习立体教程&#xff0c;读者群是零基础小白&#xff0c;通过本书的学习能够成为Java大牛。主要内容包括&#xff1a;Java语法基础、Java编码规范、数据类型、运算符、控制语句、数组、字符串、面向对象基础、继承与多态、抽象类与接口、枚…

java打印九九乘法表

代码1 package lesson.l5_loop; //九九乘法表 //1*11 //2*12 2*24 //3*13 3*26 3*39 //4*14 4*28 4*312 4*416 //5*15 5*210 5*315 5*420 5*525 //6*16 6*212 6*318 6*424 6*530 6*636 //7*17 7*214 7*321 7*428 7*535 7*642 7*749 //8*18 8*216 8*324 8*432 8*540 8*648 8*75…

STL源码剖析 priority_queue

priority_queue是一个拥有权重概念的queue&#xff0c;允许底部加入新的元素&#xff0c;头部删除旧的元素&#xff0c;以及审视元素数值的操作priority_queue带有权重的概念&#xff0c;即元素按照权重进行排列&#xff0c;而不是按照插入队列的顺序进行排序。要求权值高者在前…

python数字1 3怎么表示_Python入门篇之数字

数字类型 数字提供了标量贮存和直接访问。它是不可更改类型&#xff0c;也就是说变更数字的值会生成新的对象。当然&#xff0c;这个过程无论对程序员还是对用户都是透明的&#xff0c;并不会影响软件的开发方式。 Python 支持多种数字类型&#xff1a;整型、长整型、布尔型、双…

STL源码剖析 slist单向链表概述

概述 SGI STL的list是一个双向链表&#xff0c;单向链表是slist&#xff0c;其不在标准规格之内单向和双向链表的区别在于&#xff0c;单向链表的迭代器是单向的 Forward Iterator&#xff0c;双向链表的迭代器属于双向的Bidirectional Iterator。因此很多功能都被受限但是单向…

output怎么用_用树莓派实现室内温度监控

树莓派加上温度传感器实现室内温度监控。可用于家庭&#xff0c;轿车&#xff0c;工业&#xff0c;农业 等许多方面。可做温度预警&#xff0c;自动降温等操作。各位小伙伴可自行脑补发挥。1.硬件准备a.树莓派&#xff08;Raspberry Pi&#xff09;一个b.DS18B20温度传感器一个…

STL源码剖析 关联式容器

STL关联式容器以set(集合) 和 map(映射表)两大类&#xff0c;以及对应的衍生体构成,比如mulyiset(多键集合) multimap(多键映射表) ,容器的底层均基于红黑树RB-Tree也是一个独立的容器&#xff0c;但是不对外开放此外还提供了标准之外的关联式容器 hash table散列表&#xff0c…

STL源码剖析 关联式容器 红黑树

概念 红黑树不仅仅是一个二叉树&#xff0c;必须满足如下条件1&#xff0c;每个节点不是红色就是黑色 (深色底纹为黑色&#xff0c;浅色底纹为红色)2&#xff0c;根节点是黑色的3&#xff0c;如果节点为红&#xff0c;其子节点必须为黑色的4&#xff0c;任一节点至NULL(树的尾…

python生成的词云没有图案_还在为专栏封面发愁?我用Python写了个词云生成器!...

妈妈再也不用担心我写专栏找不到合适的封面了&#xff01;B站专栏的封面至少是我一直头疼的问题&#xff0c;每次写完文章却找不到合适的图片作为封面。 词云是一个很不错的选择&#xff0c;既美观&#xff0c;又提纲挈领。网上也有词云生成的工具&#xff0c;但大多收费/只能试…

java 1000以内的完数

题目 代码 package lesson.l6_review;public class PrefectNumber {public static void main(String[] args) {for (int i 1; i <1000 ; i) {int num0;for (int j 1; j <i-1 ; j) {if (i%j0){numj;}}if (inum){System.out.print(i"\t");}}} }