密码学基础
密码学总览
信息安全面临的危险与应对这些威胁的密码技术:
关于上图中的威胁,这里在简单的说明:
- 窃听:指的是需要保密的消息被第三方获取。
- 篡改:指的是消息的内容被第三方修改,达到欺骗的效果。
- 伪装:指的是第三方伪装成接收者或者发送者,给对方发送消息。
- 否认:指的是发送方否认消息是本人发送的。
密码学家使用如下的工具来防止上述威胁:
- 对称密码
- 非对称密码
- 单向散列函数
- 消息认证码
- 数字签名
- 伪随机数生成器
下面将分别介绍上述的工具。
准备
为了能够更好的学习密码相关的知识,这里会用到openssl工具用于实操,这里使用的是Windows的版本。该工具可以在OpenSSL for Windows download | SourceForge.net下载到,如下所示:
通过Windows Shell可以打开该工具:
通过help可以看到它支持的很多功能,后面用到时会进一步介绍。
伪随机数生成器
随机数有两种:
- 通过硬件生成的随机数列,是根据传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息来生成的,像这样的硬件设备就称为随机数生成器(Random Number Generator, RNG)。
- 可以生成随机数的软件则称为伪随机数生成器(Pseudo Random Number Generator, PRNG)。
下面是使用openssl工具生成伪随机数的示例:
PS C:\Openssl> .\openssl.exe rand -hex 16
a2823bc9820d02e6dd78773010c8baf1
PS C:\Openssl> .\openssl.exe rand -hex 16
c92d8053cea96e64cd27b3154d25a99e
PS C:\Openssl> .\openssl.exe rand -hex 16
0d9a2265223180607c0e1090514bea70
PS C:\Openssl> .\openssl.exe rand -hex 16
98b1501cf21b6060fe2ae4739bf41bde
可以看到每次生成的都是不同的值。
随机数的作用:
- 生成密钥:用于对称密码和消息认证码。
- 生成密钥对:用于公钥密码和数字签名。
- 生成初始化向量(IV):用于分组密码的CBC、CFB和OFB模式。
- 生成盐:用于基于口令的密码(PBE)等。
对称密码
对称加密算法有两种类型:
- 块密码算法,比如DES、AES等都是块密码算法。
- 流密码算法,比如RC4(已经不再安全)、ChaCha等是流密码算法。
这里主要介绍块密码。
DES
DES算法已经被破解,不应该再使用。
AES
AES是一个对称密码算法标准,AES经过选拔之后最终确定Rijndael
算法为其标准。所以当我们提到AES算法时一般指的是Rijndael算法。
AES算法目前还是安全的。
分组
无论是DES还是AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就成为分组密码的“模式”。
一种最简单的模式称为ECB(Electronic CodeBook)模式,该模式将明文分组加密之后的结果直接作为密文分组:
ECB模式存在安全问题,一般不会使用。其它还有很多种模式:
具体每种分组方式的实现方法不做介绍。
示例
这里举一个AES的示例,根据AES的密钥长度以及分组的不同,可以组成不同的形式,在openssl工具中支持的就有如下的一些(这里只列举AES的部分):
PS C:\Openssl> .\openssl.exe enc -list
Supported ciphers:
-aes-128-cbc -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ctr -aes-128-ecb
-aes-128-ofb -aes-192-cbc -aes-192-cfb
-aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr
-aes-192-ecb -aes-192-ofb -aes-256-cbc
-aes-256-cfb -aes-256-cfb1 -aes-256-cfb8
-aes-256-ctr -aes-256-ecb -aes-256-ofb
-aes128 -aes128-wrap -aes192
-aes192-wrap -aes256 -aes256-wrap
以-aes-128-cbc
格式为例:
PS C:\Openssl> .\openssl.exe enc -e -aes-128-cbc -in .\plain.txt -out encrypt.txt -iv 123455678 -K 87654321 -p
hex string is too short, padding with zero bytes to length
hex string is too short, padding with zero bytes to length
salt=CC231A0100001A01
key=87654321000000000000000000000000
iv =12345567800000000000000000000000
参数的说明如下:
-
enc
:openssl指定的子命令,加解密用。 -
-e
:表示加密。对应的解密是-d
。 -
-aes-128-cbc
:指定加密算法和分组。 -
-in
:指定需要加密的内容,这里的plain.txt文件中包含的只是一个“hello world.”的字符串。 -
-out
:指定加密之后的内容。 -
-iv
:指定初始化向量,这个值在CBC分组时需要使用。 -
-K
:指定AES密钥,加解密的时候都需要使用到。初始化向量和密钥,我们都需要保护好,同时还需要传递给接收者解密使用。 -
-p
:用于打印密钥、初始化向量等信息。关于显示的内容需要进一步说明:首先是密钥和初始化向量的输入值没到要求长度,所以会补充0;salt在当前命令中并不重要(似乎对ase-kdf加密方式才有效,但是openssl中没有看到这种方式),可以不关注。
加密之后得到的内容:
因为加密之后得到的是二进制的数据,所以通过文本工具打开看到的是乱码,如果为了能够可读,则可以使用BASE64编码将加密后的内容进行处理,这只需要增加-a
参数:
PS C:\Openssl> .\openssl.exe enc -e -aes-128-cbc -in .\plain.txt -out encrypt.txt -iv 123455678 -K 87654321 -p -a
此时得到的内容:
解密的方式:
PS C:\Openssl> .\openssl.exe enc -d -aes-128-cbc -in .\encrypt.txt -out decrypt.txt -iv 123455678 -K 87654321 -p
hex string is too short, padding with zero bytes to length
hex string is too short, padding with zero bytes to length
salt=CC230E0100000E01
key=87654321000000000000000000000000
iv =12345567800000000000000000000000
解密之后的decrypt.txt文件中还是“hello world.”字符串。
存在的问题
用对称密码进行通信时,会出现密钥的配送问题(因为发送方和接收方使用相同的密码),即如何将密钥安全地发送给接收者。
非对称密码
非对称密码的密钥分为公钥(加密密钥)和私钥(解密密钥)。公钥是发送者加密时使用的;私钥是接收者解密时使用的。其特点:
- 发送者只需要公钥。
- 接收者只需要私钥。
- 私钥不可以被窃听者获取。
- 公钥被窃听者获取也没有问题。
公钥和私钥是一一对应的。
公钥和私钥一开始由接收者所有,私钥由接收者保存,而公钥则需要接收者发给发送者。
RSA
在RSA中,明文、密钥和密文都是数字。
RSA加密的流程可以通过一个公式表示:
密文 = 明 文 E m o d N 密文 = 明文^E mod N 密文=明文EmodN
E
和N
的组合就是公钥。
RSA的解密也可以由公式表示:
明文 = 密 文 D m o d N 明文 = 密文^D mod N 明文=密文DmodN
D
和N
的组合就是私钥。
私钥中的D
和公钥中的E
是强相关的。
这些E
、N
、D
并不是随便什么数都可以,它们需要经过严密的计算得出。求这三个数的过程成为生成密钥对。
示例
这里举一个RSA的示例,在加密文件之前,首先需要生成公钥和私钥,不同于AES算法,RSA算法中的密钥需要特别计算来生成,而不是随意指定(当然AES中的密钥也不能随便指定,而需要通过伪随机数生成器生成)。
下面是生成私钥的命令:
PS C:\Openssl> .\openssl.exe genrsa -out private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..........+++++
..........................+++++
e is 65537 (0x010001)
命令参数比较简单,不再赘述。该命令生成了1024位的私钥,内容如下:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDHMiG4gpEvS2JHNGxNwmi82utC6ngrQkWMU+E2WMGoaKWSfr2g
nmvheTVbAkir+Jd/1w7c9S7AjTw51p8QDv0k95M9nkdnbYH02nv49JQhA9RtAZ8h
gq3kjlH92Czezi9GM99nm9z4woTV8sAi6IcSZa9+DAVf8X8yF0iWE+XjwQIDAQAB
AoGAfg07SYdWWJdbmbOS1aIwpVHjjnTRlo5ZdHOgEMQZyHhwTkPlu76EhiotmWnY
kvq85CkzPp/o9fBqLC+keIUDq0Mgl8C398b3ys/paKg+8kQMQ1gumykC0krhy0Jv
zwwqnQYvebPEuRzOYc9PgpWSJciU4hMoFQ0YC6FfKY0FKAECQQDm40igoqf1bN5i
b3zs/bt2Ry73g1jBslfD1XHhTeDtiJib4M8BYuG6WDAA0T8X1iFUHOGF9aHom/FZ
sCPtxjWLAkEA3Nxu2/dctdA8vgwiov9RyAeqdNynBx5YKcUZ9oGmMtzxPj0EPNtk
pvFlwwLtdn03nqSFXOmRdaV4fCVqXrltYwJAewNbPaKLxBnl/iISOB4Tk7fnUR4c
2s5PLlp5WyXoEgY18M7822s4gtTbdoQFjoiapzrf+UReqBT1qOhMrDFvcwJAT88P
+EigpcqDyKEV+xSL9t5eSDBb4wSiEyX4Rc1/wy13t2fRGjSlYHYmsZtjN8fzy03k
KzjzqTGMIkBa+bPDxQJBAL07l930c6GObFxPbJy6KHuRUFWpYEjwds+V9kVGpU0F
GjusQCTM/5jkKAHlOfldrKKCwdYr5i7XHNswr0oImjs=
-----END RSA PRIVATE KEY-----
通过该私钥还可以提取出公钥:
PS C:\Openssl> .\openssl.exe rsa -in .\private.pem -pubout -out public.pem
writing RSA key
内容如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHMiG4gpEvS2JHNGxNwmi82utC
6ngrQkWMU+E2WMGoaKWSfr2gnmvheTVbAkir+Jd/1w7c9S7AjTw51p8QDv0k95M9
nkdnbYH02nv49JQhA9RtAZ8hgq3kjlH92Czezi9GM99nm9z4woTV8sAi6IcSZa9+
DAVf8X8yF0iWE+XjwQIDAQAB
-----END PUBLIC KEY-----
需要注意,这里显示的公钥和私钥并不是真正的密钥,只是E
和D
的BASE64编码之后的内容而已。对于这里的.pem文件还可以进一步地转换:
PS C:\Openssl> .\openssl.exe rsa -in .\private.pem -text -out private.txt
writing RSA key
得到的文件private.txt的内容:
RSA Private-Key: (1024 bit, 2 primes)
modulus:00:c7:32:21:b8:82:91:2f:4b:62:47:34:6c:4d:c2:68:bc:da:eb:42:ea:78:2b:42:45:8c:53:e1:36:58:c1:a8:68:a5:92:7e:bd:a0:9e:6b:e1:79:35:5b:02:48:ab:f8:97:7f:d7:0e:dc:f5:2e:c0:8d:3c:39:d6:9f:10:0e:fd:24:f7:93:3d:9e:47:67:6d:81:f4:da:7b:f8:f4:94:21:03:d4:6d:01:9f:21:82:ad:e4:8e:51:fd:d8:2c:de:ce:2f:46:33:df:67:9b:dc:f8:c2:84:d5:f2:c0:22:e8:87:12:65:af:7e:0c:05:5f:f1:7f:32:17:48:96:13:e5:e3:c1
publicExponent: 65537 (0x10001)
privateExponent:7e:0d:3b:49:87:56:58:97:5b:99:b3:92:d5:a2:30:a5:51:e3:8e:74:d1:96:8e:59:74:73:a0:10:c4:19:c8:78:70:4e:43:e5:bb:be:84:86:2a:2d:99:69:d8:92:fa:bc:e4:29:33:3e:9f:e8:f5:f0:6a:2c:2f:a4:78:85:03:ab:43:20:97:c0:b7:f7:c6:f7:ca:cf:e9:68:a8:3e:f2:44:0c:43:58:2e:9b:29:02:d2:4a:e1:cb:42:6f:cf:0c:2a:9d:06:2f:79:b3:c4:b9:1c:ce:61:cf:4f:82:95:92:25:c8:94:e2:13:28:15:0d:18:0b:a1:5f:29:8d:05:28:01
prime1:00:e6:e3:48:a0:a2:a7:f5:6c:de:62:6f:7c:ec:fd:bb:76:47:2e:f7:83:58:c1:b2:57:c3:d5:71:e1:4d:e0:ed:88:98:9b:e0:cf:01:62:e1:ba:58:30:00:d1:3f:17:d6:21:54:1c:e1:85:f5:a1:e8:9b:f1:59:b0:23:ed:c6:35:8b
prime2:00:dc:dc:6e:db:f7:5c:b5:d0:3c:be:0c:22:a2:ff:51:c8:07:aa:74:dc:a7:07:1e:58:29:c5:19:f6:81:a6:32:dc:f1:3e:3d:04:3c:db:64:a6:f1:65:c3:02:ed:76:7d:37:9e:a4:85:5c:e9:91:75:a5:78:7c:25:6a:5e:b9:6d:63
exponent1:7b:03:5b:3d:a2:8b:c4:19:e5:fe:22:12:38:1e:13:93:b7:e7:51:1e:1c:da:ce:4f:2e:5a:79:5b:25:e8:12:06:35:f0:ce:fc:db:6b:38:82:d4:db:76:84:05:8e:88:9a:a7:3a:df:f9:44:5e:a8:14:f5:a8:e8:4c:ac:31:6f:73
exponent2:4f:cf:0f:f8:48:a0:a5:ca:83:c8:a1:15:fb:14:8b:f6:de:5e:48:30:5b:e3:04:a2:13:25:f8:45:cd:7f:c3:2d:77:b7:67:d1:1a:34:a5:60:76:26:b1:9b:63:37:c7:f3:cb:4d:e4:2b:38:f3:a9:31:8c:22:40:5a:f9:b3:c3:c5
coefficient:00:bd:3b:97:dd:f4:73:a1:8e:6c:5c:4f:6c:9c:ba:28:7b:91:50:55:a9:60:48:f0:76:cf:95:f6:45:46:a5:4d:05:1a:3b:ac:40:24:cc:ff:98:e4:28:01:e5:39:f9:5d:ac:a2:82:c1:d6:2b:e6:2e:d7:1c:db:30:af:4a:08:9a:3b
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDHMiG4gpEvS2JHNGxNwmi82utC6ngrQkWMU+E2WMGoaKWSfr2g
nmvheTVbAkir+Jd/1w7c9S7AjTw51p8QDv0k95M9nkdnbYH02nv49JQhA9RtAZ8h
gq3kjlH92Czezi9GM99nm9z4woTV8sAi6IcSZa9+DAVf8X8yF0iWE+XjwQIDAQAB
AoGAfg07SYdWWJdbmbOS1aIwpVHjjnTRlo5ZdHOgEMQZyHhwTkPlu76EhiotmWnY
kvq85CkzPp/o9fBqLC+keIUDq0Mgl8C398b3ys/paKg+8kQMQ1gumykC0krhy0Jv
zwwqnQYvebPEuRzOYc9PgpWSJciU4hMoFQ0YC6FfKY0FKAECQQDm40igoqf1bN5i
b3zs/bt2Ry73g1jBslfD1XHhTeDtiJib4M8BYuG6WDAA0T8X1iFUHOGF9aHom/FZ
sCPtxjWLAkEA3Nxu2/dctdA8vgwiov9RyAeqdNynBx5YKcUZ9oGmMtzxPj0EPNtk
pvFlwwLtdn03nqSFXOmRdaV4fCVqXrltYwJAewNbPaKLxBnl/iISOB4Tk7fnUR4c
2s5PLlp5WyXoEgY18M7822s4gtTbdoQFjoiapzrf+UReqBT1qOhMrDFvcwJAT88P
+EigpcqDyKEV+xSL9t5eSDBb4wSiEyX4Rc1/wy13t2fRGjSlYHYmsZtjN8fzy03k
KzjzqTGMIkBa+bPDxQJBAL07l930c6GObFxPbJy6KHuRUFWpYEjwds+V9kVGpU0F
GjusQCTM/5jkKAHlOfldrKKCwdYr5i7XHNswr0oImjs=
-----END RSA PRIVATE KEY-----
从上面的内容可以得到公钥E
部分的二进制表示,它就是1024位的(第一个00不需要关注):
00:c7:32:21:b8:82:91:2f:4b:62:47:34:6c:4d:c2:68:bc:da:eb:42:ea:78:2b:42:45:8c:53:e1:36:58:c1:a8:68:a5:92:7e:bd:a0:9e:6b:e1:79:35:5b:02:48:ab:f8:97:7f:d7:0e:dc:f5:2e:c0:8d:3c:39:d6:9f:10:0e:fd:24:f7:93:3d:9e:47:67:6d:81:f4:da:7b:f8:f4:94:21:03:d4:6d:01:9f:21:82:ad:e4:8e:51:fd:d8:2c:de:ce:2f:46:33:df:67:9b:dc:f8:c2:84:d5:f2:c0:22:e8:87:12:65:af:7e:0c:05:5f:f1:7f:32:17:48:96:13:e5:e3:c1
以及私钥D
部分的二进制表示:
7e:0d:3b:49:87:56:58:97:5b:99:b3:92:d5:a2:30:a5:51:e3:8e:74:d1:96:8e:59:74:73:a0:10:c4:19:c8:78:70:4e:43:e5:bb:be:84:86:2a:2d:99:69:d8:92:fa:bc:e4:29:33:3e:9f:e8:f5:f0:6a:2c:2f:a4:78:85:03:ab:43:20:97:c0:b7:f7:c6:f7:ca:cf:e9:68:a8:3e:f2:44:0c:43:58:2e:9b:29:02:d2:4a:e1:cb:42:6f:cf:0c:2a:9d:06:2f:79:b3:c4:b9:1c:ce:61:cf:4f:82:95:92:25:c8:94:e2:13:28:15:0d:18:0b:a1:5f:29:8d:05:28:01
而N
的值是公钥和私钥共有的,它的值是0x10001。
除了文本形式的pem格式之外,密钥还可以使用der格式,它其实就是一种二进制的形式,转化的命令:
PS C:\Openssl> .\openssl.exe rsa -in .\private.pem -outform der -out private.der
有了RSA密钥之后就可以进行加密了,下面是通过公钥加密的示例:
PS C:\Openssl> .\openssl.exe rsautl -encrypt -in .\plain.txt -inkey .\public.pem -pubin -out encrypt.txt
得到的内容:
还是一串乱码,并且rsautl工具似乎不支持BASE64输出,不过并不重要。
然后就是解密的命令:
PS C:\Openssl> .\openssl.exe rsautl -decrypt -in .\encrypt.txt -inkey .\private.pem -out decrypt.txt
解密之后得到原本的数据。
存在的问题
非对称密码存在几个问题:
- 发送者接收到的公钥是否真的是接收者发过来的,这涉及到公钥认证问题。
- 非对称密码的处理速度很慢,只有对称密码的几百分之一。
混合密码系统
混合密码系统用对称密码来加密明文,用公钥密码来加密对称密码中所使用的密钥:
- 用对称密码加密消息。
- 通过伪随机数生成器生成对称密码加密中使用的会话密钥。
- 用非对称密码加密会话密钥。
- 从混合密码系统外部(通常就是CA)赋予非对称密码加密时使用的密钥。
图示如下:
进一步加密说明:
进一步解密说明:
单向散列函数
单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值。
单向散列函数的特点:
- 任意长度的消息都可以计算出固定长度的散列值。
- 快速计算。
- 消息不同散列值一定不同。
- 单向性,即不能通过散列值推算出消息。
单向散列函数的具体算法:
- MD4、MD5。已经不安全。
- SHA-1、SHA-256、SHA-384、SHA-512。SHA-1已经不安全,其它(统称为SHA-2)还是安全的。
- SHA-3。SHA-3是一个标准,使用算法有
Keccak
。
示例
这里举一个SHA256的示例:
PS C:\Openssl> .\openssl.exe dgst -sha256 -hex -c -out sha256.txt .\plain.txt
参数说明如下:
dgst
:digest,摘要的意思。-sha256
:使用SHA256单向散列函数进行计算。-hex
:打印十六进制。-c
:使用冒号隔开十六进制数据。-out
:指定输出散列码的文件。- 最后是消息文件。
输出的散列码在sha256.txt文件,内容如下:
SHA256(.\plain.txt)= 7d:db:22:73:15:f4:23:25:0f:c6:7f:3b:e6:9c:54:46:28:df:fe:41:75:2a:f9:1c:50:ae:0a:9c:49:fa:eb:87
消息认证码
用于确认消息是否被正确传送。
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。
要计算MAC值必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。
消息认证码是一种与密钥相关的单向散列函数。两者的比较(左侧为单向散列函数,右侧为消息认证码):
HMAC
使用SHA-2之类的单向散列函数可以实现消息认证码,其中一种实现方法称为HMAC。下面是一个示例:
示例
这里举一个SHA256加前面生成的公钥来生成签名的示例:
PS C:\Openssl> .\openssl.exe dgst -hmac .\public.pem -sha256 -out hmac.txt .\plain.txt
其它参数跟单向散列函数中的示例一致,多出来的参数说明如下:
-hmac
:指定密钥。
输出的散列码在hmac.txt文件,内容如下:
HMAC-SHA256(.\plain.txt)= d18dce21845b7717820694db4b94b97788a96f3cb482a13d3e8d5bbbc3c5faa6
存在的问题
消息认证码无法防止否认。
数字签名
数字签名可以用来防止否认。
数字签名是非对称密码“反过来用”而实现的。
非对称密码使用公钥进行加密:
数字签名使用私钥进行加密(或者叫签名):
数字签名有两种方式:
- 直接对消息签名。
- 对消息的散列值签名,实际应用中使用这种,下面是一个示例:
数字签名不能保证机密性,不过它本来也不是为了保证机密性的,而是为了防止否认。
示例
这里举一个SHA256加前面生成的私钥来生成签名的示例:
PS C:\Openssl> .\openssl.exe dgst -sign .\private.pem -sha256 -out sig.bin .\plain.txt
其它参数跟单向散列函数中的示例一致,多出来的参数说明如下:
-sign
:指定私钥。
输出的散列码在sig.bin文件,内容如下:
注意生成签名的时候也可以使用-hex -c
这样的显示参数,但是这样得到的文件不能进行后续的验签,所以这里还是使用二进制。
之后可以通过公钥进行验签:
PS C:\Openssl> .\openssl.exe dgst -verify .\public.pem -sha256 -signature .\sig.bin .\plain.txt
Verified OK
打印OK,表示验签成功。
存在的问题
要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者。非对称密码也存在这个问题。
为了能够确认自己得到的公钥是否合法,需要使用证书。所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥。但是,为了对证书上施加的数字签名进行验证,我们又需要另一个公钥,这样就形成了一个可信的数字签名链条。该链条的根是什么呢?此时我们让公钥以及数字签名技术称为一个社会性的基础设施,即公钥基础设施,简称PKI,我们认为它是可信任的。
证书
公钥证书包含姓名、组织、邮箱等个人信息,以及属于此人的公钥,并由认证机构(CA)施加数字签名。
认证机构在发送密文中的示例:
公钥基础设施是为了能够更有效地运用公钥而制定的一系列规范和规格的总称,包括证书的格式,证书应该由谁来颁发,如何颁发,私钥泄露时应该如何作废证书,计算机之间的数据交换应采用怎样的格式,等等。
PKCS
系列规范是PKI的一种,X.509
也是PKI的一种。
PKI的组成要素主要有以下三个:
- 用户:使用PKI的人。
- 认证机构:颁发证书的人。
- 仓库:保存证书的数据库。
它们的关系如下:
我们需要关注的只是用户,注册公钥的用户需要的操作:
- 生成密钥对(也可以由认证机构生成)。
- 在认证机构注册公钥。
- 向认证机构申请证书。
- 根据需要申请作废已注册的公钥。
- 解密接收到的密文(因为我们自己持有私钥)。
- 对消息进行数字签名。
术语
术语 | 说明 |
---|---|
AES | Advanced Encryption Standard,取代其前任标准(DES)而成为新标准的一种对称密码算法。 |
CA | Certification Authority,认证机构,对证书进行管理的人。 |
DES | Data Encryption Standard,1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码。 |
KEK | Key Encrypting Key,密钥加密密钥,用来加密密钥的密钥。 |
MAC | Messge Authentication Code,消息认证码,一种确认完整性并进行认证的技术。 |
MD | Message Digest,消息摘要。 |
PBE | Password Based Encryption,基于口令的加密。原理是将口令和盐(通过伪随机数生成产生的随机值)混合后计算器散列值,然后将这个散列值用作加密的密钥。可以防止对口令的字典攻击。 |
PKC | Public Key Certificate,公钥证书。 |
PKCS | Public Key Cryptography Standards,公钥密码标准,RSA公司制定的PKI规范。 |
PKI | Public Key Infrastructure,公钥基础设施,为了能够更有效地运用公钥而制定的一系列规范和规格的总称。 |
RSA | 三个人名的首字母,没有特别的意义。它是非对称密码的事实标准。 |
X.509 | 也是PKI规范的一种。 |
对称密码 | 加密和解密时使用同一密钥的方式。 |
非对称密码(公钥密码) | 加密和解密时使用不同密钥的方法。 |
分组密码 | 每次只能处理特定长度的一块数据的一类密码算法,AES和DES都属于分组密码,大多数对称密码都属于分组密码。 |
混合密码系统 | 将对称密码和非对称密码结合起来的密码方式。 |
流密码 | 对数据流进行连续处理的一类密码算法。 |
密文 | 加密之后的消息。 |
密钥 | 密码算法中使用的数据,通常是若干串非常大的数字。 |
明文 | 加密之前的消息。 |
算法 | 用于解决复杂问题的步骤。 |
相关文章:

