密码学基础

密码学总览

信息安全面临的危险与应对这些威胁的密码技术:

在这里插入图片描述

关于上图中的威胁,这里在简单的说明:

  1. 窃听:指的是需要保密的消息被第三方获取。
  2. 篡改:指的是消息的内容被第三方修改,达到欺骗的效果。
  3. 伪装:指的是第三方伪装成接收者或者发送者,给对方发送消息。
  4. 否认:指的是发送方否认消息是本人发送的。

密码学家使用如下的工具来防止上述威胁:

  • 对称密码
  • 非对称密码
  • 单向散列函数
  • 消息认证码
  • 数字签名
  • 伪随机数生成器

下面将分别介绍上述的工具。

准备

为了能够更好的学习密码相关的知识,这里会用到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
EN的组合就是公钥。

RSA的解密也可以由公式表示:
明文 = 密 文 D m o d N 明文 = 密文^D mod N 明文=DmodN
DN的组合就是私钥。

私钥中的D和公钥中的E是强相关的。

这些END并不是随便什么数都可以,它们需要经过严密的计算得出。求这三个数的过程成为生成密钥对。

示例

这里举一个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-----

需要注意,这里显示的公钥和私钥并不是真正的密钥,只是ED的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

解密之后得到原本的数据。

存在的问题

非对称密码存在几个问题:

  1. 发送者接收到的公钥是否真的是接收者发过来的,这涉及到公钥认证问题。
  2. 非对称密码的处理速度很慢,只有对称密码的几百分之一。

混合密码系统

