\chapter{理论基础}

\section{代理重加密}

代理重加密是一种特殊的公钥加密技术，允许代理为第三方重加密消息，
而不需要知道消息的具体内容。
这项技术使得原始加密数据的所有者可以授权代理为第三方重新加密其数据，
而不必将原始数据或解密密钥透露给代理，从而保证了数据安全性和保密性。

\subsection{基本原理}

在代理重加密系统中，通常涉及三个角色：数据拥有者(Alice)、数据接收者(Bob)和代理服务器。其工作流程如下：

\begin{enumerate}
	\item Alice首先使用自己的公钥对数据M进行加密，产生密文C
	\item 当Alice希望Bob能够访问其加密数据时，她会创建一个重加密密钥rk，并将其提供给代理服务器
	\item 代理服务器使用重加密密钥rk将Alice的加密数据C转化为重加密密文C'
	\item Bob使用自己的私钥对重加密密文C'进行解密，得到原始数据M
\end{enumerate}

在这个过程中，代理服务器既不能访问原始数据，也不能访问解密密钥，从而保证了数据的安全性。

\section{Shamir密码共享方案}

Shamir密码共享方案其核心思想是通过多项式插值来达到一个目的，由Adi Shamir
\cite{Shamir1979How}
在1979年提出。其定义如下：

$(t,n)$-Shamir是一种方法，使得一个秘密$S$可以被分割为$n$个片段$\{s_1,\ldots,s_n\}$，
这样只有当至少$t$个片段（其中$t \leq n$）集合在一起时，才能恢复原始的秘密$S$。
如果只有$t-1$个或更少的片段，则无法获得任何关于秘密的信息。
这种属性称为$(t,n)$阈值方案，其中$t$（也即$threshold$）是必要的片段数量，
$n$是总片段数量。Shamir密码共享方案的原理基于数学中的多项式插值，
尤其是Lagrange插值。以下是其工作原理：

\begin{enumerate}
	\item 选择一个整数$t$，表示需要的最少片段数来恢复秘密。
	\item 为秘密构造一个$t-1$次多项式$f(x)$，其中$f(0)=S$是要分享的秘密：
	      \[f(x) = a_0 + a_1x + a_2x^2 + \cdots + a_{t-1}x^{t-1}\]
	      其中$a_0 = S$，其他系数$a_1,\ldots,a_{t-1}$随机选择。
	\item 为每个参与者选择一个不同的$x$值，并计算相应的$f(x)$。每个$(x,f(x))$对都是一个秘密片段。
	\item 当要恢复秘密时，只需要任意$t$个$(x,f(x))$对，并使用Lagrange插值来恢复$f(0)$，即原始的秘密$S$。
\end{enumerate}

举例说明：假设我们有一个秘密数字$S=89$，我们希望将其分割成4个片段，
但只需要2个片段就可以恢复它（即$t=2,n=4$）：
选择一个1次多项式（因为$t-1=1$）:
\[f(x) = a_0 + a_1x^1\]
假设我们选择$a_1=23$，那么多项式就是：
\[f(x) = 89 + 23x\]
为每个参与者选择一个$x$值并计算$f(x)$：
\[f(1) = 89 + 23\cdot1^1 = 112\]
\[f(2) = 89 + 23\cdot2^1 = 135\]
\[f(3) = 89 + 23\cdot3^1 = 158\]
\[f(4) = 89 + 23\cdot4^1 = 181\]
每个参与者分别得到一个片段：$(1,112)$, $(2,135)$, $(3,158)$, $(4,181)$。
要恢复秘密，我们可以选择其中任意2个片段。
假设我们选择$(1,112)$和$(2,135)$，使用Lagrange插值可以计算出$f(0)=89$，从而恢复秘密。
具体的Lagrange插值公式为：
\[f(x) = \sum_{i=1}^t y_i \prod_{j=1,j\neq i}^t \frac{x-x_j}{x_i-x_j}\]
在这个例子中，使用$(1,112)$和$(2,135)$进行插值：
\[f(0) = 112\cdot\frac{0-2}{1-2} + 135\cdot\frac{0-1}{2-1} = 224 + -135 = 89\]
这就恢复出了原始的秘密值89。