密码学基础
密码学总览 信息安全面临的危险与应对这些威胁的密码技术: 关于上图中的威胁,这里在简单的说明: 窃听:指的是需要保密的消息被第三方获取。篡改:指的是消息的内容被第三方修改,达到欺骗的效果。伪装&…...

[Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
一.部署nodejs项目,映射端口,挂载数据卷 可以到https://hub.docker.com/去搜索node镜像,然后下载,也可以直接通过docker pull node下载镜像,然后用这个node镜像启动容器node,这样系统就集成了node服务了,在这里挂载www/node目录到容器中,并指定端口映射,运行nodejs程序,安装npm…...

拥抱AI-ChatGPT:人类新纪元
最近大模型通用智能应用持续发酵,各大科技公司都陆续推出了基于通用大模型的智能应用产品,典型的如OpenAI的ChatGPT、微软的BingChat、百度的文心一言、360的智脑、阿里的通义千问等。当然最火的要属于ChatGPT了,从去年年底推出到现在已经有很…...

基于深度学习的人脸表情识别 计算机竞赛
文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较…...

GitHub经常打不开或者访问解决办法
访问慢或无法访问的原因:DNS解析是最为基础的一个环节。由于Github的服务器在全球各地,域名解析所需的时间也会不同,这就导致了在特定地区可能会出现Github无法正常访问的情况。 解决:查询到github对应的IP,然后在host…...

密码学 - SHA-2
实验八 SHA-2 1.实验目的 熟悉SHA – 2算法的运行过程,能够使用C语言编写实现SHA-2算法程序,增加对摘要函数的理解。 2、实验任务 (1)理解SHA-2轮函数的定义和常量的定义。 (2)利用VC语言实现SHA-2算…...
Vins-Fusion、Vins-Mono(之前那个编译通过但是没有这个好用)
ROS的catkin_make不要修改,暂时没有理由,理由就是两次一个改了一个没改,没改的成功了以成功为准。 另外docker也没用成功,原本的逻辑来说,docker肯定不能出问题的,但是由于roscore通信的原因可能没有将结果显示&#x…...

每日自动化提交git
目前这个功能,有个前提: 这个git代码仓库,是一个人负责,所以不存在冲突问题 我这个仓库地址下载后的本地路径是:D:\Projects\Tasks 然后我在另外一个地方新建了一个bat文件: bat文件所在目录为:…...

【Linux进程】再谈软件—操作系统(Operator System)
目录 操作系统(Operator System) 概念 设计OS的目的 如何理解 "管理"——先描述再组织 系统调用和库函数概念 总结 操作系统(Operator System) 概念 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。 笼统的理解,操作系统…...

创建超过1G内存大小的程序
正常情况一个进程最大占用内存为1G一下,如果程序有需求要使用超过1G大小的程序,可进行如下操作 VS修改设置:属性--->链接器--->系统--->启用大地址 【选择是】 测试申请堆内存代码 #include <stdlib.h> #include <stdio…...

如何本地部署Jellyfin影音服务器并实现在公网访问
文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…...
docker fixuid
docker fixuid 一、fixuid是什么二、使用场景三、问题dockerfiledocker run 一、fixuid是什么 fixuid是用go语言编写的,当容器起来后可以修改容器中非root用户的UID/GID和文件权限。 项目地址:https://github.com/boxboat/fixuid 二、使用场景 当容器…...

MySQL笔记--SQL语句
目录 1--SQL的通用语法 2--SQL语句的分类 3--DDL语句 3-1--数据库操作 3-2--表操作 3-3--数据类型 3-4--修改和删除 4--DML语句 4-1--插入数据 4-2--修改数据 4-3--删除数据 5--DQL语句 5-1--基本查询 5-2--条件查询 5-3--聚合函数 5-4--分组查询 5-5--排序查…...

线扫相机DALSA-相机平场矫正详细步骤
在相机视野下铺放白色亚克力板或纯白纸,采集图像。打开曲线图。 选择 Line Profile 模式。调节好相应所需的曝光时间、光源、增益和镜头光圈,让白平衡纸显示出来的灰度值大概在 150-200 左右。 在Calibration Algorithm 中将显示的数值设置好。 先暗场…...

求购供应发布农业副业产品市场行情小程序开发
农业副业产品求购供应发布市场行情小程序H5开源版开发 后台同步:一键获取全国近200家农产品批发市场的商品价格,包括蔬菜、水果、水产、粮油和农副产品等。 实时更新和同步市场价格动态,保障信息的准确性和时效性。 前端VIP权益功能&…...

框架安全-CVE 复现SpringStrutsLaravelThinkPHP漏洞复现
目录 服务攻防-框架安全&CVE 复现&Spring&Struts&Laravel&ThinkPHP概述PHP-开发框架安全-Thinkphp&Laravel漏洞复现Thinkphp-3.X RCEThinkphp-5.X RCELaravel框架安全问题- CVE-2021-3129 RCE JAVAWEB-开发框架安全-Spring&Struts2Struts2框架安全…...

【腾讯云 HAI域探秘】宝妈也能快速入门AI绘画
活动背景 本次活动是由腾讯云和CSDN联合推出的开发者技术实践活动。我通过技术交流直播、动手实验、征文等形式,深入沉浸式体验腾讯云高性能应用服务 HAI。从活动中汲取到技术上的精华。在本次活动中,只要完成各个环节任务,不仅可以参与 AIGC…...
归并排序,自顶向下
归并排序主要两步,一步是划分区间,另一步是合并两个区间 这个算法的稳定性更好,对比快排这种,如果整体是倒序的话,快排的复杂度会达到o(n^2),归并会更稳定。 划分区间主要是递归去实现,下面给…...

【案例】3D地球(vue+three.js)
需要下载插件 <template><div class"demo"><div id"container" ref"content"></div></div> </template> <script> import * as THREE from three; // import mapJSON from ../map.json; import { Or…...
C语言中float byte char uint_8 转换方法
1.float转Byte[] #include <stdio.h>int main() {float floatValue 3.141592; // 浮点数值// 存储到字节数组unsigned char *byteArr (unsigned char *)&floatValue;// 打印字节数组for (int i 0; i < sizeof(float); i) {printf("Byte %d: 0x%02X\n&q…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...