但非对称加密比对称加密慢,有时会慢一两个数量级,所以常用方式是:
使用使用对称加密对非对称加密的公私钥进行加密
OpenSSL 是一个安全层密码库,囊括主要的、常用的和证书封装管理功能及协议,并提供丰富的应用程序供测试或其它目的使用。
openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。
为了做个更简单的区分,我分成下面3种,可能你看着会亲切一些
目前有以下
两种编码
格式.
我们平时见到的多种后缀名,都是
语义化
的后缀,在生成密钥的时候,比如我们私钥的后缀名可以写.pem
.key
,都是可以的,以下几种为常用后缀
我们需要用到 openssl enc
命令,先看下帮助文档
使用,默认从控制台输入密码,如果不指定加密算法,是不会进行加密的,也不会报错,比如我们不指定算法,只指定base64格式输出,就相当于只做了base64编码而已
/*使用diff命令查看可知解码前后明文一样*/分别在使用和不使用密码加密文档的情况下,对文档进行加密
使用密码解密非加密文档
不使用密码解密加密文档
结论:base64不具备文档加密功能。
结论:后面也会提示输入密码
注意!!!!!!!!!!!!!
如果想要加密文件的同时打印盐值,则只能用 -p
,不能用 -P
,因为 -P 是打印盐值,然后退出。
/*生成不加密的RSA密钥*/
/*为RSA密钥增加口令保护*/
/*为RSA密钥去除口令保护*/
/*比较原始后的RSA密钥和去除口令后的RSA密钥,是一样*/
2、修改密钥的保护口令和算法
3、查看密钥对中的各个参数
4、提取密钥中的公钥并打印模数值
/*提取公钥,用pubout参数指定输出为公钥*/
/*打印公钥中模数值*/
-passout
表示为输出的文件进行加密(对称加密)
可以再命令的最后指定私钥长度,默认是512bit
-pubout
指定输出文件是公钥
-passin
:如果输入的文件被加密,使用passin进行解密
-passout
:对输出的公钥进行加密(对称加密)
openssl rsa
用于对密钥的各种操作,比如为私钥生成公钥、对密钥设置或解除密码、查看密钥信息、改变密钥格式等
注意:无论是使用公钥加密还是私钥加密,RSA每次能够加密的数据长度不能超过RSA密钥长度,并且根据具体的补齐方式不同输入的加密数据最大长度也不一样,而输出长度则总是跟RSA密钥长度相等。RSA不同的补齐方法对应的输入输入长度如下表
少于(密钥长度-11)字节 |
少于(密钥长度-11)字节 |
少于(密钥长度-11)字节 |
/*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/ /*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/ /*比较原始文件和解密后文件*/ /*使用公钥进行加密*/ /*比较原始文件和解密后文件*/ /*使用RSA密钥进行签名,实际上使用私钥进行加密*/ /*使用RSA密钥进行验证,实际上使用公钥进行解密*/ /*对比原始文件和签名解密后的文件*/ /*使用私钥进行签名*/ /*使用公钥进行验证*/ /*对比原始文件和签名解密后的文件*/使用rsautl进行加密和解密操作,我们还是先看一下帮助文档
无法加载私钥,明明是使用公钥加密的,干嘛要去加载私钥呢?
没有指定是使用公钥加密,就是没有加 -pubin
参数,不加参数的话,默认是使用私钥文件进行加密,即在私钥文件中提取公钥再加密,也就是不加 -pubin
参数的话,加密命令为:
即:不使用生成的公钥文件,而是直接在私钥中提取公钥进行加密(这意味着从私钥能推导出公钥?)
签名:A对信息进行签名是确认这个信息是A发出的
加密:确保信息只有B可以获取
一般公钥用来加密,私钥用来签名
通常发送信息的流程为:
为了便于生产有限种类的电阻、电容、电感,国际上制定了一组标准。本文以
下全拿电阻举例,同样的道理可以延伸到电位器、电容和电感等。比如从
间的电阻数量,不同精度可有无数种阻值,比如:
凡此种种毫无规律可循的阻值有无限多个,生产这样的电阻显然极不利于
安排生产。电路实际应用中,控制相对误差往往是非常重要的,于是国际上制定了
系列电阻,作为统一的标准电阻的阻值,叫做电阻的标称阻值,生
产厂家都可以按照该标准指定的标称阻值去生产电阻。
六大系列,分别对应于相
Ω范围之外的电阻就是这个
遍历全部可能的电阻值,
并把任何一个阻值的相对误差都控制在±
因误差较大,电阻中较少采用,
误差一般,在固定电阻中广泛
误差较小,在固定电阻中应用
较多,常用在精度要求稍高的
Lua是一种动态类型的语言。在语言中没有类型定义的语法,每个值都“携带”了它自身的类型信息。
在Lua中有8种基础类型:
如果字符串中有]]
字符,例如"a=b[c[i]]",或者可能需要包含已经被注释掉的代码。为了应对这种情况,需要在两个左方括号中间加上任意数量的等号,例如:
经过这样修改后,字符串只有在遇到一个内嵌相同数量等号的双右括号时才会结束。如果一组左右方括号等号数量不等,那么Lua就会忽略它。通过选择适当数量的等号,就可以在不加转义的情况下,直接嵌入任意的字符串内容了。
这套机制同样适用于注释,例如:以"–[=["开始的一个块注释将延伸至“]=]”结束。如此简化了注释那些“已经包含了注释块”的代码,例如:
Lua提供了运行时的数字和字符串的自动转换。在一个字符串上应用算术操作时,Lua会尝试将这个字符串转换成一个数字,例如:
Lua不仅在算术操作中会施以这种强制转换,还会在其他任何需要数字的地方这么做。相反,在Lua期望一个字符串但却得到一个数字是,它也会将数字转换成字符串,例如:
在Lua中,“…”是字符串连接操作符。当直接在一个数字后面输入它的时候,必须要用一个空格来分隔它们,不然,Lua会将第一个点理解为一个小数点。
这种隐式转换最好还是不要依赖它们,虽然在某些地方这些转换显得很便利,但它们也给语言和使用它们的程序带来的复杂性。毕竟,字符串和数字是两种不同的东西。比如运行10=="10"总是false,因为10是一个数字,而"10"是一个字符串。如果需要显示地将一个字符串转换成数字,可以使用函数tonumber()
。当这个字符串的内容不能表示一个正确的数字时,tonumber()
将返回nil。
若要将一个数字转换成字符串,可以调用函数tostring()
,或者将该数字与一个空字符串相连接:
这样的转换永远是合法的。
在Lua5.1中,可以在字符串前放置操作符"#"来获得字符串的长度,例如:
table类型实现了“关联数组”,关联数组是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或其他类型的值(除了nil)来索引它。
table没有固定的大小,可以动态地添加任意数量的元素到一个table中。
table是Lua中最主要的数据结构机制,具有强大的功能。基于table,可以以一种简单、统一和高效的方式来表示普通数组、符号表、集合、记录、队列和其它数据结构。
Lua也是通过table表示模块、包和对象的 。当输入io.read
的时候,其含义是“io模块中的read函数”。对于Lua而言,这表示“使用字符串"read”作为key(键)来索引table.io
"。
在Lua中,table既不是“值”,也不是“变量”,而是“对象”。可以将一个table想象成一种动态分配的对象,程序仅持有一个对它们的引用(或指针),Lua不会暗中产生table的副本或创建新的table。
table的创建是通过“构造表达式”完成的,最简单的构造表达式就是{},例如:
table永远是“匿名的”,一个持有table的变量与table自身之间没有固定的关联性。
当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终会删除该table,并复用它的内存。
所有的table都可以用不同类型的索引来访问value,当需要容纳新条目时,table会自动增长。
当table的某个元素没有初始化时,它的内容就为nil。另外还可以像全局变量一样,将nil赋予table的某个元素来删除该元素。
为了表示一条记录,可以将字段名作为索引。Lua对于诸如a[“name”]的写法提供了一种更简便的“语法糖”,可以直接输入a.name
对于Lua来说,这两种形式是等价的,可供自由使用。然而这两种形式对于一个读者来说,可能就暗示了不同的意图。点的写法可能更明确地暗示了读者,将table作为一条记录来使用,每条记录都有一组固定的、预定义的key。而字符串的写法可能暗示了该table会以任何字符串作为key,二现在出于某些原因,需要访问某个特定的key。
初学者常会将a.x和a[x]搞错,前者表示a[“x”],表示以字符串“x”来索引table,而后者是以变量x的值来索引table,例如:
若要表示一个传统的数组或线性表,只需以整数作为key来使用table即可,直接初始化元素就可以了,例如:
虽然可以用任何值作为一个table的索引,也可以用任何数字作为数组索引的起始值。但就Lua的习惯而言,数组通常以1作为索引的起始值。并且还有不少几只依赖于这个惯例。
在Lua 5.1中,长度操作符“#”用于返回一个数组或线性表的最后一个索引值(或为其大小),例如:
以下是几种长度操作符在Lua中的习惯写法:
由于数组实际是一个table,所以关于其大小的概念可能会有些模糊。table中对于所有为初始化的元素的索引结果都是nil,Lua将nil作为界定数组结尾的标志。当一个数组有“空隙”时(即中间含有nil时),长度操作符会认为这些nil元素就是结尾标记。因此如果需要处理那些含有“空隙“的数组,使用长度操作符就不安全了,可以使用函数table.maxn,它将返回table的最大正索引数。
由于可以用任何类型的值来索引table,因此可能会遇到一些看似相同,但却实际不同的索引方式。例如:可以用数字0和字符串“0”来索引一个table,这两个索引值是不同的,因此也就表示了table中两个不同的条目。与此类似的还有字符串“+1”、“01”和“1”,这些都表示了不同的条目。当对索引的实际类型不是很确定时,可以明确地使用一个显示转换:
在Lua中,函数是作为“第一类值”来看待的,这表示函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。
这种特性是语言具有极大的灵活性,为了给一个函数添加新的功能,程序可以冲的定义该函数。而在运行一些不受信任的代码时,可以先删除某些函数,从而创建一个安全的运行环境。
此外,Lua对“函数式编程”也提供了良好的支持。例如,允许在某些词法域中编写嵌套的函数。
Lua既可以调用以自身Lua语言编写的函数,又可以调用以C语言编写的函数。Lua所有的标准库都是用C语言写的,标准库中包括对字符串的操作、table的操作、I/O、操作系统的功能调用、数学函数和调试函数。同样,应用程序也可以用C语言来定义其他函数。
由于userdata类型可以将任意的C语言数据存储到Lua变量中。在Lua中,这种类型没有太多的预定义操作,只能进行赋值和相等性测试。userdata用于表示一种应用程序或C语言库所创建的新类型,例如标准的I/O库就是userdata来表示文件。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。