这个例子展示了Shamir密码共享方案的基本原理和实际应用。

该方案的安全性基于：
\begin{itemize}
	\item 任意$t-1$个或更少的点无法确定一个$t-1$次多项式
	\item 多项式的系数（除$a_0$外）是随机选择的
	\item 在有限域上进行运算可以进一步增强安全性
\end{itemize}

\section{非对称/公钥密码算法}

公开密钥密码学（英语：Public-key cryptography），
也叫非对称密码学（英语：Asymmetric cryptography），
是一种使用两个不同密钥的加密方法。一个是可以公开分享的公钥，用来加密信息；
另一个是需要保密的私钥，用来解密信息。使用公钥加密后的信息，
只能用对应的私钥才能解开，而加密用的公钥本身不能用来解密。
因为加密和解密需要用到两个不同的密钥，所以称为"非对称"加密。
这类加密技术通常基于某些数学难题来保证其安全性。

常见的非对称密码算法基于以下几种数学难题：


\subsection{基于大因数分解}
代表算法：RSA

这类算法的安全性基于大整数分解问题的难度。
RSA算法的安全性依赖于将两个大质数的乘积进行因式分解的计算复杂度。
目前已知的最高效算法仍需要超多项式时间\cite{Lenstra1990GNFS}，这保证了在足够大的密钥长度下的安全性。
RSA广泛应用于数字签名、密钥交换和数据加密等场景。

\subsection{基于离散对数}
代表算法：DSA、Diffie-Hellman

这类算法的安全性基于在有限域中计算离散对数的难度。
DSA（数字签名算法）主要用于生成数字签名，而Diffie-Hellman则是一种密钥交换协议，
允许通信双方在不安全的通信信道上建立共享密钥。这些算法在安全通信和身份验证中扮演重要角色。

\subsection{基于椭圆曲线}
代表算法：ECDSA、ECDH、SM2

椭圆曲线密码学利用定义在有限域上的椭圆曲线数学性质
。与传统公钥密码相比，椭圆曲线密码在相同安全水平下需要更短的密钥长度，
提供了更高的计算效率和带宽节约。SM2是中国国家密码算法标准，
是基于椭圆曲线的公钥密码算法，支持数字签名、密钥交换和数据加密功能。

\section{杂凑算法}
杂凑算法（也称散列算法或哈希算法）是将任意长度的输入数据转换为固定长度输出的单向函数。

理想的杂凑算法应满足以下特性：
\begin{itemize}
	\item 单向性：由杂凑值无法逆向推导出原始输入
	\item 抗碰撞性：难以找到具有相同杂凑值的两个不同输入
	\item 雪崩效应：输入的微小变化会导致输出的显著变化
\end{itemize}

常见的杂凑算法包括：
\begin{itemize}
	\item MD5：输出128位杂凑值，现已被证明存在安全缺陷\cite{Wang2004Collisions}
	\item SHA家族：包括SHA-1（160位）、SHA-2（224/256/384/512位）和SHA-3系列
	\item SM3：中国商用密码杂凑算法标准，输出256位杂凑值
\end{itemize}

杂凑算法广泛应用于数字签名、消息认证码、数据完整性校验和密码存储等场景。

\section{对称密码算法}
对称密码算法（英语：Symmetric-key algorithm）使用相同的密钥进行加密和解密操作。
与非对称加密相比，对称加密计算效率更高，
但密钥分发和管理存在挑战。对称密码主要分为分组密码和流密码两大类。

\subsection{分组密码算法}
分组密码将明文分割成固定长度的数据块，然后对每个块进行加密处理。主要特点包括：

\begin{itemize}
	\item 以固定大小的块为单位进行加密
	\item 相同的明文块在相同密钥下产生相同的密文块
	\item 需要配合工作模式使用（如ECB、CBC、CTR等）以处理超出块大小的数据
\end{itemize}

代表算法：
\begin{itemize}
	\item DES：56位密钥，64位分组，现已不再安全
	\item 3DES：基于DES的三重加密，提高安全性但速度较慢
	\item AES：分组大小128位，支持128/192/256位密钥长度
	\item SM4：中国商用分组密码标准，128位分组和密钥长度
\end{itemize}

