IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 密码编码学与网络安全———原理与实践(第八版)第三章笔记 -> 正文阅读

[网络协议]密码编码学与网络安全———原理与实践(第八版)第三章笔记

第3章 传统加密技术

学习目标

  • 简要介绍对称密码的主要概念。
  • 解释密码分析和穷举攻击的差异。
  • 理解单表代替密码的操作。
  • 理解多表代替密码的操作。
  • 简要介绍Hill密码。

目录

第3章 传统加密技术

3.1 对称密码模型

3.1.1 密码编码学

3.1.2 密码分析学和穷举攻击

3.2 代替技术

3.2.1 Casesar密码

3.2.2 单表代替密码

3.2.3 Playfair 密码

3.2.4 Hill密码

3.2.5 多表代替加密

3.2.6 一次一密

3.3 置换技术


对称加密,也称传统加密单钥加密,是20世纪70年代公钥密码产生之前唯一的加密类型。迄今位置,它仍是两种加密类型中使用得最为广泛的。第一部分讨论了许多对称密码。本章首先介绍对称加密过程的一般模型,了解传统加密算法的使用环境;然后讨论计算机出现之前的许多算法;最后简要介绍隐写术。第4章和第6章探讨如今使用得最广泛得两种加密算法:DES和AES。

下面首先定义一些术语。原始的消息称为明文,加密后的消息称为密文。从明文到密文的变换过程称为加密,从密文到明文的过程称为解密。研究各种加密方案的领域称为密码编码学。这样的加密方案称为密码体制或密码。在不知道任何加密细节的条件下,解密消息的技术属于密码分析学范畴。密码分析学即外行所说的“破译”。密码编码学和密码分析学统称密码学

3.1 对称密码模型

对称加密方案有5个基本成分:

  • 明文 可理解的原始消息或数据,是算法的输入。
  • 加密算法 加密算法对明文进行各种代替和变换。
  • 密钥 密钥也是加密算法的输入,但独立于明文和算法。算法根据所用的特定密钥产生不同的输出。算法所用的确切代替和变换也依赖于密钥
  • 密文 算法的输出,看起来是完全随机且杂乱的消息,依赖于明文和密钥。对于给定的消息,不同的密钥产生不同的密文,密文看起来是随机的数据流,且其意义是不可理解的。
  • 解密算法 本质上是加密算法的逆运算。输入密文和密钥,输出原始明文。

传统密码的安全使用要满足如下两个要求。

  1. 加密算法必须足够强。至少,我们希望这个算法在敌手知道它并得到一个或多个密文时也不能破译密文或算出密钥。这个要求通常用一种更强的形式表述如下:即使敌手拥有一定数量的密文和产生密文的明文,他(或她)也不能破译密文或发现密钥。
  2. 发送方和接受方必须在某种安全的形式下获得密钥并且必须保证密钥安全。如果有人发现该密钥,而且知道相应的算法,那么就能解读使用该密钥加密的所有通信。

我们假设基于已知密文和已知加密/解密算法而破译消息是不实际的。换句话说,我们并不需要算法保密,而只需密钥保密。对称密码的这些特点使得其应用非常广泛。算法不需要保密这一事实使得制造商可以开发出低成本的芯片来实现数据加密算法。这些芯片能够被广泛地使用,许多产品中都有这种芯片。采用对称密码,首要的安全问题是密钥地保密性。

例如,发送方生成明文消息X=[X_{1},X_{2},\cdots,X_{M}],X的M个元素是某个字母表中的字母。一般来说,字母表由26个大写字母组成。今天,最常用的是二进制字母表{0,1}。加密时,首先生成一个形如K=[K_{1},K_{2},\cdots,K_{J}]的密钥。如果密钥由信息的发送方生成,那么它要通过某种安全信道发送到接受方;另一种方法是第三方生成密钥,然后安全地分发给发送方和接受方。

加密算法根据输入信息X和密钥K生成密文Y=[Y_{1},Y_{2},\cdots,Y_{N}],即

Y=E(K,X)

