c语言中1.5E12是什么?

  1. 对称加密:发送方和接受方使用同样的一把私钥,私钥用于加密和解密
  2. 非对称加密:有一把公钥,有一把私钥,使用公钥加密,只能使用私钥进行解密

但非对称加密比对称加密慢,有时会慢一两个数量级,所以常用方式是:

使用使用对称加密对非对称加密的公私钥进行加密

OpenSSL 是一个安全层密码库,囊括主要的、常用的和证书封装管理功能及协议,并提供丰富的应用程序供测试或其它目的使用。

openssl是一个开源程序的套件、这个套件有三个部分组成:一是libcryto,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是libssl,这个是实现ssl机制的,它是用于实现TLS/SSL的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当CA来用,可以让你创建证书、吊销证书。

为了做个更简单的区分,我分成下面3种,可能你看着会亲切一些

  • 加解密库(本章只讨论加解密)
  • 一些经过封装,方便你使用加解密和SSL的工具

密钥、证书的编码格式和后缀名

目前有以下两种编码格式.

我们平时见到的多种后缀名,都是语义化的后缀,在生成密钥的时候,比如我们私钥的后缀名可以写.pem .key,都是可以的,以下几种为常用后缀

  • CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于Unix系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.
  • CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好,查看的办法:

3. 常用加解密算法使用

我们需要用到 openssl enc 命令,先看下帮助文档

-S 盐,用于加盐加密,请避免人为输入,下面讨论 -md 指定密钥生成的摘要算法 默认MD5 -engine e 指定三方加密设备,没有环境,暂不实验 Cipher Types 以下是部分算法,我们可以选择用哪种算法加密

使用,默认从控制台输入密码,如果不指定加密算法,是不会进行加密的,也不会报错,比如我们不指定算法,只指定base64格式输出,就相当于只做了base64编码而已

/*使用diff命令查看可知解码前后明文一样*/

分别在使用和不使用密码加密文档的情况下,对文档进行加密

使用密码解密非加密文档

不使用密码解密加密文档

结论:base64不具备文档加密功能。


/*从文件描述输入*/ /*从标准输入输入*/

结论:后面也会提示输入密码

注意!!!!!!!!!!!!!

如果想要加密文件的同时打印盐值,则只能用 -p ,不能用 -P ,因为 -P 是打印盐值,然后退出。


-des 生成的私钥采用DES算法加密 以上几个都是对称加密算法的指定,因为我们长期会把私钥加密,避免明文存放 -passout arg 输出文件的密码,如果我们指定了对称加密算法,也可以不带此参数,会有命令行提示你输入密码 -passin arg 如果输入文件被对称加密过,需要指定输入文件的密码 -passout arg 如果输出文件也需要被对称加密,需要指定输出文件的密码 -des 对输出结果采用对称加密 des算法 -des3 对输出结果采用对称加密 des3算法 以上几个都是对称加密算法的指定,生成私钥的时候一般会用到,我们不让私钥明文保存 -text 以明文形式输出各个参数值 -noout 不输出密钥到任何文件 -check 检查输入密钥的正确性和一致性 -pubin 指定输入文件是公钥 -pubout 指定输出文件是公钥 -engine e 指定三方加密库或者硬件
  1. rsa 添加 和 去除 密钥的对称加密
/*生成不加密的RSA密钥*/
/*为RSA密钥增加口令保护*/
/*为RSA密钥去除口令保护*/
/*比较原始后的RSA密钥和去除口令后的RSA密钥,是一样*/

2、修改密钥的保护口令和算法

3、查看密钥对中的各个参数

4、提取密钥中的公钥并打印模数值

/*提取公钥,用pubout参数指定输出为公钥*/
/*打印公钥中模数值*/

-passout 表示为输出的文件进行加密(对称加密)

可以再命令的最后指定私钥长度,默认是512bit

-pubout 指定输出文件是公钥

-passin :如果输入的文件被加密,使用passin进行解密

-passout :对输出的公钥进行加密(对称加密)

添加、去除密钥的对称加密

openssl rsa 用于对密钥的各种操作,比如为私钥生成公钥、对密钥设置或解除密码、查看密钥信息、改变密钥格式等


使用已有的公私钥对,进行非对称加解密

注意:无论是使用公钥加密还是私钥加密,RSA每次能够加密的数据长度不能超过RSA密钥长度,并且根据具体的补齐方式不同输入的加密数据最大长度也不一样,而输出长度则总是跟RSA密钥长度相等。RSA不同的补齐方法对应的输入输入长度如下表

少于(密钥长度-11)字节
少于(密钥长度-11)字节
少于(密钥长度-11)字节

使用rsautl进行加密和解密操作,我们还是先看一下帮助文档

/*使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密*/ /*使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密*/ /*比较原始文件和解密后文件*/ /*使用公钥进行加密*/ /*比较原始文件和解密后文件*/ /*使用RSA密钥进行签名,实际上使用私钥进行加密*/ /*使用RSA密钥进行验证,实际上使用公钥进行解密*/ /*对比原始文件和签名解密后的文件*/ /*使用私钥进行签名*/ /*使用公钥进行验证*/ /*对比原始文件和签名解密后的文件*/

无法加载私钥,明明是使用公钥加密的,干嘛要去加载私钥呢?

没有指定是使用公钥加密,就是没有加 -pubin 参数,不加参数的话,默认是使用私钥文件进行加密,即在私钥文件中提取公钥再加密,也就是不加 -pubin 参数的话,加密命令为:

即:不使用生成的公钥文件,而是直接在私钥中提取公钥进行加密(这意味着从私钥能推导出公钥?)


签名:A对信息进行签名是确认这个信息是A发出的

加密:确保信息只有B可以获取

一般公钥用来加密,私钥用来签名

通常发送信息的流程为:

  1. A使用自己的私钥对信息(一般是信息摘要)进行签名。
  2. A使用B的公钥对信息内容和签名信息进行加密
  1. 使用自己的私钥解密内容
  2. 得到解密后的明文后用A的公钥解签(验证)A的签名


}

为了便于生产有限种类的电阻、电容、电感,国际上制定了一组标准。本文以

下全拿电阻举例,同样的道理可以延伸到电位器、电容和电感等。比如从

间的电阻数量,不同精度可有无数种阻值,比如:

凡此种种毫无规律可循的阻值有无限多个,生产这样的电阻显然极不利于

安排生产。电路实际应用中,控制相对误差往往是非常重要的,于是国际上制定了

系列电阻,作为统一的标准电阻的阻值,叫做电阻的标称阻值,生

产厂家都可以按照该标准指定的标称阻值去生产电阻。

六大系列,分别对应于相

Ω范围之外的电阻就是这个

遍历全部可能的电阻值,

并把任何一个阻值的相对误差都控制在±

因误差较大,电阻中较少采用,

误差一般,在固定电阻中广泛

误差较小,在固定电阻中应用

较多,常用在精度要求稍高的

}

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来表示文件。


}

我要回帖

更多关于 c语言中double类型的数怎么输出 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信