\subsection{流密码算法}
流密码算法产生一个伪随机密钥流，通过与明文逐位（通常是按位异或）组合来生成密文。主要特点：

\begin{itemize}
	\item 逐位或逐字节处理数据，无需分组
	\item 加密和解密操作相同
	\item 适合实时性要求高或硬件资源受限的场景
\end{itemize}

代表算法：
\begin{itemize}
	\item RC4：曾广泛应用于SSL/TLS、WEP等协议，但现已被证明存在多种安全问题
	\item ChaCha20：现代高性能流密码，被用于TLS 1.3和许多安全通信场景
	\item ZUC：中国商用流密码标准，用于4G/5G移动通信安全
\end{itemize}

流密码算法通常具有更高的加密速度和更低的实现复杂度，
特别适合对吞吐量要求高或资源受限的环境，如无线通信和嵌入式系统。

\section{国密算法}

国密算法是我国自主研发的一系列密码算法标准，主要包括SM2、SM3和SM4等。

\subsection{SM2公钥密码算法}

SM2算法是我国基于椭圆曲线密码体制自主研发的公钥密码算法，包含以下三个主要功能：

\begin{itemize}
	\item SM2-1：数字签名算法
	\item SM2-2：密钥交换协议
	\item SM2-3：公钥加密算法
\end{itemize}

相比于传统RSA签名算法，SM2的主要优势在于：
\begin{itemize}
	\item 安全性基础：SM2基于椭圆曲线上的离散对数问题(ECDLP)，而RSA基于整数分解问题(IFP)
	\item 密钥长度：SM2可以用更短的密钥实现与RSA相同的安全强度\cite{nist800-57r5}
	\item 计算效率：在同等安全级别下，SM2的椭圆曲线运算比RSA的大整数模幂运算更高效\cite{hankerson2006guide}
\end{itemize}

% 或者也可以将两个引用合并成一个：
这些优势已在多项研究中得到证实\cite{nist800-57r5,hankerson2006guide}。

\subsection{SM3密码杂凑算法}

SM3哈希算法是密码体系的重要组成部分，是一种将任意长度的消息$M$映射为定长字符串$H(M)$的单向散列函数，
$H(M)$称为$M$的消息摘要。我国基于对SHA-256中的压缩函数进行自主研发并取得重大突破，
国产哈希算法SM3随之诞生。与SHA-256相似，SM3算法同样适用于数字签名、消息认证及随机数生成等场景，
且其安全性略高于SHA-256\cite{SM3StandardGroup2013}，国家密码管理局规定SM2算法中的哈希算法为SM3。

SM3算法对长度为$l$比特的消息$M$，经过填充和迭代压缩，最终输出一个256比特的杂凑值。算法主要包含以下步骤：

\subsubsection{填充过程}
设有长度为$l$比特的消息$M$：
\begin{enumerate}
	\item 首先将比特"1"添加至消息$M$末尾
	\item 添加$k$个"0"，其中$k$是满足公式$(l + 1 + k) \bmod 512 \equiv 448$的最小非负整数
	\item 添加一个64位比特串，表示$l$的值
	\item 填充后的消息$M$比特长度为512的倍数
\end{enumerate}

\subsubsection{迭代压缩过程}
分为以下两个主要步骤：

1. 消息分块与扩展：
\begin{itemize}
	\item 将填充好的消息$M$按每512比特分成$n$个组，其中$M = M^{(1)} || M^{(2)} || ... || M^{(n)}$
	\item 将上述分组按消息扩展算法扩展成132个消息字$W_j$，用于压缩函数$CF$
\end{itemize}

2. 压缩与输出：
\begin{itemize}
	\item 对分组后的消息$M$进行$n$次迭代压缩
	\item $V_i = CF(V_{i-1}, M^{(i)})$，其中$i = 1,2,...,n$
	\item $CF$为压缩函数，通过最终的迭代值得到一个256比特的杂凑值
\end{itemize}



\subsection{SM4分组密码算法}

SM4是一种对称密钥分组密码算法，是SMS4算法的标准化版本。其主要特征如下：

\subsubsection{基本参数}
\begin{itemize}
	\item 分组大小：128位
	\item 密钥长度：128位
	\item 加密轮数：32轮