该式表明密文Y是用加密算法E生成的,后者是明文X的函数,而具体的函数由密钥K的值决定。拥有密钥K的预定接收方,可以由变换X=D(K,Y)得到明文。

假设某敌手窃得Y但不知道K或X,并企图得到K或X,或K和X。假设他知道加密算法E和解密算法D,若他只对这个特定得信息感兴趣,则他会将注意力集中于计算明文得估计值{\hat{X}}来恢复X;不过,敌手往往对进一步得信息同样感兴趣,此时他企图通过计算密钥得估计值\hat{K}来恢复K。

3.1.1 密码编码学

密码编码学系统具有以下三个独立得特征。

  1. 将明文转换为密文的运算类型 所有的加密算法都基于两个原理:代替和置换,代替是指将明文中的每个元素(如位、字母、位组或字母组等)映射成另一个元素;置换是指重新排列明文中的元素。上述运算的基本要求是不允许丢失信息(即所有的运算都是可逆的)。大多数密码体制,也称乘积密码系统,都是用了多层代替和置换。
  2. 所用的密钥数 若发送方和接受方使用相同的密钥,则称这种密码为对称密码、单密钥密码、秘密钥密码或传统密码。若发收双方使用不用的密钥,则称这种密码为非对称密码、双密钥密码或公钥密码。
  3. 处理明文的方法 分组密码每次处理输入的一组元素,相应地输出一组元素。流密码则是连续地处理出入元素,每次输出一个元素。

3.1.2 密码分析学和穷举攻击

攻击密码系统的典型目标是恢复使用的密钥,而不是只恢复单个密文对应的明文。攻击传统的密码体制有两种通用的方法。

  • 密码分析学 密码分析学攻击依赖于算法的性质、明文的一般特征或某些明密文对。这种形式的攻击企图利用算法的特征来推导特定的明文或使用的密钥,
  • 穷举攻击 攻击者对一条密文尝试所有可能的密钥,直到把它转换为可读的、有意义的明文。平均而言,获得成功至少需要尝试所有可能密钥的一半。

如果上述任意一种攻击能够成功地推导出密钥,那么影响是灾难性地:危及所有未来和过去使用该密钥加密消息的安全。

密码分析学 基于密码分析者直到的信息的多少,表3.1中概述了密码攻击的几种类型。表中的唯密文攻击难度最大。在有些情况下,攻击者甚至不知道加密算法,但我们通常假设敌手知道。子啊这种情况下,一种可能的攻击是试遍所有可能密钥的穷举攻击。如果密钥空间非常大,那么这种方法就不太实际。因此,攻击者必须依赖于对密文本身的分析,而这一般要用到各种统计方法。使用哪个这种方法时,攻击者必须对隐含的明文类型有所了解,比如说明文时英文文本、法文文本、还是可执行文件、Java源列表文件、会计文件等。

表3.1 密码攻击的几种类型
攻击类型密码分析者已知的信息? ? ??
唯密文攻击
  • 加密算法
  • 密文
已知明文攻击
  • 加密算法
  • 密文
  • 用(与待解密文的)同一密钥加密的一个或多个明文对
选择明文攻击
  • 加密算法
  • 密文
  • 分析者选择的明文,及对应的密文(与待解密文使用同一密钥加密)
选择密文攻击
  • 加密算法
  • 密文
  • 分析者选择的一些密文,及对应的密文(与待解密文使用同一密钥加密)
选择文本攻击
  • 加密算法
  • 密文
  • 分析者选择的明文,及对应的密文(与待解密文使用同一密钥加密)
  • 分析者选择的一些密文,及对应的密文(与待解密文使用同一密钥加密)

唯密文攻击最容易防范,因为攻击者拥有的信息量最少。然而,在很多情况下,分析者可以得到更多的信息。分析者可以捕获一段或更多的明文信息及相应的密文,也可能知道某段明文信息的格式等。例如,按照Postscript格式加密的文件总以相同的格式开头,电子金融消息往往具有标准化的文件头部或标志。类似的列子还有很多。这些都是已知明文攻击的例子。拥有这些知识的分析者就可以从转换明文的方法入手来推导密钥。