混合密码系统用对称密码来加密明文,用公钥密码来加密对称密码中所使用的密钥:

  • 用对称密码加密消息。
  • 通过伪随机数生成器生成对称密码加密中使用的会话密钥。
  • 用非对称密码加密会话密钥。
  • 从混合密码系统外部(通常就是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的人。
  • 认证机构:颁发证书的人。
  • 仓库:保存证书的数据库。

它们的关系如下:

在这里插入图片描述

我们需要关注的只是用户,注册公钥的用户需要的操作:

  • 生成密钥对(也可以由认证机构生成)。
  • 在认证机构注册公钥。
  • 向认证机构申请证书。
  • 根据需要申请作废已注册的公钥。
  • 解密接收到的密文(因为我们自己持有私钥)。
  • 对消息进行数字签名。

术语

术语说明
AESAdvanced Encryption Standard,取代其前任标准(DES)而成为新标准的一种对称密码算法。
CACertification Authority,认证机构,对证书进行管理的人。
DESData Encryption Standard,1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码。
KEKKey Encrypting Key,密钥加密密钥,用来加密密钥的密钥。
MACMessge Authentication Code,消息认证码,一种确认完整性并进行认证的技术。
MDMessage Digest,消息摘要。
PBEPassword Based Encryption,基于口令的加密。原理是将口令和盐(通过伪随机数生成产生的随机值)混合后计算器散列值,然后将这个散列值用作加密的密钥。可以防止对口令的字典攻击。
PKCPublic Key Certificate,公钥证书。
PKCSPublic Key Cryptography Standards,公钥密码标准,RSA公司制定的PKI规范。
PKIPublic Key Infrastructure,公钥基础设施,为了能够更有效地运用公钥而制定的一系列规范和规格的总称。
RSA三个人名的首字母,没有特别的意义。它是非对称密码的事实标准。
X.509也是PKI规范的一种。
对称密码加密和解密时使用同一密钥的方式。
非对称密码(公钥密码)加密和解密时使用不同密钥的方法。
分组密码每次只能处理特定长度的一块数据的一类密码算法,AES和DES都属于分组密码,大多数对称密码都属于分组密码。
混合密码系统将对称密码和非对称密码结合起来的密码方式。
流密码对数据流进行连续处理的一类密码算法。
密文加密之后的消息。
密钥密码算法中使用的数据,通常是若干串非常大的数字。
明文加密之前的消息。
算法用于解决复杂问题的步骤。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

21.9 Python 使用Selenium库

Selenium是一个自动化测试框架,主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作,如打开网页、点击链接、填写表单等,并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的,但也…

Haproxy负载均衡集群

一、haproxy概念: Haproxy:他也是常用的负载均衡转发 nginx支持四层转发,七层转发 haproxy也可以四层和七层转发 LVS的DR和NAT是基于四层转发 TUN是四层七层 基于四层的转发: LVSnginxhaproxy 基于七层的转发: …

【python与数据结构】(leetcode算法预备知识)

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ python与数据结构 Python 中常见的数据类型数据结构1.数组(Array)2.链表(Linked List)3.哈希表(Hash Table)4.队列(Queue&#x…

洛谷 B2029 大象喝水 C++代码

题目描述 AC Code #include<bits/stdc.h> using namespace std; int main() {int h,r;cin>>h>>r;double val;val3.14*r*r*h;int ans20000/val;ans;cout<<ans<<endl;return 0; }

动手学深度学习(李沐)的pytorch版本(包含代码和PDF版本)

目录 网址&#xff08;特别适合自学&#xff09; 说明: 代码与PDF版 网址&#xff08;特别适合自学&#xff09; 传送门 界面一览&#xff1a; 说明: github上一个项目将《动手学深度学习》从mxnet改为了pytorch实现。感谢大佬们的工作。   特别说明该电子版网页是通过do…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说&#xff0c;在内存管理领域&#xff0c;JVM既拥有最高的权利&#xff0c;但是同时他们又是从事最基础工作的劳动人员&#xff0c;因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说&#xff0c;再虚拟机自动内存管理的帮助下&#xff0…

2000-2021年三批“智慧城市”试点名单匹配数据

2000-2021年三批“智慧城市”试点名单匹配数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;行政区划代码、地区、所属省份、年份、智慧城市试点、最早试点年份 3、来源&#xff1a;住建部公布的三批“国家智慧城市名单” 4、说明&#xff1a;内含原始文件和匹配结…

Liunx两台服务器实现相互SSH免密登录

一、首先准备两台Linux虚拟机当作此次实验的两台服务器 服务器1&#xff1a;server IPV4&#xff1a;192.168.110.136 服务器2&#xff1a;client IPV4&#xff1a; 192.168.110.134 二、准备阶段 [rootserver ~]# systemctl disable firewalld #关…

Web3 治理实践探讨:如何寻找多元化发展路径?

Web3 领域变革正崭露头角&#xff0c;而社区治理开始成为行业热议话题。Web3 项目如何探寻多元化建设的解困路径&#xff0c;究竟是治理模型的精进成为首要问题&#xff0c;还是吸纳更多资金与组织教育培训&#xff0c;让开发者成为项目建设的中坚力量&#xff1f;本期 TinTinW…

知识分享|分段函数线性化及matlab测试

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all;gn10;tn1;x_pfsdpvar(1, tn,…

【Python爬虫三天从0到1】Day1:爬虫核心

目录 1.HTTP协议与WEB开发 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;请求协议和响应协议 2. requests&反爬破解 &#xff08;1&#xff09;UA反爬 &#xff08;2&#xff09;referer反爬 &#xff08;3&#xff09;cookie反爬 3.请求参数 &#x…

程序设计语言

编译解释 传参还是传值 编译原理

Centos使用tomcat部署jenkins

jenkins的最新版本已经不在支持jdk8&#xff0c;支持的jdk环境如下&#xff1a; 安装jdk环境 yum -y install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64安装tomcat tomcat官网 cd /optwget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.82/bin/apache-tomcat…

大数据-Storm流式框架(七)---Storm事务

storm 事务 需求 storm 对于保证消息处理&#xff0c;提供了最少一次的处理保证。最常见的问题是如果元组可以被 重发&#xff0c;可以用于计数吗&#xff1f;不会重复计数吗&#xff1f; strom0.7.0 引入了事务性拓扑的概念&#xff0c;可以保证消息仅被严格的处理一次。因此可…

leetCode 2578. 最小和分割 + 排序 + 贪心 + 奇偶分组(构造最优解)

2578. 最小和分割 - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 num &#xff0c;请你将它分割成两个非负整数 num1 和 num2 &#xff0c;满足&#xff1a; num1 和 num2 直接连起来&#xff0c;得到 num 各数位的一个排列。 换句话说&#xff0c;num1 和 num2 中所…

黑客在Pwn2Own Toronto上以58个零日漏洞赚取超过100万美元

Pwn2Own Toronto 2023黑客大赛已经圆满结束&#xff0c;安全研究人员通过攻击消费类产品的58个零日漏洞&#xff08;以及多个漏洞碰撞&#xff09;赚取了1,038,500美元。此次比赛由趋势科技的零日倡议&#xff08;Zero Day Initiative&#xff0c;简称ZDI&#xff09;组织&…

目标检测及锚框、IoU

文章目录 1. 目标检测2. 锚框3. IoU - 交并比4. 赋予锚框标号5. 使用非极大值抑制&#xff08;NMS&#xff09;输出 1. 目标检测 物体检测&#xff08;目标检测&#xff09;是计算机视觉和数字图像处理的热门方向&#xff0c;意在判断一幅图像上是否存在感兴趣物体&#xff0c…

在pycharm中,远程操作服务器上的jupyter notebook

一、使用场景 现在我们有两台电脑&#xff0c;一台是拥有高算力的服务器&#xff0c;另一台是普通的轻薄笔记本电脑。如何在服务器上运行jupyter notebook&#xff0c;同时映射到笔记本电脑上的pycharm客户端中进行操作呢&#xff1f; 二、软件 pycharm专业版&#xff0c;jupy…

【Python · PyTorch】线性代数 微积分

本文采用Python及PyTorch版本如下&#xff1a; Python&#xff1a;3.9.0 PyTorch&#xff1a;2.0.1cpu 本文为博主自用知识点提纲&#xff0c;无过于具体介绍&#xff0c;详细内容请参考其他文章。 线性代数 & 微积分 1. 线性代数1.1 基础1.1.1 标量1.1.2 向量长度&…

【LeetCode】7. 整数反转

题目链接 文章目录 Python3官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯写法2写法3 C官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1 ) ⟯ \lgroup O(|x|)、O(1)\rgroup ⟮O(∣x∣)、O(1)⟯ Python3 官方解法 ⟮ O ( ∣ x ∣ ) 、 O ( 1…