\end{itemize}

\subsubsection{算法结构}
\begin{itemize}
	\item 采用"置换-置换"(SP)网络结构，区别于传统的"置换-替代"(SPN)结构
	\item 包含非线性变换函数（S盒）：将4字节输入转换为4字节输出
	\item 线性变换：用于增强加密强度
	\item 轮函数：每轮使用$F$函数处理数据块和轮密钥
\end{itemize}

\subsubsection{密钥处理}
\begin{itemize}
	\item 密钥扩展：从128位主密钥生成32个轮密钥
	\item 轮密钥加：通过异或运算将轮密钥与数据块结合
\end{itemize}

\subsubsection{工作模式}
SM4支持多种标准工作模式：
\begin{itemize}
	\item ECB（电子密码本模式）
	\item CBC（密码分组链接模式）
	\item CTR（计数器模式）
	\item 其他标准分组密码工作模式
\end{itemize}

\subsection{混合加密机制}

\subsubsection{基本原理}
由于公钥密码算法是基于复杂的代数计算，其计算效率远低于对称密码算法。
因此，在需要加密大量数据时，直接使用公钥密码进行加密并不是最优选择。
为解决这一问题，现代密码学中普遍采用KEM/DEM混合加密机制：

\begin{itemize}
	\item KEM (Key-Encapsulation Mechanism)：密钥封装机制
	\item DEM (Data-Encapsulation Mechanism)：数据封装机制
\end{itemize}

\subsubsection{工作机制}
KEM/DEM混合加密方案的工作流程如下：

1. 数据加密过程：
\begin{itemize}
	\item DEM使用对称加密算法加密原始数据
	\item 随机生成用于对称加密的会话密钥
	\item KEM使用公钥加密算法对会话密钥进行加密
\end{itemize}

2. 数据解密过程：
\begin{itemize}
	\item 接收方首先使用私钥解密得到会话密钥
	\item 使用恢复的会话密钥解密获得原始数据
\end{itemize}

\subsubsection{优势特点}
KEM/DEM混合加密机制具有以下优势：

\begin{enumerate}
	\item 效率提升
	      \begin{itemize}
		      \item 大量数据使用高效的对称加密
		      \item 仅对短小的会话密钥使用公钥加密
		      \item 显著提高整体加解密效率
	      \end{itemize}

	\item 安全性保障
	      \begin{itemize}
		      \item 结合对称加密和非对称加密的安全优势
		      \item 即使会话密钥泄露也不影响其他通信场景
		      \item 支持前向安全性
	      \end{itemize}

	\item 通信优化
	      \begin{itemize}
		      \item 减少加密数据的传输量
		      \item 降低网络带宽占用
		      \item 提高通信效率
	      \end{itemize}
\end{enumerate}

\subsubsection{应用场景}
混合加密机制在以下场景中具有广泛应用：

\begin{itemize}
	\item 安全通信协议（如TLS/SSL）
	\item 数据加密传输
	\item 文件加密存储
	\item 密钥交换协议
\end{itemize}

\subsubsection{具体实现}
在实践中，KEM/DEM 混合加密机制通常采用以下算法组合：
1. KEM (密钥封装机制) 实现选择：
\begin{itemize}
	\item 基于椭圆曲线的算法：SM2、ECIES、ECDH 等
	\item 基于整数分解的算法：RSA-OAEP、RSA-KEM 等
	\item 基于格的后量子算法：CRYSTALS-Kyber、NTRU 等
	\item 基于配对的算法：IBE-KEM (基于身份的加密)
\end{itemize}

2. DEM (数据封装机制) 实现选择：
\begin{itemize}
	\item 分组密码及其工作模式：SM4-GCM、AES-GCM、ChaCha20-Poly1305 等
	\item 结合 AEAD (认证加密与关联数据) 模式确保机密性和完整性
	\item 针对高性能需求的流密码或轻量级分组密码：SNOW、AEGIS 等
\end{itemize}

\section{本章小结}

本章介绍了分布式环境下基于国密的代理重加密系统所需的核心理论基础，
包括代理重加密技术、门限密码学和国密算法。
这些理论为系统的设计和实现提供了必要的技术支撑，
确保了系统的安全性、可靠性和高效性。