与已知明文攻击紧密相关的是可能词攻击。攻击者处理的是一般的散文信息时,他可能对信息的内容一无所知;攻击者处理的是一些特定的信息时,他可能知道其中的部分内容。例如,对于一个完整的会计文件,攻击者可能知道放在文件最前面的是某些关键词。又如,某公司开发的程序源代码可能含有该公司的版权信息,并且放在某个标准位置。

如果分析者能够通过某种方式获得信源系统,让发送方在发送的信息中插入一段由他选择的信息,那么选择明文攻击就有可能实现。一般来说,如果分析者有办法选择明文加密,那么他会特意选取那些最有可能恢复密钥的数据。

表3.1中还列举了另外两种攻击方法:选择密文攻击和选择文本攻击。它们在密码分析技术中很少用到,但仍然是两种可能的攻击方法,

只有相对较弱的算法才无法抵御唯密文攻击。一般来说,加密算法至少要能经受住已知明文攻击。

此外,还有两个概念值得注意。一种密码体制无论有多少可用的密文,如果都不足以唯一地确定密文对应地明文,那么称改密码体制是无条件安全的。也就是说,无论花费多长时间,攻击者都无法将密文解密,这只是因为他(或她)所需的信息不在密文中。除一次一密(后面会讲到)外,所有地加密算法都不是无条件安全的。因此,加密算法的使用者应挑选尽量满足以下标准的算法。

  • 破译密码的代价超过密文信息的价值。
  • 破译密码的时间超过密文信息的有效生命期。

如果密码体制满足上述两条标准中的任意一条,那么它是计算上安全的。然而,估计攻击者成功破译密文所需的工作量是非常困难的。

对称密码体制的所有分析方法都利用了这样一个事实,即明文的结构和模式在加密后得以保留,且在密文中能够找到蛛丝马迹。随着我们对各种对称密码体制讨论的深入,这一点将会变得非常明显。在第二部分,我们将看到对公钥密码体制的分析依据的是一个完全不同的假设,即密钥对的数学性质使得从一个密钥推出另一个密钥是可能的。

穷举攻击 试遍所有密钥直到有一个合法的密钥能够把密文还原称明文,这就是穷举攻击。我们可以从这种方法入手,考虑其所需的时间代价。平均来说,要获得成功,必须尝试所有可能密钥的一半。若存在X中不同密钥,则攻击者平均尝试X/2次才能找到实际的密钥。值得注意的是,穷举攻击不是简单地尝试所有可能的密钥,除非明文已知,否则分析者需要能够将明文识别为明文。若信息是英文明文,则结果很容易得到,即使英文识别是自动化的;若文本信息加密前已被压缩,则识别更困难;若信息是一些更为通用的数据(如数值文件)并且已被压缩,则自动化会变得更加困难。因此,采用穷举攻击时,需要一些关于预期明文的信息及自动地从混淆中区分明文的方法。

强加密??对用户、安全管理人员和企业经理而言,存在保护数据的强加密需求。强加密是常用但不精确的术语,是指未授权人员或系统难以访问已加密的明文的加密方案。相关文献列出了强加密算法的如下性质:适当地选择加密算法,使用足够长的密钥,适当地选择协议,良好的工程实现,引入的隐藏缺陷较少。前两个因素与密码分析学相关,第三个因素与第六部分的讨论相关,最后两个因素超出了本书的范围。

3.2 代替技术

本节和下一节举例探讨古典加密方法。研究这些方法可让我们清楚今天所用的对称密码的一些基本方法,以及随之而来的密码攻击的类型等。

首先简要讨论所有加密技术都要用到的两个基本模块——代替和置换,然后详细讨论这些内容。最后讨论综合应用两种技巧的密码系统。

代替技术是将明文字母替换成其他字母、数字或符号的方法。若将明文视为二进制序列,则代替就是用密文位串代替明文位串。

3.2.1 Casesar密码

之前文章写过。。。。

3.2.2 单表代替密码

看第六版

3.2.3 Playfair 密码

同上

3.2.4 Hill密码

另一个有趣的多表代替密码是Hill密码,它由数学家Lester Hill 于1929年发明。

线性代数中的一些概念? ? ? ?在描述Hill密码前,让我们简短地复习线性代数中的一些术语。现在我们关心模26的矩阵算术。

我们定义方阵M的逆矩阵为M^{-1},它满足M(M^{-1})=(M^{-1})M=I,其中I为单位矩阵。I矩阵是除主对角线上的元素为1外、其余元素全为0的矩阵。一个矩阵的逆矩阵并不总是存在的,但存在时它满足前述方程。例如,

A=\begin{pmatrix} 5&8 \\ 17&3 \end{pmatrix},?A^{-1} \mod 26 =\begin{pmatrix} 9 & 2\\ 1 & 15 \end{pmatrix},??\small AA^{-1}=\begin{pmatrix} (5 \times 9)+(8 \times 1) &(5 \times 2)+(8 \times 15) \\ (17 \times 9)+(3 \times 1) & (17 \times 2)+(3 \times 15) \end{pmatrix}=\begin{pmatrix} 53 & 130 \\ 156 &7 9 \end{pmatrix}=\begin{pmatrix} 1 &0 \\ 0& 1 \end{pmatrix}

为了解释如何计算矩阵的逆矩阵,我们先介绍行列式的概念。对于任意一个方阵\small (m \times m),其行列式的值等于不同行、不同列上的元素的乘积的代数和,部分项的前面有负号。

继续刚才的列子,\small \det\begin{pmatrix} 5 & 8\\ 17 & 3 \end{pmatrix} = (5 \times 3) - (8 \times 17) =-121 \mod 26 =9,因为\small 9 \times 3 =27 \mod 26 =1(参阅第2章),得到\small 9^{-1} \mod 26=3。因此,A的逆的计算方式为

\small A=\begin{pmatrix} 5 & 8\\ 17& 3 \end{pmatrix},\small A^{-1} \mod 26 =3\begin{pmatrix} 3 & -8\\ -17& 5 \end{pmatrix}=3\begin{pmatrix} 3 &18 \\ 9 & 5 \end{pmatrix}=\begin{pmatrix} 9 & 54\\ 27 & 15 \end{pmatrix}=\begin{pmatrix} 9 & 2\\ 1& 15 \end{pmatrix}

我们可以看出,对于一般的矩阵\small A,先求出行列式,然后根据这个值求出行列式mod 26 的逆,然后乘以该矩阵的代数余子式\small A^{*}

Hill 算法? ?该加密算法将 m 个连续的明文字母替换成 m 个密文字母,这是由 m 个线性方程决定的,方程中的每个字母被赋予一个数值\small (a=0,b=1,\cdots,z=25)。例如,m=3时,系统可以描述为

?\small \begin{} \\c_{1}=(k_{11}p_{1}+k_{21}p_{2}+k_{31}p_{3}) \mod 26 \\ c_{2}=(k_{12}p_{1}+k_{22}p_{2}+k_{32}p_{3}) \mod 26 \\ c_{3}=(k_{13}p_{1}+k_{23}p_{2}+k_{33}p_{3}) \mod 26 \\ \end{}

用行向量和矩阵表示如下:

\small (c_{1} \:\: c_{2} \:\: c_{3})=(p_{1} \:\: p_{2}\:\: p_{3})\begin{pmatrix} k_{11} & k_{12} & k_{13}\\ k_{21}&k_{22} &k_{23} \\ k_{31} & k_{32} & k_{33} \end{pmatrix} \mod 26

\small C=PK \mod 26

式中,\small C\small P是长度为3的行向量,分别代表密文和明文,\small K是一个\small 3 \times 3的矩阵,代表加密密钥。运算按模26执行。例如,如果明文为paymoremoney,加密密钥为

\small K=\begin{pmatrix} 17 &17 & 5\\ 21& 18 & 21\\ 2& 2 &19 \end{pmatrix}

明文的前3个字母用向量(15 0 24)表示,那么(15 0 24)K=(303 303 531) mod 26 =(17 17 11)=RRL,照此方法转换余下的字母,可得到整段明文对应的密文是RRLMWBKASPDH。

解密时需要用到矩阵K的逆。可以算出det K =23,所以\small (\det K)^{-1} \mod 26 =17。计算逆矩阵为

\small K^{-1}=\begin{pmatrix} 4 & 9& 15\\ 15& 17 & 6 \\ 17& 0& 17 \end{pmatrix}

显然,若把逆矩阵\small K^{-1}应用到密文,则可恢复明文。

用一般术语可将Hill密码系统表示如下:

\small C=E(K,P)=PK \mod 26

\small P=D(K,C)=CK^{-1} \mod 26 =PKK^{-1}=P

与Playfair密码相比,Hill密码的优点是完全隐蔽了单字母频率特性。实际上,Hill用的矩阵越大,隐藏的频率信息就越多。因此,一个\small 3 \times 3的Hill密码不仅隐藏了单字母的频率特性,而且隐藏了双字母的频率特性。

尽管Hill密码足以抵抗唯密文攻击,但易被已知明文攻击破解。对于一个\small m \times m的Hill密码,设有m个明密文对,且每个的长度都是m,定义\small P_{j}=(p_{1j}p_{2j}\cdots p_{mj})\small C_{j}=(c_{1j}c_{2j}\cdots c_{mj}),使得对每个\small C_{j}\small P_{j}K(1 \leq j \leq m)都有\small C_{j}=P_{j}K,其中\small K是未知的矩阵密钥。现在定义两个\small m \times m的矩阵\small X=(p_{ij})\small Y=(c_{ij})。于是,可以得到矩阵公式\small Y=XK,若\small X可逆,则可得\small K=X^{-1}Y。若\small X不可逆,则可以另找\small X和对应的\small Y,直至得到一个可逆的\small X

3.2.5 多表代替加密

对单表代替的改进方法是在明文消息中采用不同的单表代替。这种方法一般称为多表加密密码。所有这些方法都有以下共同特征。

  1. 采用相关的单表代替规则集。
  2. 密钥决定给定变换的具体规则。

\small Vigen\grave{e}re?密码? ? ?多表代替密码中最著名和最简单的是\small Vigen\grave{e}re?密码 。它的代替规则集由26个Casesar密码的代替表组成,其中的每个代替表是对明文字母表移位0~25次后得到的代替单表。每个密码由一个密钥字母表示,这个密钥字母用来代替明文字母a,因此移位3次后的Caesar密码由密钥值d代表。

我们可用如下方式来表述?\small Vigen\grave{e}re?密码。假设明文序列为\small P=p_{0},p_{1},p_{2},\cdots ,p_{n-1},密钥由序列\small K=k_{0},k_{1},k_{2},\cdots ,k_{m-1}构成,通常\small m<n。密码序列\small C=C_{0},C_{1},C_{2},\cdots ,C_{n-1}的计算如下:

\small \begin{} \\ C=C_{0},C_{1},C_{2}, \cdots ,C_{n-1}=E(K,P)=E[(k_{0},k_{1},k_{2}, \cdots ,k_{m-1}),(p_{0},p_{1},p_{2},\cdots ,p_{n-1})] \\=(p_{0}+k_{0}) \mod 26,(p_{1}+k_{1}) \mod 26,\cdots,(p_{m-1}+k_{m-1})\mod 26 ,\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\:\: \\ (p_{m}+k_{0}) \mod 26,(p_{m+1}+k_{1}) \mod 26,\cdots ,(p_{2m-1}+k_{m-1}) \mod 26,\cdots \:\:\: \end{}

因此,密钥的第一个字母模26加到了明文的第一个字母,接着是第二个字母,以此类推,直到前m个明文处理完毕。对于第二组的m个明文,重复使用密钥字母。继续该过程直到所有的明文序列都被加密。加密过程的一般方程是

\small C_{i}=(p_{i}+k_{i \mod n}) \mod 26?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3.3)

该方程和Caesar密码的式(\small C=E(k,p)=(p+k) \mod 26)类似。本质上,每个明文字母根据相应的密钥字母用不同的Caesar密码加密。类似地,解密为:

\small p_{i}=(C_{i}-k_{i \mod m}) \mod 26? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (3.4)

加密一条消息时需要有与消息一样长的密钥。通常,密钥是一个密钥词的重复。

这种密码的强度是每个明文字母对应多个密文字母,且每个密文字母使用唯一的密钥字母,因此字母出现的频率信息被隐蔽,但并非所有的明文结构信息都被隐蔽。

Vernam 密码? ?最终的反破译措施也许只有选择一个和明文毫无统计关系且和明文一样长的密钥。1918年,AT&T公司的工程师 Gilbert Vernam 首先引入了这种体制,其运算基于二进制数据而非字母。该体制可以简单表示为

\small c_{i}=p_{i} \oplus k_{i}

式中,\small p_{i}是明文的第i个二进制位;\small k_{i}是密钥的第i个二进制位;\small c_{i}是密文的第i个二进制位;\small \oplus是异或运算符。

该式与\small Vigen\grave{e}re密码的式(3.3)类似。

因此密文是对明文和密钥的按位异或生成的。根据异或运算的性质,解密过程为

\small p_{i}=c_{i} \oplus k_{i}

该式和式(3.4)类似。

这种技术的本质在于构造密钥的方式。Vernam提出使用连续的磁带,磁带最终也将循环。所以事实上该体制使用了周期很长的循环密钥。尽管周期很长增大了密码分析的难度,但是如果有足够的密文,那么使用已知或可能的明文序列,或者组合使用二者,该方案式可以被破解的。

3.2.6 一次一密

陆军情报官Joseph Mauborgne 提出了一种对Vernam密码的改进方案,从而实现了最完善的安全性。Mauborgne建议使用与消息一样长且无重复的随机密钥来加密消息;另外,密钥只加解密一条消息,之后丢弃不用。每条新消息都需要一个与其等长的新密钥。这就是著名的一次一密,它是不可攻破的。它产生的随机输出与明文没有任何统计关系。因为密文不包括明文的任何信息,所以无法可破。

事实上,给出任何长度与密文长度一样的明文时,都存在一个密钥产生这个明文。因此,如果用穷举法搜索所有可能的密钥,那么会得到大量可读、清楚的明文,但是没有办法确定哪个明文才是真正需要的,因而这种密码时不可破的。

一次一密的安全性完全取决于密钥的随机性。如果构成密钥的字符流时真正随机的,那么构成密文的字符流也是真正随机的。因此,分析者没有任何攻击密文的模式和规则可用。

理论上,我们不再需要寻找密码,一次一密就提供了完全的安全性,但在实际中,一次一密存在连个基本难点。

  1. 产生大规模随机密钥存在困难。任何经常使用的系统都需要建立在某个规则基础上的数百万个随机字符,提供这种规模的真正随机字符是相当艰巨的任务。
  2. 更令人担忧的是密钥的分发和保护。对每条发送的消息,需要向发送方和接收方提供等长度的密钥。因此,存在庞大的密钥分发问题。

因为上面这些困难,一次一密实际上很少使用,而主要用于安全性要求很高的低带宽信道。一次一密是唯一具有完善保密的密码体制。

3.3 置换技术

到目前为止,我们讨论的都是将明文字母代替为密文字母。与之极不相同的一种加密方法是对明文进行置换,这总密码称为置换密码。

最简单的例子是栅栏加密技术,即按照对角线的顺序写出明文,按照行的顺序读出作为密文。

这中技巧对密码分析者来说微不足道。一种更复杂的方案是首先把消息一行一行地写成矩形块,然后按列读出,但要把列地次序打乱。列的次序就是算法的密钥。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:49:19  更:2021-07-10 14:50:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/24 1:13:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码