8 Commits

Author SHA1 Message Date
5927ab9992 feat: first edition 2025-05-08 14:26:22 +08:00
5feb8ebfc8 feat: temp stage 2025-04-30 21:51:58 +08:00
4f1d7424e6 feat: stage my paper 2025-04-22 14:49:34 +08:00
12709e2259 feat: update tools config 2025-04-18 18:17:13 +08:00
b9bc817519 feat: update ecc_rs version 2025-04-17 09:41:38 +08:00
5144334558 feat: update ecc operation call 2025-04-04 23:19:27 +08:00
dd86253162 feat: remove useless file 2025-04-03 13:50:12 +08:00
f03fc66c1e refactor: cleanup test code 2025-04-03 13:45:37 +08:00
86 changed files with 6851 additions and 485 deletions

2
.gitignore vendored
View File

@@ -39,4 +39,4 @@ include
*-blx.bib
*.run.xml
.coverage

View File

@@ -1,19 +0,0 @@
FROM python:3.12-slim
COPY requirements.txt /app/
# 设置目标平台参数
#ARG TARGETPLATFORM
# 根据目标平台复制相应架构的库文件
#COPY lib/${TARGETPLATFORM}/* /lib/
COPY lib/* /usr/local/lib/
WORKDIR /app
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install --index-url https://git.mamahaha.work/api/packages/sangge/pypi/simple/ ecc-rs
RUN ldconfig

View File

@@ -1,10 +1,24 @@
FROM git.mamahaha.work/sangge/tpre:base
COPY src /app
COPY requirements.txt /app/requirements.txt
FROM python:3.13-slim AS base
WORKDIR /app
COPY ./pyproject.toml /app/
COPY lib/* /usr/local/lib/
RUN ldconfig && \
pip install -i https://git.mamahaha.work/api/packages/sangge/pypi/simple/ ecc-rs==0.1.2 --no-cache-dir
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# Development stage
FROM base AS dev
RUN pip install -e ".[dev]" -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir
# Test stage
FROM base AS test
COPY ./tests /app/tests
RUN pip install -e ".[test]" -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir
ENTRYPOINT ["pytest", "/app/tests"]
CMD ["-xvs"]
# Deployment stage
FROM base AS deploy
WORKDIR /app
COPY --from=base /usr/local/lib/* /usr/local/lib/
COPY src /app
RUN ldconfig

2
ecc_rs

Submodule ecc_rs updated: 880c34ce03...ba45c2cd1d

6
package-lock.json generated
View File

@@ -1,6 +0,0 @@
{
"name": "tpre-python",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}

31
paper/build.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/bash
# 检查是否有debug参数
if [[ "$1" == "debug" ]]; then
DEBUG=true
else
DEBUG=false
fi
# 创建 build 目录(如果不存在)
mkdir -p build
mkdir -p build/chapters
# 完整编译流程
if [[ "$DEBUG" == "true" ]]; then
# Debug模式显示所有输出
echo "Running in debug mode - showing all output"
xelatex -output-directory=build main
bibtex build/main
xelatex -output-directory=build main
xelatex -output-directory=build main
else
# 正常模式:仅显示错误和警告
xelatex -output-directory=build main 2>&1 | rg -i "error|warning"
bibtex build/main 2>&1 | rg -i "error|warning"
xelatex -output-directory=build main 2>&1 | rg -i "error|warning"
xelatex -output-directory=build main 2>&1 | rg -i "error|warning"
fi
# 可选:添加成功提示
echo "Compilation completed. Output files are in ./build/"

View File

@@ -0,0 +1,29 @@
%% 中文摘要页
\pdfbookmark[0]{摘要}{abstract-zh}
\begin{center}\heiti\sanhao\textbf{
摘要
}
\end{center}
为了适应数据要素化背景下数据流通需求场景,
针对分布式环境下多节点参与,数据安全授权变得尤为重要,
本项目提出分布式环境下基于国密的代理重加密算法,
将传统代理重加密中的单代理节点,拆分为多个代理节点,
结合门限代理重加密和国密算法的特点,确保在客户端与中心服务器间、中心服务器与不同节点间、
客户端和不同节点间的数据传输和存储过程中,数据保持完整和隐私性。
与传统的访问控制和权限管理方法相比,
本项目算法具有以下优点:
高强度加密:使用门限代理重加密技术对数据进行高强度加密,保护数据的机密性和隐私性。
分布式架构:采用分布式架构实现对分布式数据的访问控制和授权管理,解决了传统方法在分布式场景下的难题。
自主可控:基于国密算法设计,保证了数据的自主可控性,可以有效地避免数据泄露和信息安全风险。
高效性能:算法实现简单、计算量小,可在现有的计算资源下高效地进行数据安全共享和授权管理。
为了验证所提出系统的有效性和性能,本项目进行了一系列的实验测试。
测试结果表明,该基于国密算法的代理重加密系统在分布式环境中具有优越的加密速度、解密效率和扩展性。
因此,本项目方案为分布式数据的安全传输和存储提供了一个高效且安全的解决方案,
并为区块链环境下隐私计算带来了新的研究视角和实践经验。
\textbf{关键词:}分布式计算;国密算法;代理重加密;数据共享;权限管理
\clearpage

View File

@@ -0,0 +1,43 @@
% 英文摘要页
\pdfbookmark[0]{Abstract}{abstract-en}
\begin{center}\heiti\sanhao\textbf{
Abstract
}
\end{center}
In response to the data circulation requirements in the context of data elementization,
data security authorization becomes particularly important in distributed environments with multi-node participation.
This project proposes a distributed proxy re-encryption algorithm based on Chinese cryptographic standards.
The traditional single-proxy node in proxy re-encryption is split into multiple proxy nodes,
combining threshold proxy re-encryption and Chinese cryptographic algorithm characteristics to
ensure data integrity and privacy during data transmission and storage between clients and central servers,
central servers and different nodes,and clients and different nodes.
Compared with traditional access control and permission management methods,
the algorithm in this project has the following advantages:
High-strength encryption:
Uses threshold proxy re-encryption technology to provide high-strength encryption of data,
protecting data confidentiality and privacy.
Distributed architecture:
Implements access control and authorization management for distributed data through a distributed architecture,
solving the challenges faced by traditional methods in distributed scenarios.
Independent control:
Designed based on Chinese cryptographic algorithms,
ensuring data sovereignty and effectively preventing data leakage and information security risks.
High performance:
Simple algorithm implementation with low computational complexity,
enabling efficient data security sharing and authorization management with existing computational resources.
To verify the effectiveness and performance of the proposed system,
this project conducted a series of experimental tests.
The test results show that this proxy re-encryption system based on
Chinese cryptographic algorithms demonstrates superior encryption speed,
decryption efficiency, and scalability in distributed environments.
Therefore, this project provides an efficient and secure solution for distributed data transmission and storage,
bringing new research perspectives and practical experience to privacy computing in blockchain environments.
\textbf{Keywords:} Distributed Computing; Chinese Cryptographic Algorithm; Proxy Re-encryption; Data Sharing
\newpage\quad %加一页,使得目录第一页的页眉为 目录
\clearpage

276
paper/chapters/appden01.tex Normal file
View File

@@ -0,0 +1,276 @@
%% 附录页
\chapter{附录A\ \ \ \ 英文文献翻译}
\section{英文原文}
\begin{center}
\Large\textbf{How to Share a Secret}
\vspace{0.5cm}
\large Adi Shamir\\
Massachusetts Institute of Technology
\end{center}
\vspace{0.5cm}
In this paper we show how to divide data $D$ into $n$ pieces
in such a way that $D$ is easily reconstructable from any $k$
pieces, but even complete knowledge of $k - 1$ pieces reveals
absolutely no information about $D$. This technique enables the
construction of robust key management schemes for cryptographic
systems that can function securely and reliably even when misfortunes
destroy half the pieces and security breaches expose all
but one of the remaining pieces.
\vspace{0.3cm}
\noindent\textbf{Key Words and Phrases:} cryptography, key management, interpolation
\noindent\textbf{CR Categories:} 5:39, 5.6
\subsection{Introduction}
In [4], Liu considers the following problem:
\begin{quote}
Eleven scientists are working on a secret project.
They wish to lock up the documents in a cabinet so that the
cabinet can be opened if and only if six or more of the
scientists are present. What is the smallest number of locks needed?
What is the smallest number of keys to the locks each scientist must carry?
\end{quote}
It is not hard to show that the minimal solution uses 462 locks and
252 keys per scientist. These numbers are clearly impractical,
and they become exponentially worse when the number of scientists increases.
In this paper we generalize the problem to one in which the
secret is some data $D$ (e.g., the safe combination) and in
which nonmechanical solutions (which manipulate this data)
are also allowed. Our goal is to divide $D$ into $n$ pieces $D_1, \ldots, D_n$ in such a way that:
\begin{enumerate}
\item knowledge of any $k$ or more $D_i$ pieces makes $D$ easily computable;
\item knowledge of any $k - 1$ or fewer $D_i$ pieces leaves $D$ completely undetermined
(in the sense that all its possible values are equally likely).
\end{enumerate}
Such a scheme is called a $(k, n)$ threshold scheme. Efficient threshold schemes
can be very helpful in the management of cryptographic keys.
In order to protect data we can encrypt it, but in order to protect
the encryption key we need a different method (further encryptions change
the problem rather than solve it). The most secure key management scheme
keeps the key in a single, well-guarded location (a computer, a human brain,
or a safe). This scheme is highly unreliable since a single misfortune
(a computer breakdown, sudden death, or sabotage) can make the information
inaccessible. An obvious solution is to store multiple copies of the key at
different locations, but this increases the danger of security breaches
(computer penetration, betrayal, or human errors). By using a $(k, n)$
threshold scheme with $n = 2k - 1$ we get a very robust key management scheme:
We can recover the original key even when $\lfloor n/2 \rfloor = k - 1$ of
the $n$ pieces are destroyed, but our opponents cannot reconstruct the key
even when security breaches expose $\lfloor n/2 \rfloor = k - 1$ of the remaining $k$ pieces.
In other applications the tradeoff is not between secrecy and reliability,
but between safety and convenience of use. Consider, for example,
a company that digitally signs all its checks (see RSA [5]).
If each executive is given a copy of the company's secret signature key,
the system is convenient but easy to misuse. If the cooperation of all the
company's executives is necessary in order to sign each check, the system
is safe but inconvenient. The standard solution requires at least three
signatures per check, and it is easy to implement with a $(3, n)$ threshold scheme.
Each executive is given a small magnetic card with one $D_i$ piece,
and the company's signature generating device accepts any three of them
in order to generate (and later destroy) a temporary copy of the actual
signature key $D$. The device does not contain any secret information and
thus it need not be protected against inspection. An unfaithful executive
must have at least two accomplices in order to forge the company's signature in this scheme.
Threshold schemes are ideally suited to applications in which a group of
mutually suspicious individuals with conflicting interests must cooperate.
Ideally we would like the cooperation to be based on mutual consent,
but the veto power this mechanism gives to each member can paralyze the
activities of the group. By properly choosing the $k$ and $n$ parameters
we can give any sufficiently large majority the authority to take some
action while giving any sufficiently large minority the power to block it.
\subsection{A Simple \texorpdfstring{$(k, n)$}{(k, n)} Threshold Scheme}
Our scheme is based on polynomial interpolation: given $k$ points in the
2-dimensional plane $(x_1, y_1), \ldots, (x_k, y_k)$, with distinct $x_i$'s,
there is one and only one polynomial $q(x)$ of degree $k - 1$ such
that $q(x_i) = y_i$ for all $i$. Without loss of generality, we can
assume that the data $D$ is (or can be made) a number. To divide it into
pieces $D_i$, we pick a random $k - 1$ degree polynomial
$q(x) = a_0 + a_1x + \ldots + a_{k-1}x^{k-1}$ in which $a_0 = D$, and evaluate:
$D_1 = q(1), \ldots, D_i = q(i), \ldots, D_n = q(n)$.
Given any subset of $k$ of these $D_i$ values (together with their identifying indices),
we can find the coefficients of $q(x)$ by interpolation, and then evaluate
$D = q(0)$. Knowledge of just $k - 1$ of these values, on the other hand,
does not suffice in order to calculate $D$.
To make this claim more precise, we use modular arithmetic instead of real
arithmetic. The set of integers modulo a prime number $p$ forms a field in
which interpolation is possible. Given an integer valued data $D$, we pick
a prime $p$ which is bigger than both $D$ and $n$.
The coefficients $a_1 \ldots a_{k-1}$ in $q(x)$ are randomly chosen from a
uniform distribution over the integers in $[0, p)$, and the values $D_1, \ldots, D_n$ are computed modulo $p$.
Let us now assume that $k - 1$ of these $n$ pieces are revealed to an opponent.
For each candidate value $D'$ in $[0, p)$ he can construct one and only one
polynomial $q'(x)$ of degree $k - 1$ such that $q'(0) = D'$ and $q'(i) = D_i$ for
the $k - 1$ given arguments. By construction, these $p$ possible polynomials
are equally likely, and thus there is absolutely nothing the opponent can deduce
about the real value of $D$.
Efficient $O(n \log^2 n)$ algorithms for polynomial evaluation and interpolation
are discussed in [1] and [3], but even the straightforward quadratic algorithms
are fast enough for practical key management schemes. If the number $D$ is long,
it is advisable to break it into shorter blocks of bits (which are handled separately)
in order to avoid multiprecision arithmetic operations.
The blocks cannot be arbitrarily short, since the smallest usable value
of $p$ is $n + 1$ (there must be at least $n + 1$ distinct arguments
in $[0, p)$ to evaluate $q(x)$ at). However, this is not a severe limitation
since sixteen bit modulus (which can be handled by a cheap sixteen bit arithmetic unit)
suffices for applications with up to 64,000 $D_i$ pieces.
Some of the useful properties of this $(k, n)$ threshold scheme
(when compared to the mechanical locks and keys solutions) are:
\begin{enumerate}
\item The size of each piece does not exceed the size of the original data.
\item When $k$ is kept fixed, $D_i$ pieces can be dynamically added or deleted
(e.g., when executives join or leave the company) without affecting
the other $D_i$ pieces. (A piece is deleted only when a leaving executive
makes it completely inaccessible, even to himself.)
\item It is easy to change the $D_i$ pieces without changing the original data
$D$ --- all we need is a new polynomial $q(x)$ with the same free term.
A frequent change of this type can greatly enhance security since the
pieces exposed by security breaches cannot be accumulated unless all of
them are values of the same edition of the $q(x)$ polynomial.
\item By using tuples of polynomial values as $D_i$ pieces, we can get a
hierarchical scheme in which the number of pieces needed to determine $D$
depends on their importance. For example, if we give the company's president
three values of $q(x)$, each vice-president two values of $q(x)$, and each
executive one value of $q(x)$, then a $(3, n)$ threshold scheme enables
checks to be signed either by any three executives, or by any two executives
one of whom is a vice-president, or by the president alone.
\end{enumerate}
A different (and somewhat less efficient) threshold scheme was recently developed by G.R. Blakley [2].
\section{中文翻译}
\begin{center}
\Large\textbf{如何共享秘密}
\vspace{0.5cm}
\large Adi Shamir\\
麻省理工学院
\end{center}
\vspace{0.5cm}
本文展示了如何将数据$D$分割为$n$份,使得从任意$k$份中可以轻松重构$D$
但即使完全掌握$k-1$份也无法获取关于$D$的任何信息。该技术使得密码系
统的密钥管理方案能够更加稳健,即使在不幸情况下丢失了一半的份额,
安全漏洞暴露了除一份以外的所有剩余份额,系统仍能安全可靠地运行。
\vspace{0.3cm}
\noindent\textbf{关键词与短语:} 密码学,密钥管理,插值
\noindent\textbf{CR分类} 5:39, 5.6
\subsection{引言}
在文献[4]中Liu考虑了以下问题
\begin{quote}
十一位科学家正在进行一个秘密项目。他们希望将文件锁在一个柜子里,
使得当且仅当六位或更多科学家在场时才能打开柜子。问题是:
最少需要多少把锁?每位科学家最少需要携带多少把钥匙?
\end{quote}
不难证明最小解需要462把锁每位科学家需要携带252把钥匙。
这些数字显然不具有实用性,而且随着科学家数量的增加,这些数字会呈指数级增长。
本文将问题推广为:秘密是某些数据$D$(例如,保险箱的组合密码),
并且允许采用非机械的解决方案(对数据进行操作)。我们的目标
是将$D$分割为$n$$D_1, \ldots, D_n$,使得:
\begin{enumerate}
\item 知道任意$k$个或更多$D_i$片段使得$D$易于计算;
\item 知道任意$k-1$个或更少$D_i$片段时,$D$完全不确定
(即所有可能的值是等可能的)。
\end{enumerate}
这样的方案称为$(k, n)$门限方案。高效的门限方案在密码密钥管理中非常有用。
为了保护数据,我们可以对其加密,但为了保护加密密钥,
我们需要不同的方法(进一步加密只会改变问题而非解决问题)。
最安全的密钥管理方案是将密钥保存在单一的、严密防护的位置
(计算机、人脑或保险箱)。这种方案极不可靠,因为单一的不幸事件
(计算机故障、突然死亡或破坏)可能使信息无法访问。一个明显的解决方
案是在不同位置存储密钥的多个副本,但这增加了安全漏洞的危险
(计算机入侵、背叛或人为错误)。通过使用$n = 2k - 1$$(k, n)$门限方案,
我们得到一个非常稳健的密钥管理方案:即使$\lfloor n/2 \rfloor = k - 1$$n$份中的片段被销毁,
我们仍能恢复原始密钥,但我们的对手即使在安全漏洞暴露了
剩余$k$份中的$\lfloor n/2 \rfloor = k - 1$份时也无法重构密钥。
在其他应用中,权衡不是在保密性和可靠性之间,而是在安全性和使用
便利性之间。例如考虑一家对所有支票进行数字签名的公司参见RSA [5])。
如果每位高管都持有公司的秘密签名密钥副本,系统便于使用但容易被滥用。
如果需要所有公司高管的合作才能签署每张支票,系统安全但不便利。
标准解决方案要求每张支票至少有三个签名,这可以用$(3, n)$门限方案轻松实现。
每位高管获得一张包含一个$D_i$片段的小型磁卡,公司的签名生成设备接受其
中任意三张来生成(并随后销毁)实际签名密钥$D$的临时副本。该设备不包含
任何秘密信息,因此不需要防止检查。在这种方案中,不忠诚的高管必须至少
有两个同谋才能伪造公司签名。
门限方案非常适合于那些具有冲突利益的互相怀疑的个体必须合作的应用。
理想情况下,我们希望合作基于相互同意,但这种机制赋予每个成员的否决
权可能会使集体活动陷入瘫痪。通过适当选择$k$$n$参数,我们可以给予
任何足够大的多数采取某些行动的权力,同时给予任何足够大的少数阻止它的能力。
\subsection{一个简单的\texorpdfstring{$(k, n)$}{(k, n)}门限方案}
我们的方案基于多项式插值:给定二维平面上的$k$个点$(x_1, y_1), \ldots, (x_k, y_k)$
其中$x_i$各不相同,存在唯一一个$k-1$次多项式$q(x)$使得对所有$i$
$q(x_i) = y_i$。在不失一般性的情况下,我们可以假设数据$D$是(或可以
转换为)一个数字。为了将其分割成片段$D_i$,我们选择一个随机的$k-1$次多
项式$q(x) = a_0 + a_1x + \ldots + a_{k-1}x^{k-1}$,其中$a_0 = D$,并计算:
$D_1 = q(1), \ldots, D_i = q(i), \ldots, D_n = q(n)$
给定这些$D_i$值中的任意$k$个子集(及其标识索引),我们可以通过插
值找到$q(x)$的系数,然后计算$D = q(0)$。另一方面,仅掌握这些值
中的$k-1$个不足以计算$D$
为了使这一声明更加精确,我们使用模运算而非实数运算。对素数$p$取模的整
数集构成一个域,在该域中可以进行插值。给定整数值数据$D$,我们选择一
个大于$D$$n$的素数$p$$q(x)$中的系数$a_1 \ldots a_{k-1}$从区间$[0, p)$内的整数
上均匀分布中随机选择,$D_1, \ldots, D_n$的值按模$p$计算。
现在假设这$n$个片段中的$k-1$个被泄露给对手。对于$[0, p)$中的每个候
选值$D'$,他可以构造唯一一个$k-1$次多项式$q'(x)$,使得$q'(0) = D'$
对于给定的$k-1$个参数$i$$q'(i) = D_i$。根据构造,这$p$个可能的多项式
是等可能的,因此对手无法推断出$D$的真实值。
多项式求值和插值的高效$O(n \log^2 n)$算法在[1]和[3]中有讨论,但即使是直
接的二次算法对于实际的密钥管理方案也足够快。如果数字$D$较长,建议将其分
解为较短的位块(分别处理),以避免多精度算术运算。这些块不能任意短,因为
最小可用的$p$值是$n+1$(必须有至少$n+1$个不同的参数在$[0, p)$中以评
$q(x)$)。然而,这不是严重的限制,因为十六位模数(可由廉价的十六位
算术单元处理足以应用于最多64,000个$D_i$片段。
与机械锁和钥匙解决方案相比,此$(k, n)$门限方案的一些有用特性是:
\begin{enumerate}
\item 每个片段的大小不超过原始数据的大小。
\item$k$保持固定时,可以动态添加或删除$D_i$片段(例如,当高管加
入或离开公司时),而不影响其他$D_i$片段。(仅当离开的高管使片段完
全无法访问,甚至对自己也无法访问时,才删除该片段。)
\item 不改变原始数据$D$而改变$D_i$片段很容易——我们只需要一个具有相同常数项
的新多项式$q(x)$。频繁进行这种类型的更改可以大大增强安全性,因为
安全漏洞暴露的片段无法累积,除非它们都是同一版本$q(x)$多项式的值。
\item 通过使用多项式值的元组作为$D_i$片段,我们可以获得层次化方案,其中
确定$D$所需的片段数量取决于它们的重要性。例如,如果我们给公司总裁
三个$q(x)$的值,每位副总裁两个$q(x)$的值,每位高管一个$q(x)$的值
,那么$(3, n)$门限方案使得支票可以由任意三位高管签署,或由任意两位
高管签署(其中一人是副总裁),或仅由总裁签署。
\end{enumerate}
最近G.R. Blakley [2]开发了一种不同的(且效率稍低的)门限方案。

View File

@@ -0,0 +1,177 @@
\chapter{引言}
\vspace{-2cm}
\section{研究背景和意义}
随着数字经济的快速发展,数据要素化已成为推动经济社会发展的重要驱动力。
在分布式环境下,数据的安全流通和共享变得愈发重要,
尤其是在涉及多个参与节点的场景中,如何保证数据传输和存储过程的安全性成为亟待解决的关键问题。
如何结合分布式技术完成数据的安全共享一直是热门研究方向,
自从2008年Nakamoto\upcite{nakamoto2008bitcoin}
(中本聪)发表了一篇《比特币:一种点对点的电子现金系统》后,
吸引了无数来自不同学术领域的学者的关注。
当前,传统的数据安全授权方案在分布式环境下面临诸多挑战:
首先,单一的授权节点容易成为系统安全的薄弱环节;
其次,现有的授权机制难以满足分布式环境下多方协同的需求;
最后,在确保数据安全的同时如何保持系统效率,也是一个重要问题。
本课题的研究对推动数据要素安全流通具有重要的理论和实践意义。
在理论层面,本研究将门限密码学与代理重加密技术相结合,
拓展了传统代理重加密的应用场景。在实践层面,本研究提出的基于国密算法的分布式代理重加密方案,
为解决分布式环境下的数据安全授权问题提供了可行的技术路径。
\section{国内外研究现状}
\subsection{国外研究现状}
在国外代理重加密技术的研究始于Blaze\upcite{blaze1998divertible}等人1998年提出的概念。
该研究首次引入了能够在不泄露明文或密钥的情况下,
将加密数据从一个接收者转换到另一个接收者的密码学机制。
Blaze等人设计了基于ElGamal加密体系的代理重加密方案
奠定了该领域的理论基础。他们引入了单向性和双向性的概念,
其中单向代理重加密仅允许从一个用户到另一个用户的单向转换,
而双向则支持双向转换。该研究的突破性贡献在于证明了代理功能可以被赋予转换能力,
而无需访问原始加密密钥,这在分布式系统中具有重要意义。
随后Ateniese等人\upcite{ateniese2006improved}于2006年对该技术进行了改进
提出了基于双线性映射的代理重加密方案,解决了原始方案中的安全性和效率问题。
他们的方案实现了选择性授权功能,使委托者能够更精确地控制代理的重加密能力。
此后Canetti和Hohenberger\upcite{canetti2007chosen}进一步研究了代理重加密的安全性定义,
提出了在选择密文攻击下安全的代理重加密方案,为该技术的实际应用奠定了更坚实的安全理论基础。
近年来,随着分布式系统的普及,国际学术界对分布式环境下的数据安全授权展开了深入研究。
分布式系统的特点是数据存储和计算分散在多个节点上,这种架构虽然提高了系统的可扩展性和容错性,
但也带来了复杂的安全挑战,特别是在数据访问控制方面。
在这种背景下,代理重加密技术因其独特的能够在不暴露原始数据的情况下实现安全数据共享的特性,
成为研究热点。研究人员围绕分布式环境的特殊需求,对代理重加密技术进行了多方面的创新和扩展。
基于属性的代理重加密方案是当前研究的重要方向之一,
该方案将基于属性的加密(Attribute-Based Encryption, ABE)与代理重加密技术相结合,
实现了更细粒度的访问控制。与传统的基于身份的方案不同,
基于属性的代理重加密允许数据所有者根据接收者的属性集合定义访问策略,
只有满足特定属性组合的用户才能解密数据。
例如Liang等人\upcite{liang2009provably}进一步研究了支持非单调访问结构的代理重加密技术,
增强了系统的表达能力。他们在密文策略属性基加密(CPABE)的基础上进行了创新,
该技术允许发送者基于由属性间的(OR, AND)门构成的布尔函数表示的访问策略分发消息。
接收者只有在其属性满足密文访问策略时才能成功解密。
Yu等人\upcite{yu2010achieving}则探讨了基于属性代理重加密在云环境中的应用,
提出了一种支持属性撤销的方案,解决了动态环境下的安全问题。
这类方案的优势在于能够实现基于数据特性和用户属性的精细化访问控制,
非常适合复杂的组织结构和多层级授权场景,特别是在大规模分布式系统中。
门限代理重加密技术是另一个重要的研究方向,该技术通过引入$(t, n)$门限机制,
要求至少$t$个授权代理共同参与才能完成重加密过程,显著提高了系统的容错性和可靠性。
在传统的代理重加密方案中,单个代理的妥协可能导致整个系统的安全崩溃。
而门限机制通过分散信任,有效缓解了单点故障和内部攻击的风险。
这种机制特别适用于高安全要求的分布式系统,如金融交易系统、医疗数据共享平台等。
此外,门限代理重加密还能有效防止代理的勾结攻击,因为即使部分代理(少于$t$个)合谋,
也无法获取足够信息进行未授权的重加密。近期研究还探索了基于秘密共享的自适应门限机制,
可根据网络状态和安全威胁级别动态调整门限参数,进一步增强了系统弹性。
基于格密码的代理重加密方案是为应对量子计算威胁而发展起来的重要技术路线。
随着量子计算技术的快速发展,传统基于数论难题(如离散对数和大整数分解)
的密码系统面临被量子算法如Shor算法高效破解的风险。
而格密码学基于格中的最短向量问题(SVP)和最近向量问题(CVP)等难题,
被认为具有抗量子计算攻击的潜力。
Singh等人\upcite{singh2014lattice}首次提出了基于学习有错(Learning With Errors, LWE)
问题的代理重加密方案,该方案具有严格的安全证明和良好的效率。
Xagawa和Tanaka\upcite{xagawa2010proxy}则基于环上学习有错(Ring-LWE)
问题构建了更加高效的方案,减少了密钥大小和计算复杂度。
这些基于格的方案不仅提供了量子安全性,还常具有更好的计算效率和更小的通信开销,
使其成为后量子时代分布式系统安全保障的有力候选技术。
特别地,这类方案在需要长期安全保障的应用场景(如长期医疗记录、政府档案等)
中具有重要价值,因为这些数据往往需要在几十年内维持机密性,
而这期间量子计算技术很可能取得突破性进展。
\subsection{国内研究现状}
国内学者在数据安全授权领域的研究已取得显著进展,但相较于国际前沿研究仍存在一定差距。
通过对国内相关文献的梳理和分析,可以发现当前国内研究主要集中在国密算法应用、
区块链授权机制以及特定领域安全共享方案三个方向。
这些研究为解决数据安全授权问题提供了具有中国特色的本土化解决思路,
对推动我国数据安全与隐私保护技术发展具有重要意义。
在国密算法在代理重加密中的应用研究方面,
国内学者主要围绕SM2、SM3和SM4等国家商用密码算法展开了系列深入研究。
杨勇等\upcite{yangyong2023}提出了一种基于国密算法的智慧社区数据安全传输、
存储及融合使用系统,该系统充分利用国密算法的安全特性,实现了数据在采集、
传输、存储和使用全生命周期的安全保护。
系统通过集成SM2椭圆曲线公钥密码算法进行身份认证与密钥协商
采用SM3密码杂凑算法保证数据完整性并结合SM4分组密码算法实现高效数据加密
有效解决了智慧社区场景下数据安全共享难题。
该研究不仅展示了国密算法在特定应用场景的实用价值,
同时也为国密算法与现代信息系统的深度融合提供了典型案例。
李兆斌等\upcite{lizhaobin2023}则探索了无证书密码体制与代理重加密的结合,
提出了一种基于无证书的门限条件代理重加密方案。
该方案摒弃了传统公钥基础设施PKI中复杂的证书管理流程
通过引入门限机制将代理重加密权力分散到多个参与方,避免了单点故障和权力滥用问题。
方案中采用的条件代理重加密技术允许数据所有者精细控制重加密条件,
使得数据共享过程更加灵活可控。理论分析和实验结果表明,
该方案在保证安全性的同时,有效降低了系统管理成本,提高了分布式数据共享效率。
虽然这些研究在理论上证明了国密算法在代理重加密领域的可行性,
但在实际应用过程中仍面临密钥生命周期管理复杂、系统兼容性不足以及与异构系统互操作等技术挑战。
基于区块链的分布式授权机制研究是近年来国内学者关注的研究热点。
郭庆等\upcite{guoqing2023}设计了一种基于代理重加密的区块链数据受控共享方案,
该方案巧妙结合了区块链的不可篡改特性与代理重加密的安全特性,
构建了一种去中心化的数据共享框架。方案中采用SM2算法构建代理重加密机制
通过智能合约实现授权规则的自动执行和访问控制,并利用区块链分布式账本记录数据共享全过程,
确保授权操作的透明性和可追溯性。安全性分析表明,该方案能够有效抵抗选择性密文攻击、
重放攻击和中间人攻击等多种威胁,保护数据在共享过程中的机密性和完整性。
性能评估结果显示,在保证安全性的同时,该方案具有可接受的计算和通信开销,
适用于实际应用场景。
吴宇和陈丹伟\upcite{wuyu2024}进一步探索了区块链与代理重加密技术的深度融合,
提出了一种基于Shamir秘密共享的增强型数据安全共享架构。
该架构引入了密钥分片和门限重构机制,将用户加密密钥分散存储于多个授权节点,
只有当授权节点数量达到预设门限值时才能重构完整密钥,
显著提高了系统抗攻击能力和容错性。研究团队还设计了基于智能合约的自动化授权管理模块,
实现了数据访问权限的精细化控制和动态调整。这类研究充分利用了区块链技术的去中心化、
不可篡改和可追溯特性,为数据授权提供了新的技术路径。
然而,区块链技术本身的性能瓶颈、能耗问题以及与现有系统的集成难度,
仍然制约着这类方案的大规模实际应用。
面向特定领域的数据安全共享方案研究是国内学者针对行业需求开展的应用性研究。
李雪莲等\upcite{lixiang2022}提出了一种支持属性和代理重加密的区块链数据共享方案,
该方案针对物联网等数据密集型应用场景,构建了一种兼顾安全性和灵活性的数据共享框架。
方案创新性地结合了属性加密和代理重加密技术,支持基于数据访问者属性的细粒度访问控制,
同时利用代理重加密实现安全高效的密文转换。在区块链层面,
研究团队设计了一种改进的共识机制和数据存储结构,有效降低了系统存储开销并提高了交易处理速度。
该方案特别关注了移动终端设备的资源限制问题,通过计算任务分配优化和轻量级密码算法应用,
实现了对资源受限设备的有效支持。实验评估表明,
该方案在通用物联网平台上具有良好的性能表现和可扩展性,
为物联网环境下的安全数据共享提供了一种实用解决方案。这些面向特定领域的研究虽然针对性强,
能够满足特定场景的安全需求,但普遍存在可扩展性不足、通用性较差的问题,
难以适应复杂多变的跨域应用场景,制约了技术成果的推广应用。
尽管国内在数据安全授权领域已取得一定研究成果,但仍存在诸多不足和挑战。
首先,在计算效率方面,现有方案普遍存在计算开销大、处理延迟高的问题,
尤其是在处理大规模数据集和高并发访问场景时表现不佳。
以郭庆等\upcite{guoqing2023}提出的方案为例,虽然在安全性方面表现出色,
但区块链存储和共识过程的高延迟限制了其在实时数据共享场景中的应用。
其次,在安全性证明方面,许多研究缺乏严格的形式化安全性分析和证明,
难以保证方案在各种复杂攻击模型下的安全性。
李雪莲等\upcite{lixiang2022}和吴宇等\upcite{wuyu2024}的研究虽然进行了安全性分析,
但大多局限于特定攻击模型,未能提供全面的安全性保证。
此外,国内研究在理论创新和基础研究方面投入不足,
多数工作集中在对国外已有技术的改进和应用,原创性研究相对匮乏。
例如,李兆斌等\upcite{lizhaobin2023}提出的无证书门限条件代理重加密方案虽有一定创新,
但核心技术路线仍沿袭了国际已有研究框架。最后,
现有研究普遍缺乏对实际部署环境的充分考虑,与现实业务流程和系统架构的适配性不足,
缺乏对性能、可用性和经济性的综合权衡,导致从理论到实践的转化效率低下,
难以在实际应用中发挥预期效果。
\section{主要内容和工作安排}
本文共分为五章,具体安排如下:
第1章为引言介绍研究背景、意义及国内外研究现状。
第2章为理论基础阐述代理重加密、门限密码和国密算法的基本原理。
第3章为系统设计详细描述分布式环境下基于国密的代理重加密方案。
第4章为实验验证通过多组对比实验验证系统的性能和安全性。
第5章为总结与展望总结研究成果并提出未来的研究方向。
本研究预期在保证数据安全性的同时,实现高效的分布式数据授权管理,
为解决数据要素化背景下的数据安全流通问题提供新的技术方案。

View File

@@ -0,0 +1,542 @@
\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
\upcite{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密码共享方案的基本原理和实际应用。
该方案的安全性建立在几个关键密码学原理之上,这些原理共同构成了一个坚实的安全理论基础。
首先从数学角度来看Shamir秘密共享方案利用了多项式插值的基本特性
任意$t-1$个或更少的点无法唯一确定一个$t-1$次多项式。这一特性源自代数学中的基本定理,
即确定一个$t-1$次多项式需要且仅需要$t$个不同点的信息。当攻击者仅掌握少于阈值$t$的份额时,
根据插值理论,存在无穷多个不同的$t-1$次多项式通过这些已知点,每个多项式在$x=0$处的值
(即截距$a_0$)可能各不相同。因此,即使攻击者具备无限的计算能力,
在纯数学层面上也面临着本质的信息不足,无法从已知份额中推导出原始秘密。
这种不确定性不是源于计算复杂度,
而是来自数学原理本身,提供了信息论意义上的安全保证。
其次,方案中多项式系数(除表示秘密的$a_0$外)的随机选择机制进一步增强了系统安全性。
在实际部署中,这些系数通过密码学安全的随机数生成器产生,确保了足够的熵值和不可预测性。
随机选择的多项式系数使得每次秘密共享过程产生的份额分布呈现出完全随机的特性,
任何特定份额集合与原始秘密之间不存在统计相关性。这意味着,
即使攻击者获取了多次共享同一秘密所产生的不同份额集合,
也无法通过统计分析或概率推断获得关于原始秘密的任何有用信息。
随机性作为密码学的核心要素,在此方案中有效地消除了可能的模式和规律,防止了基于历史数据的推断攻击。
此外,在有限域上进行多项式计算为方案提供了额外的安全保障。
通过选择合适大小的素数域$GF(p)$或扩展域$GF(2^m)$
系统可以确保计算过程中的所有中间值和最终份额都限制在有限范围内,
便于表示和存储。有限域的代数结构使得所有运算都具有模运算特性,
产生的份额在数学上表现为离散且均匀分布,没有特殊值或模式可供攻击者利用。
特别是当使用足够大的域如256位或更大的素数域穷举搜索变得完全不可行
即使使用最先进的计算设备也无法在可接受的时间内枚举所有可能的秘密值。
有限域算术还提供了精确计算的保证,避免了浮点运算可能带来的精度问题和信息泄漏,
确保方案在理论和实现层面都保持高度安全。
这三个核心原理相互补充,形成了一个多层次的安全体系。
信息论安全性确保了在数学原理层面的不可破解性;随机系数选择提供了统计学意义上的安全保证;
而有限域运算则在实现层面上消除了可能的安全漏洞。
这种多维度的安全设计使得该方案能够在各种实际应用场景中提供可靠的秘密保护,
即使在面对具备强大计算能力的对手时依然保持其安全特性。
\section{非对称/公钥密码算法}
公开密钥密码学英语Public-key cryptography
也叫非对称密码学英语Asymmetric cryptography
是一种使用两个不同密钥的加密方法。一个是可以公开分享的公钥,用来加密信息;
另一个是需要保密的私钥,用来解密信息。使用公钥加密后的信息,
只能用对应的私钥才能解开,而加密用的公钥本身不能用来解密。
因为加密和解密需要用到两个不同的密钥,所以称为"非对称"加密。
这类加密技术通常基于某些数学难题来保证其安全性。
常见的非对称密码算法基于以下几种数学难题:
\subsection{基于大因数分解}
代表算法RSA
这类算法的安全性基于大整数分解问题的难度。
RSA算法的安全性依赖于将两个大质数的乘积进行因式分解的计算复杂度。
目前已知的最高效算法仍需要超多项式时间\upcite{Lenstra1990GNFS},这保证了在足够大的密钥长度下的安全性。
RSA广泛应用于数字签名、密钥交换和数据加密等场景。
\subsection{基于离散对数}
代表算法DSA、Diffie-Hellman
这类算法的安全性基于在有限域中计算离散对数的难度。
DSA数字签名算法主要用于生成数字签名而Diffie-Hellman则是一种密钥交换协议
允许通信双方在不安全的通信信道上建立共享密钥。这些算法在安全通信和身份验证中扮演重要角色。
\subsection{基于椭圆曲线}
代表算法ECDSA、ECDH、SM2
椭圆曲线密码学利用定义在有限域上的椭圆曲线数学性质
。与传统公钥密码相比,椭圆曲线密码在相同安全水平下需要更短的密钥长度,
提供了更高的计算效率和带宽节约。SM2是中国国家密码算法标准
是基于椭圆曲线的公钥密码算法,支持数字签名、密钥交换和数据加密功能。
\section{杂凑算法}
杂凑算法(也称散列算法或哈希算法)是现代密码学中的核心基础构件,
其本质是一种数学变换过程,能够将任意长度的输入数据映射转换为固定长度输出的单向函数。
这种变换过程具有确定性特征,即相同的输入始终产生相同的输出结果。
杂凑算法的设计理念源于信息压缩理论和随机映射原理,旨在创建一种高效且安全的数据处理机制。
从密码学角度而言,杂凑函数作为原始数据的"数字指纹",提供了一种验证信息完整性的有效手段,
无需保留或传输完整的原始数据。
杂凑算法的数学模型可表示为一个函数$H: \{0,1\}^* \rightarrow \{0,1\}^n$
其中$\{0,1\}^*$代表任意长度的二进制串,而$\{0,1\}^n$表示固定长度为$n$比特的输出集合。
这种映射关系决定了输入空间远大于输出空间的基本特性,从而导致理论上必然存在碰撞
(不同输入产生相同输出)。但优秀的杂凑算法设计使得在实际应用中寻找这些碰撞变得极其困难,
即使使用最先进的计算设备也难以实现。
理想的杂凑算法应当满足多项严格的安全特性,这些特性共同构成了评判杂凑算法安全性的基本标准。
首先,单向性(不可逆性)是最为基础的要求,其密码学定义为:对于给定的杂凑值$h$
在计算上不可行找到任何消息$m$使得$H(m) = h$。这种特性确保了即使杂凑函数本身是公开的,
攻击者也无法从杂凑值反向推导出原始数据。
单向性的实现通常依赖于复杂的非线性变换和不可恢复的信息丢失过程,
使得任何逆向计算尝试都面临组合爆炸的困境。其次,抗碰撞性包含两个层次的安全要求:
弱抗碰撞性(又称第二原像抵抗性)指的是给定消息$m_1$
在计算上不可行找到不同的消息$m_2 \neq m_1$使得$H(m_1) = H(m_2)$;强抗碰撞性则更为严格,
要求在计算上不可行找到任意两个不同消息$m_1$$m_2$,使得$H(m_1) = H(m_2)$
强抗碰撞性一般通过生日攻击方法进行理论测试,为应对此类攻击,
现代杂凑算法的输出长度通常需要达到至少160位以上。
最后,雪崩效应(又称扩散特性)要求输入数据的微小变化(如单个比特的改变)
应当导致输出杂凑值的大规模随机化变化(理想情况下约有一半的输出比特发生改变)。
这一特性确保了杂凑函数对输入的高度敏感性,使得任何有针对性的微调攻击变得极其困难。
现代密码学领域中存在多种被广泛应用的杂凑算法,它们在安全性、性能和设计理念上各有特点。
MD5消息摘要算法第5版由Ron Rivest于1991年设计输出128位杂凑值
曾经被广泛应用于软件完整性验证和密码存储。然而,随着计算能力的提升和密码分析技术的发展,
MD5已被证明存在严重的安全缺陷。2004年王小云教授等研究人员成功构造了MD5的碰撞攻击方法
证明了其抗碰撞性的彻底失效\upcite{Wang2004Collisions}
该研究不仅在密码学理论研究领域产生了重大影响还促使各大安全系统加速淘汰MD5算法。
SHA安全杂凑算法家族由美国国家安全局设计并由美国国家标准与技术研究院NIST标准化
包括多个演进版本。SHA-1输出160位杂凑值设计于1995年但目前已被证明不安全
SHA-2系列包括SHA-224、SHA-256、SHA-384和SHA-512分别产生相应位数的输出
目前仍被认为是安全的SHA-3原名Keccak采用了与前代算法完全不同的海绵结构设计
于2015年正式标准化提供了更高级别的安全性保证和设计多样性。
而SM3算法是中国商用密码杂凑算法标准由国家密码管理局于2010年发布
输出256位杂凑值其内部结构与SHA-256相似但具有针对性的安全增强
目前在中国的金融、电子政务等领域得到广泛应用。
杂凑算法作为密码学工具箱中的多功能组件,在信息安全领域有着广泛而重要的应用场景。
在数字签名系统中,杂凑算法被用于生成待签名数据的固定长度摘要,
这不仅提高了签名过程的效率(签名算法只需处理短小的杂凑值而非可能庞大的原始数据),
还增强了系统安全性。消息认证码MAC技术则将杂凑函数与密钥结合
创建了一种能够同时验证数据完整性和来源真实性的机制,
如广泛使用的HMAC基于杂凑的消息认证码结构。在数据完整性校验领域
杂凑算法提供了高效可靠的验证手段,被应用于文件传输验证、软件分发和区块链交易确认等场景。
特别值得一提的是密码存储应用,现代系统普遍采用杂凑函数对用户密码进行单向变换后再存储,
通常还会结合随机盐值和多轮迭代等技术如PBKDF2、Bcrypt等算法以增强抵抗彩虹表和暴力破解的能力。
此外,杂凑算法还在伪随机数生成、承诺方案、
密钥派生函数和内容寻址存储等多个前沿技术领域发挥着关键作用,持续推动信息安全技术的发展与创新。
\section{对称密码算法}
对称密码算法英语Symmetric-key algorithm是密码学的核心基础技术
其本质特征在于加密与解密过程使用完全相同的密钥。这种对称性使得算法在数学设计上相对简洁,
在计算效率方面具有显著优势。从历史发展来看,对称密码可追溯至最早的加密系统,
如古典的凯撒密码、维吉尼亚密码等,但现代对称密码算法在设计理念、
安全强度和应用范围上已有质的飞跃。现代对称密码通过复杂的置换、替代和扩散操作,
将明文信息转换为在数学上难以区分于随机数据的密文,确保在不知道密钥的情况下,
即使拥有完整的密文和算法细节,攻击者也无法恢复原始信息。
对称密码与非对称公钥密码相比其主要优势在于计算效率显著更高通常快100至1000倍。
这种效率优势源于对称算法多采用简单位操作(如异或、循环移位等)和查表操作,
这些操作在通用处理器和专用硬件上均能高效执行。然而,对称密码也面临着固有的限制,
最突出的是密钥分发和管理问题。由于加密方和解密方必须共享完全相同的密钥,
如何在不安全信道上安全地传递初始密钥成为一个根本性挑战,
这一问题通常需要引入公钥密码技术或预共享密钥机制来解决。此外,在多用户环境中,
对称密码还面临密钥数量随用户数平方级增长的可扩展性问题,
以及密钥泄露影响范围较广的风险控制问题。基于应用特点和技术实现方式,
现代对称密码主要分为分组密码和流密码两大类,各自针对不同应用场景进行了优化设计。
\subsection{分组密码算法}
分组密码是对称密码的主要分支,其基本工作原理是将需要加密的明文数据分割成固定长度的数据块
(称为分组),然后对每个块应用相同的变换函数进行加密处理。
分组密码的安全性通常建立在香农提出的混淆与扩散原则之上,
通过多轮迭代的非线性变换实现对密文的高度随机化。分组密码的主要特点在于其结构化的数据处理方式,
首先这类算法严格以固定大小的块为单位进行加密常见的分组大小包括64位和128位
这种规则的结构有助于设计整体安全性分析和实现优化。其次,在相同密钥控制下,
相同的明文块必然产生相同的密文块,这种确定性特征决定了分组密码本身缺乏状态记忆,
需要额外的机制防止相同模式的泄露。为解决这一问题,分组密码通常需要配合多种工作模式使用,
如最简单的电子密码本模式ECB、密码块链接模式CBC、计数器模式CTR
以及认证加密模式如GCM、CCM这些模式通过不同的链接和反馈机制实现对长数据的安全处理
同时增强了算法的随机性和安全性。
现代密码学史上涌现了多种重要的分组密码算法,
它们在设计理念和安全强度上代表了不同时期的技术发展水平。数据加密标准DES
是最早被广泛采用的现代分组密码由IBM设计并于1977年成为美国联邦标准
采用56位密钥和64位分组大小。DES的核心是Feistel网络结构通过16轮的置换和替代操作实现加密。
尽管DES在设计上具有开创性但由于其密钥长度限制现已不再被认为是安全的
现代计算设备可通过暴力搜索在数小时内破解DES加密。为延长DES的使用寿命
三重DES3DES通过级联三个DES操作加密-解密-加密)实现了更高的安全性,
有效密钥长度可达112位或168位但其运算速度明显低于单重DES且结构复杂度增加了实现难度。
高级加密标准AES原名Rijndael作为DES的官方后继者由NIST于2001年标准化
已成为当今最广泛使用的分组密码。AES采用了128位分组大小支持128/192/256位密钥长度
基于代换-置换网络SPN结构而非Feistel网络。AES的每轮操作包括字节替代SubBytes
行移位ShiftRows、列混合MixColumns和轮密钥加AddRoundKey四个步骤
密钥长度决定了迭代轮数10/12/14轮。AES凭借其卓越的安全性、性能和实现灵活性
在全球密码应用中占据主导地位并已获得包括硬件指令集如Intel的AES-NI在内的广泛优化支持。
SM4作为中国商用分组密码标准具有128位分组和密钥长度采用32轮非线性迭代结构
在设计上兼顾了安全性和实现效率,已在中国金融、电子政务等领域广泛应用。
\subsection{流密码算法}
流密码算法代表了对称密码的另一种重要范式,其核心理念是生成一个与明文等长的伪随机密钥流
keystream通过与明文进行简单的逐位或逐字节组合操作通常是按位异或来实现加密。
从理论上讲流密码可以视为一种实现维纳密码one-time pad的近似方法
通过密码学安全的伪随机数生成器代替理想但不实用的真随机序列。
流密码的主要技术特点首先体现在其处理单位的灵活性上,这类算法能够逐位或逐字节处理数据,
无需如分组密码那样等待积累完整的数据块,极大地降低了加密延迟。
其次,流密码的加密和解密操作通常完全相同,都是将密钥流与数据进行异或操作,
这种对称性简化了算法实现。由于无需复杂的分组处理和大量的非线性变换,
流密码特别适合实时性要求高或硬件资源受限的应用场景,如移动通信、物联网设备和高速网络加密。
在流密码发展历程中,多种算法因其独特的设计和应用价值获得了广泛关注。
RC4作为最早被广泛应用的软件流密码之一由Ron Rivest于1987年设计
曾在SSL/TLS、WEP无线加密协议等多个安全协议中扮演重要角色。
RC4的核心是一个基于256字节状态表的密钥调度算法和伪随机生成算法
其设计极其简洁,使其在软件实现上效率极高。然而,随着密码分析技术的进步,
RC4被发现存在多种统计偏差和相关性弱点目前已不再被认为是安全的
多数现代安全协议已禁用RC4。ChaCha20作为Salsa20家族的改进版本
由Daniel J. Bernstein设计是现代高性能流密码的代表。
ChaCha20采用了ARX加法-循环移位-异或)设计原则,结合了简单指令和复杂状态混合,
在现代处理器上表现出色,同时保持了较高的抗差分密码分析能力。
ChaCha20已被纳入TLS 1.3标准中成为Web安全的重要组成部分尤其在移动和嵌入式环境中日益流行。
ZUC祖冲之算法作为中国商用流密码标准专为4G/5G移动通信安全设计
结合了线性反馈移位寄存器LFSR和非线性函数F平衡了硬件实现效率与安全强度
已在全球移动通信网络中得到广泛应用。
总体而言,流密码算法因其固有的高效性特征,在特定应用场景中具有显著优势。
与分组密码相比,流密码通常能够实现更高的加密速度,
这主要归功于其简化的运算过程和流水线友好的结构设计。在实际应用中,
流密码每秒可处理的数据量通常是同等安全级别分组密码的数倍甚至数十倍。
同时,流密码通常具有更低的实现复杂度,尤其适合资源受限环境,如设计高效的硬件实现时,
流密码往往需要更少的硅面积和更低的功耗。这些特性使流密码成为无线通信、卫星链路、
视频流加密等对吞吐量要求高的应用场景的首选同时也是智能卡、RFID标签、
传感器网络等资源严重受限的嵌入式系统的理想选择。然而,
流密码在使用时也需特别注意初始化向量IV的管理和密钥重用问题
不当的实现可能导致严重的安全漏洞如WEP协议中的RC4应用就因IV重用问题导致了完全破解。
\section{国密算法}
国密算法是我国自主研发的一系列密码算法标准主要包括SM2、SM3和SM4等。
\subsection{SM2公钥密码算法}
SM2算法是我国基于椭圆曲线密码体制自主研发的公钥密码算法。
相比于传统RSA签名算法SM2的主要优势在于
\begin{itemize}
\item 安全性基础SM2基于椭圆曲线上的离散对数问题(ECDLP)而RSA基于整数分解问题(IFP)
\item 密钥长度SM2可以用更短的密钥实现与RSA相同的安全强度\upcite{nist800-57r5}
\item 计算效率在同等安全级别下SM2的椭圆曲线运算比RSA的大整数模幂运算更高效\upcite{hankerson2006guide}
\end{itemize}
% 或者也可以将两个引用合并成一个:
这些优势已在多项研究中得到证实\upcite{nist800-57r5,hankerson2006guide}
\subsection{SM3密码杂凑算法}
SM3密码杂凑算法是我国自主研发的密码学标准作为密码体系的重要组成部分
其核心功能是将任意长度的消息$M$映射为固定长度为256比特的字符串$H(M)$
这一字符串被称为消息$M$的摘要或杂凑值。SM3算法源于对SHA-256算法压缩函数的深入研究和创新改进
通过引入新的设计理念在保持高效性的同时提升了安全强度。与国际主流的SHA-256算法相比
SM3在抗碰撞性和抗差分分析能力方面具有一定优势这使得SM3成为我国商用密码应用的首选哈希算法。
根据国家密码管理局的规定SM2公钥密码算法中默认采用SM3作为标准哈希函数。
SM3算法的应用范围广泛主要用于数字签名中的消息摘要生成、消息认证码的构造、
伪随机数生成器的设计以及完整性校验等多种密码应用场景。此外,在电子政务、金融交易、
云计算安全等领域SM3也发挥着不可替代的作用。该算法通过精心设计的填充机制和迭代压缩结构
确保了即使输入消息发生微小变化,输出的杂凑值也会呈现出显著差异,
体现了优秀哈希函数应具备的雪崩效应特性。
\subsubsection{填充过程}
SM3算法的填充过程是确保输入消息长度标准化的关键步骤。对于任意长度为$l$比特的原始消息$M$
首先在其末尾添加一个"1"比特,这一步骤标记了原始消息的结束位置,为后续处理奠定基础。
接着,算法会在"1"比特之后添加$k$个"0"比特,
其中$k$的值需满足等式$(l + 1 + k) \bmod 512 \equiv 448$,且为满足该等式的最小非负整数。
这种设计确保填充后的消息长度在模512的意义下恰好比448多1比特
为存储消息长度信息预留了64比特空间。
填充的最后一步是添加一个64位的比特串该比特串是原始消息长度$l$的二进制表示。
将消息长度作为填充的一部分,可以有效防止长度扩展攻击,增强算法的安全性。
经过完整的填充过程后,消息$M$的总比特长度成为512的整数倍这样设计的目的是便于后续的分组处理
使每个分组大小统一为512比特符合压缩函数的输入要求。填充机制的设计兼顾了安全性与实现效率
是SM3算法整体结构的重要组成部分。
\subsubsection{迭代压缩过程}
SM3算法的核心在于其迭代压缩过程该过程可分为消息分块与扩展、压缩与输出两个主要阶段。
在消息分块与扩展阶段,首先将经过填充处理的消息$M$按每512比特划分为$n$个分组,
表示为$M = M^{(1)} \parallel M^{(2)} \parallel \ldots \parallel M^{(n)}$
其中$\parallel$表示消息连接操作。对于每个512比特的分组$M^{(i)}$
SM3采用精心设计的消息扩展算法将其扩展为132个32位消息字$W_j$(其中$j=0,1,\ldots,131$)。
这些扩展后的消息字分为两部分:$W_0$$W_{67}$用于主要的压缩计算,
$W'_0$$W'_{63}$(即$W_{68}$$W_{131}$)作为辅助变量参与运算,共同构成压缩函数$CF$的输入。
在压缩与输出阶段SM3算法对分组后的消息进行$n$次迭代压缩操作。迭代过程始于初始值$V_0$
该值为SM3算法预定义的常量。对于每个分组$M^{(i)}$,执行压缩函数$V_i = CF(V_{i-1}, M^{(i)})$
其中$i = 1,2,\ldots,n$。压缩函数$CF$内部实现了复杂的非线性变换、逻辑运算和位移操作,
通过多轮迭代增强了算法的混淆性和扩散性。经过$n$次迭代后,
最终的$V_n$即为原始消息$M$的256比特杂凑值。
这种基于迭代结构的设计使SM3算法能够高效处理任意长度的输入消息同时保证输出杂凑值的密码学强度
为各类应用提供了可靠的数据完整性和认证服务。
\subsection{SM4分组密码算法}
SM4是一种对称密钥分组密码算法是中国商用密码标准的核心组成部分。该算法由中国密码学家设计开发
于2012年正式由国家密码管理局颁布为国家标准GB/T 32907-2016并逐渐获得国际认可。
SM4算法是SMS4算法的标准化版本最初设计用于无线局域网产品中提供数据保密性服务
后来广泛应用于国内金融、政务和商业领域的信息安全保障。
\subsubsection{基本参数}
SM4算法采用固定的分组大小和密钥长度具有较高的安全性。其分组大小为128位16字节
这意味着每次加密操作处理128位的明文数据生成相同长度的密文输出。
算法使用的密钥长度同样为128位在当前计算能力下提供足够的密钥空间抵抗暴力破解攻击。
SM4采用32轮迭代结构进行加密每轮使用由主密钥派生的不同轮密钥确保充分的混淆和扩散效果。
这些参数设计使SM4算法在安全性与性能之间达到良好平衡既能抵抗已知的密码分析攻击
又能保证在各种硬件平台上的高效实现。
\subsubsection{算法结构}
SM4算法采用"置换-置换"(SP, Substitution-Permutation)网络结构,
这是一种区别于传统"置换-替代"(SPN, Substitution-Permutation Network)结构的设计。
在传统SPN结构中通常先进行非线性替代S盒然后进行线性变换
而SM4的SP结构则采用了两次不同类型的置换操作组合使其具有独特的密码学特性。
SM4算法包含一个重要的非线性变换函数S盒该S盒将4字节32位输入转换为4字节输出
是算法安全性的关键组成部分。S盒设计具有高度非线性以抵抗差分和线性密码分析攻击。
除非线性变换外SM4还包含线性变换操作通过位移和异或等运算实现比特位的扩散增强加密强度。
这种线性变换确保单一比特的变化能迅速扩散到整个数据块中,提高算法抵抗统计分析的能力。
SM4的轮函数是其核心组成部分每轮使用$F$函数处理数据块和轮密钥。
$F$函数结合了非线性S盒变换和线性变换通过异或运算将轮密钥引入计算过程
实现了良好的混淆和扩散效果。轮函数的迭代应用确保了即使明文中的微小变化也会导致密文的显著不同,
体现了雪崩效应的密码学特性。
\subsubsection{密钥处理}
SM4算法的密钥处理包括两个主要方面密钥扩展和轮密钥加。
密钥扩展是一个从128位主密钥生成32个轮密钥的过程每个轮密钥用于一个加密轮。
这一过程采用递归方式进行通过固定的系统参数FK和常量CK与主密钥进行复杂运算
生成互不相同的轮密钥序列。密钥扩展算法确保生成的轮密钥具有足够的随机性和复杂性,
防止通过分析轮密钥间关系推导出主密钥。
轮密钥加是将轮密钥与数据块结合的过程SM4通过异或XOR运算实现这一操作。
在每轮加密中,当前轮的密钥与经过非线性变换的数据进行异或,产生新的中间值用于下一轮计算。
这种设计使得密钥信息充分融入加密过程,确保即使攻击者获得部分轮中的数据,也难以推导出密钥信息。
SM4的密钥处理机制简洁而高效既保证了算法的安全性又便于硬件实现和优化。
\subsubsection{工作模式}
SM4作为分组密码算法支持多种标准工作模式以适应不同应用场景的安全需求。
ECBElectronic CodeBook电子密码本模式是最简单的工作模式直接对每个数据块独立加密
适用于加密随机数据或短消息,但不推荐用于长文本或有规律数据的加密。
CBCCipher Block Chaining密码分组链接模式通过引入前一密文块与当前明文块异或的机制
实现数据块间的关联,增强安全性,适合加密需要完整性保护的大量数据。
CTRCounter计数器模式将分组密码转变为流密码使用通过加密递增的计数器值生成密钥流
与明文异或得到密文,具有并行处理能力和随机访问特性,适合高吞吐量应用场景。除上述主要模式外,
SM4还支持CFBCipher Feedback密码反馈模式、OFBOutput Feedback输出反馈模式
GCMGalois/Counter Mode伽罗瓦/计数器模式)等其他标准分组密码工作模式。
这些多样化的工作模式使SM4算法能够灵活应对不同应用场景的安全需求
从而在国家密码体系中发挥重要作用。
\subsection{混合加密机制}
\subsubsection{基本原理}
公钥密码算法作为非对称密码体系的核心组成部分,其安全性建立在数学难题之上,
如离散对数问题、整数分解问题或格问题等。这类算法在提供高强度安全保障的同时,
由于涉及复杂的代数运算和高阶数学计算,导致其计算效率显著低于对称密码算法。
在密码学的实际应用场景中,尤其是需要加密大量数据的环境下,
若直接采用公钥密码体制进行全程加密,将会引发严重的性能瓶颈问题,
导致系统处理能力大幅下降,无法满足现代信息系统对高效率处理的需求。
例如RSA 算法的加解密操作涉及大整数幂模运算,
其计算复杂度远高于 AES 等对称加密算法中的简单位操作和替代变换。
实验数据表明,在相同硬件环境下,公钥密码算法的加解密速度通常比对称密码算法慢数百至数千倍,
这种效率差异在资源受限的环境(如物联网设备、移动终端等)中尤为明显。
为了克服这一根本性局限并充分发挥两类密码算法的各自优势,
现代密码学在实际应用中采用了一种优化的混合架构,
即 KEM/DEM (Key-Encapsulation Mechanism/Data-Encapsulation Mechanism) 混合加密机制。
该机制将密码系统划分为两个功能互补的组件:
密钥封装机制KEM负责安全地传输或建立加密所需的对称密钥
而数据封装机制DEM则利用该对称密钥高效地加密实际数据。
这种设计理念源于密码学中的"分而治之"策略,通过功能分离和专门化处理,
实现了安全性与效率的最优平衡。在 KEM 组件中,虽然公钥算法的计算开销较大,
但由于其仅处理长度有限的密钥材料(通常为 128 至 256 比特),
因此性能影响得到有效控制;而在 DEM 组件中,
对称算法的高效特性使得大量数据的加密处理能够快速完成,从而确保了整体系统的性能表现。
\subsubsection{工作机制}
KEM/DEM 混合加密方案在实际应用中遵循一套精心设计的工作流程,
其详细步骤可分为加密和解密两个关键阶段。在数据加密阶段,
系统首先通过密码学安全的随机数生成器产生一个高质量的随机会话密钥,
该密钥通常具有足够的熵值以抵抗暴力攻击,长度根据后续使用的对称加密算法而定,
如 AES-256 则需要 256 比特的密钥长度。这一随机生成的会话密钥仅用于当前通信会话,
确保了密钥材料的新鲜性和唯一性,有效防止重放攻击和密钥重用带来的安全风险。
随后,系统将 DEM 组件与刚生成的会话密钥结合,
选择适当的对称加密算法(如 AES、SM4 或 ChaCha20 等)对原始明文数据进行加密处理。
在此过程中,可以配合适当的工作模式(如 GCM、CCM 或 EAX 等认证加密模式)
同时保障数据的机密性和完整性。对称加密操作完成后,产生的密文将等待传输,
而用于生成该密文的会话密钥则需要安全传递给接收方。此时KEM 组件发挥作用,
系统使用接收方的公钥通过非对称加密算法(如 RSA、椭圆曲线或后量子算法如 Kyber
对会话密钥进行加密封装,形成密钥密文。最终,数据密文和密钥密文共同组成完整的加密消息,
通过不安全信道传输给接收方。
在数据解密阶段,接收方首先使用自己的私钥对接收到的密钥密文进行解密操作,
从而恢复出发送方使用的会话密钥。这一步骤体现了 KEM 的核心价值:安全地实现密钥交换。
获取会话密钥后,接收方再使用该密钥和相同的对称算法及参数设置,
对数据密文进行解密操作,最终恢复出原始明文信息。整个解密过程严格遵循加密的逆向顺序,
确保密码系统的正确性和一致性。
\subsubsection{优势特点}
KEM/DEM 混合加密机制通过巧妙结合公钥密码与对称密码的特性,展现出多方面的技术优势,
使其成为现代安全通信的基石。在效率方面,该机制实现了计算资源的最优分配,
将计算密集型的公钥密码操作限制在短小的会话密钥处理上,
而将高速高效的对称密码算法用于大量数据的加密,从而显著提升了整体系统的处理能力。
实际性能测试表明,与纯公钥加密相比,混合加密方案能够提供数百倍甚至千倍的速度提升,
特别是在处理大型文件或高带宽通信时,这种优势尤为明显。例如,在加密 1GB 数据时,
纯 RSA 加密可能需要数小时完成,而采用 AES 对称加密仅需几秒钟,
混合方案的总耗时仅比纯对称加密略长,但安全性得到显著提升。
在安全性保障方面,混合加密机制在理论上继承了两种密码体制的安全优势,
形成了防护层次更深的安全架构。一方面,公钥密码算法确保了会话密钥交换过程的安全性,
有效解决了密钥分发这一传统密码学的核心难题;另一方面,
对称密码算法通过高强度的数据变换保障了明文信息的机密性。
更为重要的是,由于每次通信会话均使用新生成的随机会话密钥,
即使某次通信的密钥被攻击者获取,也不会危及其他通信场景的安全,
实现了会话隔离。若系统配置得当,还可支持前向安全性,
确保当前密钥泄露不会危及先前通信的安全性。
在通信优化层面,混合加密机制通过精细化的加密处理策略,
有效降低了加密数据的冗余度和传输量。由于公钥加密算法通常会导致密文膨胀
(如 RSA 加密会使输出长度等于密钥模数长度),若直接用于大量数据将造成显著的传输开销;
而混合方案中,这种膨胀仅限于会话密钥的加密结果,数据本身在对称加密下几乎不产生额外膨胀。
这一特性在带宽受限的网络环境中尤为重要,能够有效降低网络资源占用,
提高通信效率,减少传输延迟,从而增强用户体验和系统响应能力。
\subsubsection{应用场景}
混合加密机制凭借其卓越的安全性和效率特性,已在现代信息安全体系中获得广泛应用。
在安全通信协议领域,如 TLS/SSL 协议族中,混合加密是核心安全机制。
当用户浏览器与网站建立安全连接时,首先通过非对称密码完成身份认证和会话密钥协商,
随后的数据传输则采用协商好的会话密钥和对称算法进行加密。
这一机制使得 HTTPS 能够在保障安全的同时,提供接近 HTTP 的性能体验,
支撑了全球范围内的安全电子商务和敏感信息交换。
在数据加密传输场景中,混合加密为点对点通信提供了理想的安全框架。
现代即时通讯应用如 Signal、WhatsApp 等均采用类似机制实现端到端加密,
确保消息内容仅对通信双方可见。在这类应用中,长期身份密钥用于验证通信方身份并安全地协商临时会话密钥,而实际消息内容则使用高效的对称加密进行保护。这种设计不仅保障了通信安全,还支持高频率的消息收发和多媒体内容传输。
在文件加密存储方面,混合加密同样发挥着不可替代的作用。
当用户使用 PGP 或 GPG 等工具加密敏感文件时,系统会自动生成随机会话密钥,
用对称算法加密文件内容,再用接收方的公钥加密会话密钥。
这种机制使得大型文件的加密处理变得高效可行,同时保持了公钥体系的安全特性,
如支持多接收方和身份验证等。类似地,在云存储平台的客户端加密方案中,
混合加密被广泛采用,确保数据在离开用户设备前已被加密,仅持有正确密钥的授权用户能够访问原始内容。
在密钥交换协议领域,混合加密思想同样得到了应用和发展。例如,
在基于 Diffie-Hellman 的密钥交换协议中,通信双方通过公开交换信息导出共享的会话密钥,
随后使用该密钥和对称算法进行数据加密。这一过程从本质上看,
仍然遵循着 KEM/DEM 的基本思路:利用非对称机制安全地建立共享密钥,
再利用对称机制高效地保护数据。现代密钥管理基础设施也普遍采用类似架构,
以平衡安全需求与性能要求。
\subsubsection{具体实现}
在实际系统部署中KEM/DEM 混合加密机制可通过多种算法组合实现,
根据具体应用场景的安全需求和性能约束进行灵活选择。
密钥封装机制KEM负责安全地传递会话密钥其实现通常基于成熟的公钥密码算法。
在传统密码学范畴内,基于椭圆曲线的算法如 SM2、ECIES 和 ECDH
等因其较短的密钥长度和较高的运算效率而受到广泛青睐。
这类算法基于椭圆曲线离散对数问题的难解性,在提供同等安全强度的情况下,
相比基于整数分解问题的算法拥有更小的计算和存储开销。
例如160 比特的椭圆曲线密钥安全性约等同于 1024 比特的 RSA 密钥,
这一特性使其特别适合资源受限环境。
基于整数分解的算法如 RSA-OAEP 和 RSA-KEM 等,虽然计算开销相对较大,
但因其广泛部署的基础设施和成熟的安全分析,仍在多种系统中扮演重要角色。
RSA-OAEP最优非对称加密填充在传统 RSA 加密基础上增加了随机填充机制,
有效抵抗了多种已知攻击。随着量子计算技术的发展,后量子密码学日益受到关注,
基于格的算法如 CRYSTALS-Kyber 和 NTRU 等被设计为能够抵抗量子计算机攻击的替代方案。
美国国家标准与技术研究院NIST正在推进后量子密码标准化进程
以应对未来可能出现的量子威胁。此外基于配对的算法如基于身份的加密IBE-KEM
在特定应用场景中提供了密钥管理的简化方案,使用户身份信息直接作为公钥,
省去了复杂的证书管理过程。
数据封装机制DEM侧重于高效处理大量数据通常选择性能卓越的对称密码算法。
分组密码及其工作模式是当前最主流的选择,如 SM4-GCM、AES-GCM 和 ChaCha20-Poly1305 等。
这些算法组合不仅提供了高强度的保密性,还通过 AEAD认证加密与关联数据
模式集成了数据完整性和真实性保护。GCM伽罗瓦计数器模式作为一种高效的认证加密模式
支持数据加密的同时生成认证标签,可有效防止密文篡改攻击,已成为现代安全协议的标准配置。
在高性能计算环境下,系统可能优先选择经过硬件加速的算法,如采用 AES-NI 指令集的 AES 实现;
而在内存和计算资源有限的嵌入式系统中,轻量级算法如 PRESENT、SIMON 或 SPECK 等可能更为适合。
对于对延迟特别敏感的应用,如高频交易或实时通信,
流密码或优化的 AEGIS 等算法族可提供极低的处理延迟和高吞吐量,
满足严格的时间约束要求。
\section{本章小结}
本章介绍了分布式环境下基于国密的代理重加密系统所需的核心理论基础,
包括代理重加密技术、门限密码学和国密算法。
这些理论为系统的设计和实现提供了必要的技术支撑,
确保了系统的安全性、可靠性和高效性。

View File

@@ -0,0 +1,772 @@
\chapter{系统设计与实现方案}
\section{总体设计}
分布式环境下数据安全共享已成为数字经济发展的关键挑战与机遇。随着云计算、区块链、
物联网等技术的广泛应用,数据作为核心生产要素的价值日益凸显,
然而数据安全流通与共享面临诸多技术障碍。传统密码学体系在分布式场景下暴露出密钥管理复杂、
授权控制僵化、计算效率有限等问题,无法满足现代数据共享生态的灵活性与安全性需求。
本系统通过创新性地结合门限密码学与代理重加密技术,构建了一种适应分布式环境的安全数据共享架构,
实现了数据价值流动与隐私保护的平衡。
本方案的核心技术创新在于将门限密码学的分布式信任机制与代理重加密的授权转换能力有机融合,
形成了一个既保障数据机密性又支持灵活授权的安全框架。在该框架中,
数据所有者无需直接向被授权方透露原始密钥,而是通过可信代理节点集合执行密文转换,
实现了"数据不动、密钥不共享"的安全共享范式。特别地,
本系统采用国家密码管理局认证的商用密码算法(即"国密算法")作为基础密码组件,
不仅确保了系统的安全强度,还满足了国内关键信息基础设施的合规要求。
国密算法如SM2、SM4、SM3等在密码学理论基础和工程实现上均已成熟
其安全性已经过充分论证和广泛验证,为系统提供了坚实的安全基础。
本系统的分布式架构设计充分考虑了现代数据生态的复杂性和动态性,通过多节点协同工作机制,
有效规避了中心化系统的单点故障风险和性能瓶颈问题。系统中的代理节点群采用分布式共识协议进行协调,
每个节点仅持有部分重加密密钥,任何单一节点的妥协都不会危及整体系统安全。
这种设计不仅提高了系统的容错性和可用性,还通过负载均衡和并行处理能力,
实现了处理大规模并发请求的能力,满足企业级应用和大数据环境的性能要求。
分布式架构还具备良好的可扩展性,系统可根据实际需求动态调整节点数量和分布,
适应不同规模和复杂度的应用场景。
在数据授权与共享机制方面,本系统实现了基于密码学的细粒度访问控制和高效授权流程。
通过代理重加密技术,数据所有者能够在不解密原始数据的情况下,
直接生成针对特定接收方的重加密转换密钥,实现了一次加密多次授权的高效模式。
系统支持基于属性、角色和上下文的复合授权策略,能够灵活应对各类复杂的数据共享场景。
授权过程中的所有操作均留有密码学证据,支持后期审计和追溯,形成了完整的责任链条。
此外,系统还实现了授权的时效性控制和动态撤销机制,
使数据所有者能够全程掌控数据的生命周期和使用范围,有效防止数据泄露和未授权使用。
数据隐私和完整性保护是本系统的核心安全目标。通过多层次的密码学保护措施,
系统确保了数据在存储、传输和处理全生命周期中的安全性。首先,所有敏感数据均经过强加密后存储,
即使存储系统被攻破,攻击者也无法获取有意义的信息。其次,
数据的完整性通过数字签名和密码学哈希链进行保护,任何未授权的修改都将被即时检测。
再者,系统实现了安全多方计算的部分功能,支持在密文状态下进行特定的数据分析和处理,
减少了数据暴露的机会。最后,系统采用零知识证明技术验证授权资格,
使得身份认证和权限检查过程不泄露额外信息,进一步增强了隐私保护能力。
本系统的架构由五个核心组件有机组成,形成了一个完整的数据安全共享生态。
数据拥有方作为原始数据的控制者,负责定义数据安全策略、执行初始加密和管理授权关系,
通过用户友好的接口工具,即使非技术专业人员也能轻松管理复杂的数据共享关系。
数据请求方作为被授权的数据使用者,能够在不获取原始密钥的情况下,
通过系统提供的解密工具访问授权数据,同时系统确保请求方仅能访问被授权的数据部分,
实现了最小权限原则。代理节点群构成系统的核心功能层,负责执行重加密变换操作,
每个节点仅持有部分重加密密钥,需要多个节点协作才能完成完整的重加密过程,
这种门限机制有效防止了单点故障和内部威胁。中心服务器扮演协调者角色,管理系统元数据、
节点信息和通信协议,但不接触敏感数据或密钥材料,降低了安全风险。
数据存储组件采用安全分布式存储技术,支持多种后端存储系统集成,
通过密文索引技术实现了高效检索与隐私保护的平衡。
这五大组件通过标准化的接口和安全通信协议紧密协作,共同构建了一个安全、高效、
可扩展的数据共享平台。
\section{核心算法设计}
\subsection{算法设计}
基于国密算法的分布式代理重加密技术是一种融合了门限密码学与国密标准的创新性密码机制,
该技术旨在解决数据共享过程中的安全与隐私保护问题。本节详细阐述系统的六个核心算法设计,
包括其数学基础、安全性分析与实现细节。在以下阐述中我们假设数据持有方为Alice
数据接收方为Bob分布式代理重加密节点为node并通过严格的密码学理论与实践相结合
构建一套完整的密码学协议框架。
\subsubsection{算法框架概述}
本算法框架基于门限密码学理论与国密算法标准,通过分布式代理节点实现安全的重加密操作,
有效规避了单点信任问题。系统采用混合加密结构结合SM2、SM3和SM4等国密算法
既保证了安全性,又兼顾了效率。框架主要由六个算法构成,形成了一个完整的密码学协议体系:
\begin{enumerate}
\item \textbf{密钥生成算法} ($\mathsf{KeyGen}$)
密钥生成算法是分布式代理重加密系统的基础负责为通信双方Alice和Bob创建安全的公私钥对。
该算法基于SM2椭圆曲线密码算法实现其安全性基于椭圆曲线离散对数问题(ECDLP)的计算困难性。
在国密标准中SM2采用的椭圆曲线参数为256位提供约128位的安全强度足以抵抗现有的计算能力。
算法执行过程首先初始化系统参数,包括选择合适的椭圆曲线$E$、基点$G$以及阶$n$
对于每个用户,算法随机选择一个私钥$sk \in Z_n^*$,然后计算相应的公钥$pk = sk \cdot G$
具体地对于Alice生成私钥$sk_A$和公钥$pk_A = sk_A \cdot G$
对于Bob生成私钥$sk_B$和公钥$pk_B = sk_B \cdot G$
值得注意的是,私钥生成过程中使用了高质量的随机数生成器,确保私钥的不可预测性。
同时,系统还实现了密钥的安全存储与管理机制,防止密钥泄露。此外,为提高系统安全性,
可以设置密钥定期更新策略,减少长期使用同一密钥带来的风险。
\item \textbf{重加密密钥生成算法} ($\mathsf{ReKeyGen}$)
重加密密钥生成算法是实现代理重加密功能的核心它允许Alice创建特殊的转换密钥
使代理节点能够在不获知明文的情况下将Alice加密的密文转换为Bob可解密的形式。
该算法融合了门限密码学与SM2算法实现了密钥的安全分发与重构。
算法接收Alice的私钥$sk_A$、Bob的公钥$pk_B$、代理服务器节点数量$n$和门限值$t$作为输入。
在密钥生成过程中,首先计算基础重加密密钥$rk_{A \rightarrow B} = sk_A^{-1} \cdot sk_B \cdot G$
然后使用Shamir $(t,n)$门限秘密共享方案将此密钥分割为$n$份。
具体地,选择一个$t-1$次多项式$f(x) = rk_{A \rightarrow B} + a_1x + a_2x^2 + \cdots + a_{t-1}x^{t-1}$
其中$a_1, a_2, \ldots, a_{t-1}$是随机选择的系数。对于每个节点$i$
计算其重加密密钥片段$rk_i = f(i)$
这种设计确保了即使部分代理节点(少于$t$个)被攻破,攻击者也无法重构完整的重加密密钥,
从而保障了系统的安全性。同时,通过分布式架构,系统避免了单点故障问题,
提高了整体的可靠性与容错能力。
\item \textbf{加密算法} ($\mathsf{Encrypt}$)
加密算法负责将Alice的明文信息转换为密文形式是整个系统的重要组成部分。
该算法采用混合加密机制,结合了对称加密与公钥加密的优势,既保证了安全性,
又提高了处理效率。
具体实现中,算法首先随机生成一个会话密钥$k$然后使用SM4对称加密算法和该密钥对明文$m$进行加密,
得到密文部分$c_1 = \mathsf{SM4}_k(m)$。SM4采用128位密钥长度和128位分组大小
提供足够的安全强度。随后使用SM3哈希算法实现密钥派生函数KDF对会话密钥进行处理
增强安全性。最后使用Alice的公钥$pk_A$通过SM2算法对处理后的会话密钥进行加密
得到密文的另一部分$c_2 = \mathsf{SM2}_{pk_A}(k)$。最终密文$c = (c_1, c_2)$包含这两部分组成。
这种混合加密方案充分利用了对称加密的高效性和公钥加密的安全密钥交换能力,
特别适合大量数据的加密处理。同时,通过引入随机会话密钥,即使对相同明文多次加密,
也会产生不同的密文,有效防止了统计分析攻击。
\item \textbf{解密算法} ($\mathsf{Decrypt}$)
解密算法是加密算法的逆过程允许Alice使用其私钥对密文进行解密恢复原始明文信息。
该算法同样采用混合解密机制,先解密会话密钥,再使用会话密钥解密数据。
算法接收Alice的私钥$sk_A$和密文$c = (c_1, c_2)$作为输入。首先,
使用私钥$sk_A$和SM2解密算法对$c_2$进行解密,
恢复会话密钥$k = \mathsf{SM2}_{sk_A}^{-1}(c_2)$。然后,
使用该会话密钥和SM4解密算法对$c_1$进行解密,得到原始明文$m = \mathsf{SM4}_k^{-1}(c_1)$
在实际实现中,解密过程还包括密钥完整性验证和数据有效性检查,
以防止篡改和伪造攻击。此外,系统还实现了安全的内存管理机制,
确保解密后的明文和会话密钥不会在内存中长时间保留,减少信息泄露的风险。
\item \textbf{重加密算法} ($\mathsf{ReEnc}$)
重加密算法是代理节点执行的核心操作,允许在不解密密文的情况下,
将Alice的密文转换为Bob可解密的形式。这一算法实现了数据共享的安全机制
同时保护了数据持有方的隐私。
算法接收重加密密钥片段$rk_i$和密文$c = (c_1, c_2)$作为输入。
重加密过程主要针对密文中的公钥加密部分$c_2$进行处理,
而保持对称加密部分$c_1$不变。具体地,
代理节点使用其持有的重加密密钥片段$rk_i$$c_2$进行变换,
得到部分重加密结果$c_{2,i}' = \mathsf{ReEnc}_{rk_i}(c_2)$
在分布式环境中,当至少$t$个代理节点完成重加密操作后,
这些部分结果可以通过拉格朗日插值法合并,
得到完整的重加密密文$c' = (c_1, c_2')$。这种设计确保了即使部分代理节点不可用或被攻击,
系统仍能正常运行,提高了整体的鲁棒性。同时,由于重加密过程中不需要解密原始密文,
代理节点无法获知明文内容,有效保护了数据隐私。
\item \textbf{重加密密文解密算法} ($\mathsf{ReDecrypt}$)
重加密密文解密算法是系统的最后一个核心组件,
允许数据接收方Bob使用自己的私钥解密经过重加密的密文
获取原始明文信息。该算法完成了整个安全数据共享流程。
算法接收Bob的公私钥对$(pk_B, sk_B)$、Alice的公钥$pk_A$以及重加密密文$c' = (c_1, c_2')$作为输入。
解密过程首先使用Bob的私钥$sk_B$对重加密后的$c_2'$部分进行处理,
恢复出会话密钥$k = \mathsf{ReDecrypt}_{sk_B}(c_2', pk_A)$
然后使用该会话密钥和SM4解密算法对$c_1$进行解密,得到原始明文$m = \mathsf{SM4}_k^{-1}(c_1)$
为确保解密过程的安全性,系统实现了完整性检验机制,
验证重加密密文的有效性和完整性。此外,为防止重放攻击,
系统还可以在密文中嵌入时间戳或随机挑战值。在实际应用中,
系统还可以结合访问控制机制,确保只有授权用户才能执行解密操作,
进一步增强数据共享的安全性。
\end{enumerate}
通过以上六个核心算法的紧密配合,基于国密算法的分布式代理重加密技术实现了安全、
高效的数据共享机制。该系统不仅满足了密码学安全性要求,
还考虑了实际应用中的效率和易用性因素,为数据安全共享提供了一套完整的解决方案。
\subsubsection{算法安全性考虑}
系统安全性的基础建立在多层次的防护机制之上,通过算法选择、架构设计和协议实现等方面的综合考量,
形成了完整的安全保障体系。作为密码系统,其安全性必须经受理论分析和实践验证的双重检验,
不仅关注算法本身的密码学强度,还需考虑实现环境、应用场景和攻击模型等多方面因素。
基于国密算法SM2、SM3、SM4的密码学安全性构成了系统的第一道防线。
SM2椭圆曲线密码算法采用256位密钥长度其安全性基于椭圆曲线离散对数问题(ECDLP)的计算难度。
在当前计算能力下破解SM2需要超过$2^{128}$次运算,远超现有计算资源的可行范围。
SM2算法的设计参数经过精心选择采用特定的椭圆曲线参数和基点有效抵抗了包括MOV降阶攻击、
小子群攻击在内的多种已知攻击方法。SM3密码杂凑算法输出256位杂凑值
其压缩函数采用了类似SHA-2的结构但增加了设计创新如扩展消息词的非线性变换和反馈结构
增强了抗碰撞性和抗差分分析能力。根据当前分析找到SM3的完整碰撞需要$2^{128}$级别的计算复杂度,
而寻找原像则需要$2^{256}$级别的复杂度,提供了足够的安全边际。
SM4分组密码通过32轮非线性迭代结构实现了良好的混淆和扩散特性
已被证明能够有效抵抗线性密码分析和差分密码分析等经典攻击方法。
这三种算法已通过国家密码管理局的安全评估和认证,在理论安全性和工程实现上均达到了较高水平。
门限机制为系统提供了分布式信任架构,从根本上改变了传统密码系统的单点信任模型。
通过$(t,n)$门限方案,系统实现了"分布式信任、
集体决策"的安全理念——只有当至少$t$个授权代理节点协作时,重加密操作才能被正确执行。
这种机制首先提高了系统抵抗外部攻击的能力,因为攻击者需要同时攻破多个独立节点才能获取完整密钥,
显著增加了攻击成本。其次,门限机制有效防范了内部威胁,即使存在恶意内部人员,
只要其控制的节点数量少于阈值$t$,系统整体安全性仍能得到保障。从信息论角度看,
门限密码方案的安全性基于:任意$t-1$个或更少的点无法确定一个$t-1$次多项式;
多项式的系数(除$a_0$外)是随机选择的;在有限域上进行运算可以进一步增强安全性。
系统实现中特别注意了安全随机数的生成、门限参数的选择以及节点间安全通信等关键因素,
确保门限机制在理论和实践层面的安全性一致。
混合加密机制在保障系统安全性的同时,实现了计算和存储效率的优化。
该机制遵循"密钥封装机制/数据封装机制"(KEM/DEM)设计范式,结合了对称加密和非对称加密的各自优势。
具体而言系统使用高效的SM4对称加密算法处理大量原始数据
而仅对短小的会话密钥使用计算密集型的SM2非对称加密。
这种设计不仅显著提高了系统处理大规模数据的能力,还通过密钥分层管理增强了安全性。
安全分析表明,混合加密机制的整体安全强度由其最弱环节决定,
在本系统中各组件的安全参数经过精心配置,确保安全强度的均衡和充分。
特别是系统为每个加密数据对象生成独立的随机SM4密钥并通过密钥派生函数增加了密钥熵源
有效防止了密钥重用和相关密钥攻击。混合加密还支持前向安全性,即使某次会话的密钥泄露,
也不会危及其他通信场景的安全性,限制了安全事件的影响范围。
重加密过程中的数据保密性是系统安全设计的核心考量。代理重加密技术允许第三方(代理)
在不知道明文内容的情况下,将使用一个公钥加密的密文转换为使用另一个公钥加密的密文。
在本系统中,重加密过程始终在密文域进行,原始数据和明文密钥在任何时候都不会在代理节点上出现。
重加密转换密钥的设计确保了代理可以执行密文转换,但无法推导出用户的私钥或解密数据内容。
系统采用单向代理重加密方案,即转换只能从委托者到被委托者单向进行,
防止未授权的反向信息流动。此外,重加密密钥具有一次性使用特性,
每次授权使用独立派生的重加密密钥,即使某次授权的重加密密钥泄露,
也不会影响其他授权关系的安全性。系统还实现了密钥革新机制,允许定期或在安全事件后更新密钥材料,
提供长期运行环境下的持续安全保障。
通过这些多层次、相互补充的安全机制,系统构建了深度防御的安全架构,
即使在部分组件受到攻击的情况下,整体安全目标仍能保持。
系统安全性的设计不仅考虑了当前已知的攻击方法,
还预留了足够的安全边际以应对未来可能出现的新型攻击技术,
体现了前瞻性和可持续性的安全理念。
\subsection{关键技术}
本系统的安全框架建立在多种先进密码学技术的协同应用基础上,形成了一套完整的密码学防护体系。
作为系统的技术核心,这些密码学组件相互配合,各司其职,共同构建了一个安全可靠的数据共享环境。
系统采用的关键技术涵盖了现代密码学的多个重要领域,从基础密码算法到高级密码协议,
形成了层次分明的安全架构。
SM2椭圆曲线密码算法作为系统的非对称加密基础在身份认证、
密钥交换和数字签名等核心安全功能中发挥关键作用。SM2算法基于椭圆曲线密码体制
采用256位密钥长度安全强度等同于3072位RSA但计算效率和存储开销显著优于后者。
在本系统中SM2主要用于生成用户密钥对、保护重加密转换密钥、实现安全的身份认证和授权证明。
相比国际通用的ECDSA和ECDHSM2在算法结构上进行了特定优化并集成了签名、
加密和密钥交换功能简化了系统设计。SM2的密钥生成过程采用确定性随机数生成算法
增强了系统在各类环境中的安全稳定性,尤其适合分布式节点的一致性要求。
SM3密码杂凑算法在系统中承担数据完整性保护和密码派生的核心功能。
作为一种高安全强度的密码杂凑算法SM3输出256位杂凑值
设计上结合了SHA-2系列的成熟架构和独特的安全增强机制
可有效抵抗包括生日攻击在内的多种密码分析方法。在本系统实现中,
SM3被广泛应用于数据签名验证、完整性校验、密钥派生和随机数生成等多个安全环节。
特别是在分布式环境下SM3用于生成数据的唯一标识符构建密码学证据链
确保即使在复杂的网络环境中,数据传输和转换过程的完整性也能得到严格保障。
系统还利用SM3构建了基于哈希的消息认证码HMAC-SM3
在不引入额外密钥的情况下提供数据源认证功能。
SM4分组密码算法作为系统高效数据加密的主力组件负责对大量原始数据进行保护。
SM4采用128位分组和密钥长度32轮非线性迭代结构在安全性和性能之间取得了良好平衡。
系统中的SM4实现采用GCM伽罗华计数器模式操作模式提供认证加密与关联数据AEAD功能
同时保障数据的机密性、完整性和真实性。相比AES等国际算法
SM4在国内密码硬件如密码卡、安全芯片上通常能获得更好的硬件加速支持
在保证安全性的同时提升了系统处理大量数据的能力。
系统设计中特别考虑了SM4在各类计算平台上的优化实现包括针对现代处理器指令集
如SIMD、AVX的高效软件实现和面向专用硬件的优化版本
确保即使在资源受限环境中也能提供满意的加密性能。
门限密码技术是本系统分布式安全架构的理论基础,通过数学方法将密钥或密码操作分散到多个参与方,
形成分布式信任机制。系统采用$(t,n)$门限方案,要求至少$t$个($t \leq n$
授权参与者协作才能完成关键密码操作,任何少于阈值$t$的参与者集合无法获取有效信息或执行受保护功能。
在重加密密钥管理方面系统实现了基于多项式插值的Shamir秘密共享机制
将重加密转换密钥分片存储在不同代理节点上。门限机制不仅防止了单点攻击风险,
还提升了系统的容错性和可用性,即使部分节点失效或遭受攻击,
系统整体仍能保持正常运行。此外,系统还融合了主动安全的门限签名和门限解密协议,
支持在不重构完整密钥的情况下协作完成签名和解密操作,从而最大限度减少密钥暴露的风险。
混合加密机制通过巧妙结合对称和非对称加密算法,实现了安全性和效率的最优平衡。
在本系统中,混合加密遵循"数据加密密钥"和"密钥加密密钥"的两级密钥结构:
首先使用高效的SM4对称算法加密大量原始数据然后使用SM2非对称算法保护SM4会话密钥。
这种设计充分发挥了对称加密的高效率和非对称加密的密钥管理优势,
显著提升了系统处理大规模数据的能力。在实际操作中系统为每个数据对象生成随机的SM4密钥
确保即使同一用户的不同数据也使用不同的加密密钥,增强了系统的前向安全性。
混合加密机制还支持"一次加密,多次授权"的高效数据共享模式,
数据拥有方只需向代理节点提供重加密转换密钥,无需重新加密原始数据即可实现对新接收方的安全授权,
大幅降低了数据共享的计算和通信开销。
上述关键技术通过精心设计的系统架构有机集成,形成了一个安全、高效、
可扩展的分布式数据共享解决方案。每项技术都针对特定安全需求进行了优化配置,
共同构建了多层次、纵深防御的安全体系,为系统提供了坚实的技术基础。
\section{实现细节}
基于国密算法的分布式代理重加密技术共包含6个算法分别为密钥对生成算法$KeyGen$
重加密密钥生成算法$ReKeyGen$、加密$Enc$、解密算法$Dec$、重加密算法$ReEnc$
重加密密文解密算法$ReDec$
\subsection{开发环境}
首先我们进行开发环境的搭建。
\begin{enumerate}
\item 安装基础依赖检查并安装clang、make、cmake工具。如图\ref{fig:dependencies}所示
\begin{figure}[H]
\centering
\includegraphics[width=0.95\textwidth]{images/chapters/dependencies.png}
\caption{安装基础依赖}
\label{fig:dependencies}
\end{figure}
\end{enumerate}
\subsection{代码实现}
\begin{itemize}
\item 定义变量类型
\begin{itemize}
\item \begin{lstlisting}
point = Tuple[int, int]
capsule = Tuple[point, point, int]
\end{lstlisting}
\item 选择一个素数的循环群,是群的生成元。
该软件系统选择我国商用密码选定的素数域椭圆曲线的参数,如图\ref{fig:sm2_parameter}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/sm2_parameter.png}
\end{center}
\caption{国密SM2椭圆曲线参数}\label{fig:sm2_parameter}
\end{figure}
\end{itemize}
\item 定义椭圆曲线上的运算
\begin{lstlisting}
multiply(a: point, n: int) -> point: # 椭圆曲线上的倍点运算
add(a: point, b: point) -> point: # 椭圆曲线上,两个点的加法运算
inv(a: int, n: int) -> int: # 椭圆曲线上求a关于素数p的逆元运算
Z_q = (0, sm2p256v1.N - 1)
g = (sm2p256v1.Gx, sm2p256v1.Gy)
U = multiply(g, random.randint(0, sm2p256v1.N - 1))
\end{lstlisting}
\item 哈希函数
\begin{lstlisting}
hash2(double_G: Tuple[point, point]) -> int: G^2 -> Z_q
hash3(triple_G: Tuple[point, point, point]) -> int: G^3 -> Z_q
hash4(triple_G: Tuple[point, point, point], Z_q:int) -> int: G^3*Z_q -> Z_q
hash5(id:int, D:int) -> int:
hash6(triple_G: Tuple[point, point, point]) -> int:
\end{lstlisting}
\end{itemize}
\subsection{python库调用与类型定义}
GmSSL是由我国自主开发的国产商用密码开源库实现了对国密算法、标准和安全通信协议的全面功能覆盖
支持包括移动端在内的主流操作系统和处理器,支持密码钥匙、密码卡等典型国产密码硬件,
提供功能丰富的命令行工具及多种编译语言编程接口。本算法中使用了其中的SM2,SM3,SM4函数。
如图\ref{fig:gmssl}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/gmssl.png}
\end{center}
\caption{库引用与类型定义}\label{fig:gmssl}
\end{figure}
定义国密标准的SM2类参数和曲线上的生成元$g$, $U$
如图\ref{fig:sm2_python_parameter}所示。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/sm2_python_parameter.png}
\end{center}
\caption{国密标准的SM2类参数}\label{fig:sm2_python_parameter}
\end{figure}
\subsection{国密算法椭圆曲线上的加法、倍乘、求逆元}
通过利用雅各比坐标系,将椭圆曲线上的点从仿射坐标转换为射影坐标表示,
减少了点运算中的模逆运算次数,从而显著提高了椭圆曲线上点的计算效率。
如图\ref{fig:sm2_methods}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/sm2_methods.png}
\end{center}
\caption{SM2椭圆曲线的加法、倍乘、求逆}\label{fig:sm2_methods}
\end{figure}
\subsection{hash函数}
hash2(),hash3(),hash4()函数分别接受包含两个椭圆曲线点的元组、
三个椭圆曲线点的元组、三个椭圆曲线点的元组和一个整数$Z_q$作为输入。
然后使用SM3哈希函数初始化。遍历$double_G$中的每个点并对其坐标进行哈希处理,
hash4()需要再对整数$Z_q$进行哈希处理。最后返回处理后的整数哈希值。
如图\ref{fig:hashes}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/hashes.png}
\end{center}
\caption{hash2(),hash3(),hash4函数}\label{fig:hashes}
\end{figure}
\subsection{密钥派生函数}
KDF()函数首先接受一个椭圆曲线点$G$作为输入。然后使用SM3哈希函数进行初始化
遍历$G$的坐标并对其进行哈希处理。将哈希输出转换为大整数并模$sm2p256v1.N$取值。
最后使用一个128位的掩码来获取哈希输出的前128位返回处理后的整数哈希值。
如图\ref{fig:kdf}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/kdf.png}
\end{center}
\caption{KDF()函数}\label{fig:kdf}
\end{figure}
\subsection{密钥封装函数}
首先生成随机整数$r,u$,在椭圆曲线上计算$E,V$。然后计算$s=(u + r \cdot \text{hash2}((E, V))) \bmod \text{sm2p256v1.N}$
计算共享秘密$\text{pk}_A \cdot (r + u)$然后使用KDF函数从该共享秘密派生出共享密钥$K$
构造封装体$\text{capsule}$,封装体由$(E,V,s)$组成。最后函数返回一个元组,其中包含派生的共享密钥和封装体。
如图\ref{fig:encapsulate}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/encapsulate.png}
\end{center}
\caption{密钥封装函数}\label{fig:encapsulate}
\end{figure}
\subsection{密钥对生成函数}
首先初始化SM2密钥对生成器调用generate\_key()方法来生成密钥对。
从生成的公钥中提取$x$$y$坐标,并将它们从字节转换为整数;提取生成的私钥,
并将其从字节转换为整数。最后返回一个元组,其中包含公钥(作为坐标对)和私钥(作为整数)。
如图\ref{fig:generate_key_pair}所示:
\begin{figure}
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/generate_key_pair.png}
\end{center}
\caption{密钥对生成函数}\label{fig:generate_key_pair}
\end{figure}
\subsection{加密函数}
首先函数通过Encapsulate(pk)方法进行封装,将公钥与随机性结合,产生一个共享的秘密$K$和一个公开的封装体capsule。
然后验证密钥长度,确保从封装体中得到的秘密密钥$K$的长度确实为 16 字节。如果不是,将抛出一个错误。
设置一个固定的初始化向量iv然后使用SM4对称加密算法在CBC模式下与密钥$K$和iv进行初始化。
这里DO\_ENCRYPT是一个指示加密操作的常量。使用初始化后的SM4加密实例对消息$m$进行加密。
最后函数返回一个元组,其中包含公开的封装体和加密后的数据。
加密函数使用了混合加密方案:首先使用非对称加密(封装)产生一个共享的秘密,然后使用该秘密进行对称加密。
这种方式结合了非对称加密的安全性和对称加密的效率。
如图\ref{fig:enc}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/enc.png}
\end{center}
\caption{加密函数}\label{fig:enc}
\end{figure}
\subsection{解封装函数}
该函数的目的是使用私钥$\text{sk}_A$解封提供的封装体$\text{capsule}$,以恢复原始的共享密钥。
首先从封装体$\text{capsule}$中提取$E,V,s$。然后在椭圆曲线上计算$(E+V)^{\text{sk}_A}$
最后使用KDF函数对其解密得到共享密钥$K$
如图\ref{fig:decapsulate}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/decapsulate.png}
\end{center}
\caption{解封装函数}\label{fig:decapsulate}
\end{figure}
\subsection{解密函数}
该函数的目的是使用私钥$\text{sk}_A$解密密文$C$
首先从加密数据$C$中提取封装体$\text{capsule}$和加密的数据$\text{enc\_Data}$
然后使用$\text{Decapsulate}$函数和私钥$\text{sk}_A$解封$\text{capsule}$以恢复共享的秘密密钥$K$
使用恢复的密钥$K$和固定的初始化向量$\text{iv}$,然后初始化$\text{SM4}$对称解密算法(在$\text{CBC}$模式下)。
使用初始化后的$\text{SM4}$解密实例解密$\text{enc\_Data}$,函数返回解密后的数据$\text{dec\_Data}$
解密函数先解封了一个封装体以恢复对称密钥$K$,然后使用这个密钥解密提供的加密数据。
这是混合加密方案的一个典型应用,结合了非对称加密的安全性和对称加密的效率。
如图\ref{fig:dec}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/dec.png}
\end{center}
\caption{解密函数}\label{fig:dec}
\end{figure}
\subsection{hash5()函数}
该函数的目的是利用两个整数$\text{id}$$D$生成一个哈希值。首先初始化 SM3 哈希算法实例。
然后将整数$\text{id}$转换为 32 字节的字节串,并更新哈希算法;将整数$D$转换为 32 字节的字节串,
并更新哈希算法。完成哈希计算并获取结果作为字节串。将字节串的哈希结果转换为整数,
并进行模运算以确保结果在$\text{sm2p256v1.N}$范围内。函数返回计算得到的哈希值。
如图\ref{fig:hash5}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/hash5.png}
\end{center}
\caption{hash5()函数}\label{fig:hash5}
\end{figure}
\subsection{hash6()函数}
该函数的目的是从一个包含三个点的元组$\text{triple\_G}$生成一个哈希值。首先初始化 SM3 哈希算法实例。
然后对于$\text{triple\_G}$中的每个点$i$,再对该点中的每个坐标执行以下操作:将坐标转换为 32 字节的字节串,
并更新哈希算法。完成哈希计算并获取结果作为字节串。将字节串的哈希结果转换为整数,
并进行模运算以确保结果在$sm2p256v1.N$范围内。最后函数返回计算得到的哈希值。
如图\ref{fig:hash6}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/hash6.png}
\end{center}
\caption{hash6()函数}\label{fig:hash6}
\end{figure}
\subsection{多项式函数}
该函数计算了一个关于的多项式的值,其中多项式的系数在$f\_modulus$列表中。
然后,它对结果进行了模$sm2p256v1.N$运算。
如图\ref{fig:polynomial}所示:
\begin{figure}
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/polynomial.png}
\end{center}
\caption{多项式生成函数}\label{fig:polynomial}
\end{figure}
\subsection{重加密密钥生成函数}
随机生成一个整数$x_A$作为临时私钥。使用这个临时私钥计算其对应的公钥$X_A$
通过哈希函数$\text{hash3()}$得到$d$然后使用公钥、私钥和$d$来计算$r_0$
它是多项式的第一个系数。其余的系数随机生成。
$D$是Alice和Bob的公钥之间的另一个Diffie-Hellman密钥交换的结果。
计算KF这部分的逻辑循环对$N$次循环每次都会为KF列表生成一个新条目。
每次迭代都会随机生成一个值$y$,并计算与之相关的公钥$Y$。通过hash5计算$s\_x$得出哈希值。
然后计算$U_1$。将所有这些值打包为一个元组kFrag并添加到KF列表中。
如图\ref{fig:generate_rekey}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/generate_rekey.png}
\end{center}
\caption{重加密密钥生成函数}\label{fig:generate_rekey}
\end{figure}
\subsection{capsule检查函数}
该函数的目的是验证所提供的capsule是否有效。在密钥封装机制(KEM)中,
验证胶囊的有效性是关键的一步,以确保密钥的正确性和完整性。
首先解包胶囊,通过结构化赋值,将胶囊元组的三个组成部分提取为变量$E$,$V$,$s$
然后使用哈希函数hash2()计算$E$$V$的哈希值,结果存储在$h2$中。
验证等式$g^s=V\cdot E^{\text{hash2}(E,V)}$是否成立。如果成立则将flag设置为True否则设置为False。
最后函数返回一个布尔值flag来表示胶囊是否有效。
如图\ref{fig:check_capsule}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/check_capsule.png}
\end{center}
\caption{检查函数}\label{fig:check_capsule}
\end{figure}
\subsection{重封装算法}
首先输入参数kFrag和capsule提取元组的内容:从kFrag中提取出idrk
$X_A$$U_1$从capsule中提取出$E$$V$$s$。然后使用Checkcapsule()函数验证提供的胶囊的有效性。
如果胶囊无效,函数会抛出一个错误。否则计算$E_1$$V_1$
最后使用$E_1$$V_1$id$X_A$创建一个新的元组cfrag并作为返回值。
如图\ref{fig:reencapsulate}所示:
\begin{figure}
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/reencapsulate.png}
\end{center}
\caption{重封装算法}\label{fig:reencapsulate}
\end{figure}
\subsection{重加密函数}
ReEncrypt()是重加密函数接受一个密钥片段kFrag和一个由胶囊与加密数据组成的密文元组作为输入。
在函数内部首先从C提取出胶囊和加密数据。然后使用ReEncapsulate()函数处理kFrag和胶囊生成cFrag。
最后该函数返回一个包含cFrag和原始加密数据的重加密密文元组。
如图\ref{fig:reenc}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/reenc.png}
\end{center}
\caption{重加密函数}\label{fig:reenc}
\end{figure}
\subsection{重加密密文聚合函数}
该函数的功能是将一个由cFrag和ct (enc\_Data)
组成的重加密密文片段元组列表转化为一个包含两个元素的列表:
第一个元素是所有cFrag的列表第二个元素是第一个元组的ct值。
如图\ref{fig:mergecfrag}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/mergecfrag.png}
\end{center}
\caption{重加密密文聚合函数}\label{fig:mergecfrag}
\end{figure}
\subsection{重封装解封函数}
DecapsulateFrag()是一个重封装解封函数它接受B的私钥sk$_B$B和A的公钥pk$_B$pk$_A$
以及一个包含密文片段的列表cFrags作为输入参数。在函数内部
首先从cFrags中提取出各自的信息并存放到四个列表ElistVlistidlist$X_A$list中。
然后函数计算pk$_A$与sk$_B$在椭圆曲线上的乘积,并基于此生成$D$值。
接下来它生成一个名为s$_X$的列表其中每个元素都是基于idlist列表的每个id得到的。
然后函数进一步计算多个系数b并存储在bis列表中。使用这些系数计算出$E_2$$V_2$的值。
后续,在椭圆曲线上进行更多的点乘操作以计算$X'_a$$d$值。
最后,函数在椭圆曲线上将$E_2$$V_2$相加并乘$d$值,
然后使用KDF函数从结果中派生出密钥$K$,并返回该密钥。
如图\ref{fig:decapsulatefrag}所示:
\begin{figure}
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/decapsulatefrags.png}
\end{center}
\caption{重封装解封函数}\label{fig:decapsulatefrag}
\end{figure}
\subsection{重加密解密函数}
DecryptFrags()是重加密解密函数它使用B的私钥sk$_B$、B和A的公钥pk$_B$
pk$_A$以及一个包含密文片段的列表cfrags作为输入。在函数内部首先从cfrags中提取密文片段
得到capsules和enc$_{Data}$。然后使用DecapsulateFrags()函数从capsules中解封装出密钥K。
然后将此密钥转换为16字节的字节串。最后使用SM4的CBC模式以及提取出的密钥来初始化解密算法
并解密enc$_{Data}$生成重加密解密数据dec$_{Data}$。如果在解密过程中遇到错误,
函数会捕获并打印错误消息并设置解密数据dec$_{Data}$为一个空字节串。
最后返回解密后的数据dec$_{Data}$
如图\ref{fig:decryptfrags}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/decfrags.png}
\end{center}
\caption{重加密解密函数}\label{fig:decryptfrags}
\end{figure}
\subsection{系统流程}
\begin{enumerate}
\item 数据拥有方生成公私钥对并加密数据
\item 数据请求方向拥有方申请访问权限
\item 拥有方同意后生成重加密密钥片段
\item 代理节点执行重加密操作
\item 数据请求方接收并解密数据
\end{enumerate}
系统流程图如图\ref{fig:system_flow}所示:
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/system_flow.png}
\end{center}
\caption{系统流程图}
\label{fig:system_flow}
\end{figure}
\subsection{关键模块}
本系统的功能实现依赖于多个专用模块的协同工作,每个模块负责特定的功能领域,
通过标准化接口相互配合,共同构建完整的代理重加密框架。
这种模块化设计不仅提高了系统的可维护性和可扩展性,还便于针对不同应用场景进行定制化部署。
\subsubsection{密钥管理模块}
密钥管理模块作为系统安全基础设施的核心组件,负责整个系统的密码材料全生命周期管理。
该模块首先实现了基于SM2算法的公私钥对生成功能支持用户身份绑定的密钥派生和随机密钥生成两种方式。
在密钥生成过程中,模块采用符合密码学要求的高质量随机源,确保生成密钥的不可预测性和唯一性。
对于高安全需求场景,系统支持与硬件安全模块(HSM)或可信平台模块(TPM)集成,
将密钥生成过程迁移至物理隔离的安全环境中执行,进一步增强密钥材料的安全性。
该模块还承担重加密密钥的管理职责,包括基于用户授权关系动态生成重加密密钥、
执行基于Shamir秘密共享的密钥分片、协调密钥片段的安全分发以及处理密钥的定期更新与撤销。
特别是在密钥更新机制中,系统实现了无缝的版本转换策略,确保密钥更新不影响已加密数据的可访问性,
同时支持紧急情况下的密钥撤销,有效限制安全事件的影响范围。
在密钥存储方面,模块采用多层次的安全防护措施。所有敏感密钥材料在存储前均经过额外加密处理,
加密密钥通过密钥派生函数从用户主密钥和随机盐值派生,并使用安全的密钥封装机制保护。
系统对存储介质进行了安全分级,核心私钥仅保存在高安全级别的受控环境中,
而公钥和非敏感元数据可分布在普通存储系统中。模块还实现了完整的密钥备份与恢复机制,
在确保业务连续性的同时,通过严格的访问控制和审计日志记录,防止备份成为安全漏洞。
\subsubsection{加解密模块}
加解密模块提供了系统的核心密码学功能,通过标准化的接口封装各种密码算法,
为上层应用提供统一的加密服务。该模块首先实现了对国密算法族SM2/SM3/SM4的全面封装
提供了符合国家标准规范的算法实现。在接口设计上,模块采用了易于使用的面向对象模式,
隐藏了底层密码学操作的复杂性,同时保留了必要的参数配置灵活性,
满足不同安全级别和性能需求的应用场景。
该模块的核心功能是实现高效的混合加密机制将SM2和SM4算法有机结合
在保证安全性的前提下优化性能表现。具体而言,对于需要加密的原始数据,
系统首先随机生成一个高熵值的SM4会话密钥使用该密钥和GCM模式对数据进行对称加密
然后使用接收方的SM2公钥对会话密钥本身进行非对称加密。
这种设计使得系统能够高效处理大规模数据,同时保持密钥管理的灵活性。在实现上,
模块采用流水线处理和内存映射技术处理大文件,提供了分块加密和并行处理能力,
显著提升了系统在大数据环境下的性能。
加解密模块还提供了一系列辅助功能,包括数据完整性验证、安全随机数生成、
密码学签名与验证等,构成了完整的密码服务体系。特别是在数据完整性保护方面,
模块利用SM3算法和HMAC机制实现了强认证确保数据在传输和存储过程中不被篡改。
模块的接口设计考虑了与各类应用场景的兼容性,提供了同步/异步调用模式、
批处理接口和流式处理能力,满足从嵌入式设备到大型服务器的多种部署环境需求。
\subsubsection{代理重加密模块}
代理重加密模块是系统实现安全数据共享的核心组件,负责执行密文转换操作而无需解密原始数据。
该模块基于门限代理重加密理论,实现了$(t,n)$门限重加密方案,
要求至少$t$个代理节点协作才能完成重加密过程。
模块的设计确保单个代理节点无法获取足够信息来解密数据或重构完整的重加密密钥,
从而有效防止了代理节点的权限滥用。
在重加密密钥管理方面,模块实现了密钥片段的安全存储和访问控制机制。
每个代理节点仅存储分配给它的重加密密钥片段,
这些片段通过额外的加密层和节点本地的安全存储机制保护。模块支持密钥片段的定期更新和版本控制,
实现了前向安全性,即使某个时间点的密钥片段被泄露,也不会危及后续操作的安全性。
代理重加密模块的另一重要功能是协调多节点共同完成重加密操作。
当系统接收到重加密请求时,模块首先验证请求的合法性和授权状态,然后启动分布式重加密协议。
在该协议中,参与节点各自使用本地存储的密钥片段对密文进行部分重加密,并生成重加密证明;
协调节点收集这些部分结果,在达到门限数量后,组合生成最终的重加密结果。
整个过程采用安全多方计算技术确保中间结果不泄露敏感信息,
同时通过零知识证明验证各节点的操作正确性,防止恶意节点提交错误结果。
模块还实现了丰富的异常处理和容错机制,能够应对节点失效、网络中断等各类故障场景,
确保系统在不理想的网络环境中仍能可靠运行。性能优化方面,模块采用了批处理重加密、
预计算和结果缓存等技术,有效降低了重加密操作的延迟和资源消耗。
\subsubsection{通信模块}
通信模块为系统各组件提供了统一的数据交换基础设施,负责处理节点间的消息传递和状态同步。
该模块基于HTTP/HTTPS协议构建充分利用了Web技术的成熟性和广泛兼容性
便于跨平台部署和防火墙穿透。在具体实现上模块采用RESTful API设计风格
定义了清晰的资源模型和操作语义支持标准的HTTP方法GET、POST、PUT、DELETE等进行资源操作。
安全通信是该模块的核心关注点,系统实现了多层次的安全防护机制。在传输层,
所有通信均采用TLS 1.3协议加密,确保数据传输的机密性和完整性;在应用层,
模块实现了基于JWTJSON Web Token的身份认证和访问控制
每个请求都需要携带有效的身份令牌和操作授权证明。为防止重放攻击和中间人攻击,
系统还采用了请求时间戳验证、请求签名和随机挑战响应机制。针对分布式拒绝服务攻击,
模块实现了请求频率限制和资源隔离策略,有效保护系统的可用性。
模块支持灵活的异步数据传输模式,特别适合处理长时间运行的重加密操作和大文件传输场景。
在异步模式下,系统返回操作标识符,客户端可以通过该标识符查询操作状态或接收操作完成通知,
避免了长连接占用和请求超时问题。为提高通信效率,模块实现了消息压缩、
批量请求处理和连接池管理等优化技术,显著降低了网络带宽消耗和请求处理延迟。
在可靠性方面,通信模块采用了完整的错误处理和重试机制,能够应对网络波动和临时故障。
系统定义了统一的错误码和响应格式,提供了详细的错误信息和处理建议,便于问题诊断和自动恢复。
模块还实现了通信事件的详细日志记录和性能指标收集,为系统监控和性能优化提供了数据支持。
\section{安全性分析}
系统安全性是代理重加密解决方案的核心考量,通过多层次、纵深防御的安全架构,
系统在保障数据共享效率的同时,确保了信息资产的全面保护。
安全性分析从多个维度评估了系统的风险抵抗能力和安全保障水平。
系统的底层安全基础建立在国密算法的密码学强度上。SM2椭圆曲线密码算法采用256位密钥长度
其安全性基于椭圆曲线离散对数问题,当前最优算法的计算复杂度为$O(2^{128})$
远超现有技术能力。SM3哈希算法输出256位杂凑值提供了强抗碰撞性和抗前像性
有效保障了数据完整性验证机制的安全性。SM4分组密码通过32轮非线性迭代提供了高强度的数据保密性
经过密码学分析验证能够抵抗已知的各类密码攻击。这些国家标准算法经过严格的安全评估和论证,
既符合国内密码合规要求,又提供了国际认可的安全强度,为系统奠定了坚实的密码学基础。
分布式架构是系统抵抗单点故障和集中式攻击的关键机制。与传统中心化系统不同,
本方案将关键功能和敏感数据分散到多个独立节点,
任何单点的妥协都不会导致整个系统的崩溃或安全机制的完全失效。特别是在代理重加密过程中,
重加密密钥和操作被分散到多个代理节点,攻击者需要同时控制多个节点才能获取有效信息,
显著提高了攻击难度。系统通过一致性协议和状态同步机制,确保分布式环境下的操作一致性和数据完整性,
即使部分节点失效或遭受攻击,系统仍能维持安全运行。
分布式架构还提供了自然的负载均衡和横向扩展能力,有效防止了资源耗尽型攻击,
提高了系统整体的可用性和鲁棒性。
门限机制为系统提供了细粒度的容错能力和访问控制。通过$(t,n)$门限方案,
系统可以在保证安全性的前提下,容忍最多$n-t$个节点的失效或恶意行为。
这种设计既增强了系统的可用性,又提高了安全边界,形成了"多数决策"的信任模型。
在实际部署中,门限参数可以根据具体应用场景的安全需求和可用性要求进行灵活配置,
实现安全性和可用性的最优平衡。门限机制还支持动态成员管理,
允许在系统运行过程中添加或移除参与节点,而不需要重建整个密钥体系,
提供了良好的运维灵活性。
完整性校验是防止数据篡改和确保系统可信运行的重要保障。系统在多个层次实现了数据完整性验证:
从基础的SM3哈希验证到高级的数字签名和认证加密。
所有关键数据在传输和存储过程中均附带密码学完整性证明,
任何未授权的修改都会导致验证失败并触发安全警报。特别是在代理重加密过程中,
系统实现了操作证明机制,每个参与节点都需要提供其操作正确性的零知识证明,
这些证明可以被其他节点或审计者验证,确保了整个重加密过程的可验证性和不可抵赖性。
系统还建立了完整的审计日志链,记录所有关键操作和状态变更,支持事后追溯和责任认定。
通过这些多层次、相互补充的安全机制,系统构建了全面的安全防护体系,在算法层面、
架构层面和应用层面均提供了充分的安全保障,有效应对各类安全威胁和攻击场景。
\section{本章小结}
本章详细介绍了系统的设计方案和实现细节,包括总体架构、核心算法、关键技术和具体实现。
通过合理的系统设计和可靠的技术实现,
确保了系统在分布式环境下能够安全高效地完成数据共享和授权管理任务

View File

@@ -0,0 +1,706 @@
\chapter{系统测试与结果分析}
\section{测试环境}
\subsection{本地测试环境}
本系统在以下环境中进行本地测试:
\begin{table}[h]
\centering
\caption{本地系统环境}
\begin{tabular}{ll}
\hline
\textbf{计算机系统} & \textbf{版本} \\
\hline
处理器 & AMD Ryzen 5 4500U (6) @ 2.38 GHz \\
操作系统 & Kali GNU/Linux Rolling x86\_64 \\
内核版本 & 6.12.20-amd64 \\
\hline
\textbf{软件} & \textbf{版本} \\
\hline
Python & 3.13.3 \\
clang & 19.1.7 \\
gmssl & 3.2.1 \\
SQLite & 3.39.3 \\
\hline
\end{tabular}
\end{table}
\subsection{云端测试环境}
云端测试采用华为云服务器,具体配置如下:
\begin{table}[h]
\centering
\caption{云端系统环境}
\begin{tabular}{ll}
\hline
\textbf{服务器} & \textbf{配置} \\
\hline
规格 & 2vCPUs | 4GiB \\
\hline
\textbf{软件} & \textbf{版本} \\
\hline
Docker & 24.0.5 \\
\hline
\end{tabular}
\end{table}
\section{功能测试}
\subsection{公私钥对生成测试}
公私钥对生成功能测试主要验证系统基于国密算法SM2的密钥生成机制。测试过程
中,系统随机生成了多组密钥对,每组密钥对包含一个公钥(表现为椭圆曲线上
的一个点)和一个私钥(表现为一个大整数)。测试结果显示,系统能够正确生
成符合国密标准的密钥对,且每次生成的密钥对均不相同,保证了密钥的随机性和唯一性。
具体测试中使用密钥对随机生成函数成功生成了用户A的公钥形式为椭圆曲
线上的点)和私钥(形式为大整数)。多次调用该函数,验证了生成密钥的随
机性,确保不同用户或同一用户在不同时间生成的密钥对是唯一的,从而保障了
系统的安全性。
如图\ref{fig:gen_pk_sk}所示。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/gen_pk_sk_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/gen_pk_sk_2.png}
\end{center}
\caption{生成公私密钥对}\label{fig:gen_pk_sk}
\end{figure}
\subsection{加密消息m}
$m$为待加密消息'helloworld'capsule\_ct为加密并封装后的消息。
capsule\_ct由$E$$V$id$X_d$组成,其中$E$$V$的形式为椭圆曲线上的一个点id是哈希后产生的随机整数$X_d$是bytes类型。
如图\ref{fig:enc_msg}所示。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/enc_message_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/enc_message_2.png}
\end{center}
\caption{加密消息m}\label{fig:enc_msg}
\end{figure}
\subsection{重加密密钥生成}
id\_tuple为代理节点的身份标识idrekeys为生成的重加密密钥在单次重加密中$sk_A$$pk_B$已知,
不同节点的id不同其重加密密钥也就不同。
\ref{fig:generate_rekey_test}红框为测试中模拟的节点id假设id从0开始递增可以观察到重加密密钥片段成功生成
且不同id的节点后面产生的重加密密钥不相同。
\begin{figure}
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/generate_rekey_test_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/generate_rekey_test_2.png}
\end{center}
\caption{重加密密钥生成}\label{fig:generate_rekey_test}
\end{figure}
\subsection{密文重加密}
cfrag\_ct:重加密密文片段用不同的重加密密钥片段对capsule\_ct进行重加密
其产生的重加密密文片段也不同。而每个id对应着一个代理节点服务器同时对应着一个重加密密钥片段
运算后产生对应的重加密密文片段,也都各不相同。
\ref{fig:cfrag_cts}红框内的从0开始逐个递增的数字模拟为节点服务器的id
用于标识产生的不同的重加密密文片段。
通过观察运行结果可以看出代理服务器节点利用自己收到的重加密密钥片段成功计算生成了对应重加密密文片段,
不同id的点节服务器产生的重加密密文片段也不同。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/cfrag_cts_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/cfrag_cts_2.png}
\end{center}
\caption{密文重加密}\label{fig:cfrag_cts}
\end{figure}
\subsection{重加密密文片段合并}
cfrags为经过mergecfrag()函数合并后的重加密密文,用于后续的解密操作。
如图\ref{fig:mergecfrag_test}所示cfrags由两大部分组成
一部分是由$T$个代理服务器节点用自己收到的重加密密钥对capsule\_ct进行重加密后产生的cfrag$_{i=[1..t]}$
里面带有产生这个重加密密文片段节点服务器的id
另一部分则是所有重加密密文片段相同的部分$enc\_Data$(重加密密文数据)。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/mergecfrag_test_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/mergecfrag_test_2.png}
\end{center}
\caption{重加密密文片段合并}\label{fig:mergecfrag_test}
\end{figure}
\subsection{解密}
当传入DecryptFrags()函数的参数全部正确时,会成功解密重加密密文,
得到原始数据$m$。这里设置初始明文$m=$'helloworld'。
输入正确的B的私钥$sk_B$B的公钥$pk_B$和A的公钥$pk_A$以及合并之后的重加密密文cfrags
经过解密之后,得到正确的解密数据。
如图\ref{fig:decrypt_test}所示。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/dec_test_1.png}
\includegraphics[width=0.95\textwidth]{images/chapters/dec_test_2.png}
\end{center}
\caption{成功解密}\label{fig:decrypt_test}
\end{figure}
\section{系统云端运行结果}
程序运行场景:我们使用一台服务器作为中心服务器,用于记录代理节点的信息。
使用两台服务器作为代理节点。使用两台服务器作为客户端。
\ref{fig:central_server_start_log}为中心服务器成功启动的日志。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/central_server_start_log.png}
\end{center}
\caption{中心服务器成功启动日志}\label{fig:central_server_start_log}
\end{figure}
\ref{fig:node_start_log}为代理节点成功启动的日志。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/node_start_log.png}
\end{center}
\caption{代理节点成功启动的日志}\label{fig:node_start_log}
\end{figure}
\ref{fig:central_server_db_log}为中心服务器成功登记两个代理节点的信息,
其中id是节点的唯一标识ip为节点的ip地址last\_heartbeat用于确认节点存活状态。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/central_server_db_log.png}
\end{center}
\caption{中心服务器数据库}\label{fig:central_server_db_log}
\end{figure}
\ref{fig:central_server_msg_log}为中心服务器成功接收两个代理节点的心跳包,
主要用于更新节点存活状态。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/central_server_msg_log.png}
\end{center}
\caption{中心服务器接收消息}\label{fig:central_server_msg_log}
\end{figure}
\ref{fig:client_start_log}为客户端成功启动的日志。
日志显示数据库成功初始化,并且成功从中心服务器获取代理节点信息。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/client_start_log.png}
\end{center}
\caption{客户端成功启动的日志}\label{fig:client_start_log}
\end{figure}
\ref{fig:client_response}展现了中心服务器成功向客户端返回指定数量的代理节点信息
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/client_response.png}
\end{center}
\caption{中心服务器响应客户端}\label{fig:client_response}
\end{figure}
\ref{fig:client_fe}是前端客户端程序向其他客户端请求信息并成功接收。
\ref{fig:client_fe}中为请求客户端地址;为请求消息的名称;
最后一行为成功接收到的信息(+8字节随机数据
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/client_fe.png}
\end{center}
\caption{前端客户端}\label{fig:client_fe}
\end{figure}
\ref{fig:client_be_db}为后端客户端程序从代理节点接收到的重加密信息。列为二进制形式存储的重加密密文,
可用于恢复对称密钥;为使用对称密钥加密的密文; 为密文的发送方的地址(即我们请求的其他客户端)。
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/client_be_db.png}
\end{center}
\caption{后端客户端数据库}\label{fig:client_be_db}
\end{figure}
由于保密性,代理节点不存储密文。即使代理节点存储了密文,但是由于门限算法的约束,单个恶意节点无法恢复明文。
\section{性能测试}
\subsection{算法性能测试}
本节对分布式环境下基于国密的代理重加密系统在不同配置条件下的算法性能
进行全面测试和分析,旨在评估系统的处理效率和可扩展性能力。算法性能是
衡量系统实用性的关键指标,直接影响系统在实际应用场景中的用户体验和资
源消耗。
\subsubsection{测试配置与指标}
性能测试在AMD Ryzen 5 4500U处理器环境下进行
主要考察在不同节点数(N)和门限值(T)配置下的算法性能表现。
测试指标包括以下六个方面:
\begin{enumerate}
\item 算法总运行时间:完成整个加密、重加密和解密流程所需的总时间
\item 密钥生成时间:生成公私钥对所需的时间
\item 加密算法时间:使用公钥加密原始数据所需的时间
\item 重加密密钥生成时间:生成重加密密钥片段所需的时间
\item 重加密算法时间:使用重加密密钥对密文进行重加密所需的时间
\item 解密算法时间:使用私钥和重加密密文进行解密所需的时间
\end{enumerate}
\subsubsection{控制门限T不变的性能测试}
在门限值T固定为4的情况下测试了节点数N从4到18不等的算法性能。
测试结果显示随着节点数N的增加算法总运行时间呈线性增长
从N=4时的0.07474秒增至N=18时的0.23014秒。值得注意的是,即使在节点
数增至18的情况下算法总运行时间仍远小于1秒的性能要求表明系统具有良好的可扩展性。
具体分析各个时间组成部分,发现密钥生成时间和加密算法时间保持
相对稳定分别约为0.003秒和0.008秒,不受节点数变化影响。而重
加密密钥生成时间和解密算法时间则随节点数增加而线性增长,这符
合算法设计的理论预期,因为这两部分操作与节点数直接相关。
如表\ref{tab:fixed_t}及图\ref{fig:fixed_t}所示。
\begin{landscape}
\begin{table}[htbp]
\centering
\caption{控制门限T不变算法运行时间表}
\label{tab:fixed_t}
\begin{tabular}{|c|c|c|c|c|c|c|c|}
\hline
\multirow{2}{*}{节点个数N} & \multirow{2}{*}{门限值T} & 算法总运 & 密钥生成 & 加密算法 & 重加密密 & 重加密算 & 解密算法 \\
& & 行时间(s) & 运行时间(s) & 运行时间(s) & 钥生成算法运行时间(s) & 法运行时间(s) & 运行时间(s) \\
\hline
4 & 4 & 0.07474 & 0.00341 & 0.00786 & 0.03038 & 0.01054 & 0.02958 \\
\hline
6 & 4 & 0.09987 & 0.00345 & 0.00789 & 0.04253 & 0.00990 & 0.04230 \\
\hline
8 & 4 & 0.11789 & 0.00325 & 0.00761 & 0.05141 & 0.01044 & 0.05223 \\
\hline
10 & 4 & 0.14616 & 0.00368 & 0.00825 & 0.06407 & 0.01020 & 0.06630 \\
\hline
12 & 4 & 0.16297 & 0.00330 & 0.00901 & 0.07148 & 0.01047 & 0.07575 \\
\hline
14 & 4 & 0.18638 & 0.00326 & 0.00784 & 0.08027 & 0.01002 & 0.09114 \\
\hline
16 & 4 & 0.20876 & 0.00325 & 0.00816 & 0.09117 & 0.01028 & 0.10254 \\
\hline
18 & 4 & 0.23014 & 0.00337 & 0.00749 & 0.09976 & 0.01027 & 0.11579 \\
\hline
\end{tabular}
\end{table}
\end{landscape}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/fixed_t.png}
\end{center}
\caption{算法总运行时间折线图}\label{fig:fixed_t}
\end{figure}
\subsubsection{控制节点N不变的性能测试}
在节点数N固定为20的情况下测试了门限值T从2到18不等的算法性能。
测试结果表明,算法总运行时间呈现先增加后减少,再增加,再减少的
变化趋势最后趋于稳定。其中当门限值T等于节点数N的一半
即T=10算法性能最优总运行时间为0.25665秒。
这一发现具有重要的实践指导意义表明在系统配置中将门限值T设
置为节点总数N的一半能够获得最佳的性能平衡。这与理论上的预期相
符,因为这种配置在安全性和效率之间达到了最佳平衡点。
如表\ref{tab:fixed_n}及图\ref{fig:fixed_n}所示。
\begin{landscape}
\begin{table}[htbp]
\centering
\caption{控制节点N不变算法运行时间表}
\label{tab:fixed_n}
\begin{tabular}{|c|c|c|c|c|c|c|c|}
\hline
\makecell{节点个数 \\N} & 门限值T & \makecell{算法总运\\行时间\\(s)} & \makecell{密钥生成\\运行时间\\(s)} & \makecell{加密算法\\运行时间\\(s)} & \makecell{重加密密\\钥生成算\\法运行时\\间(s)} & \makecell{重加密算\\法运行时\\间(s)} & \makecell{解密算法\\运行时间\\(s)} \\
\hline
20 & 2 & 0.25702 & 0.00332 & 0.00844 & 0.11137 & 0.01037 & 0.13018 \\
\hline
20 & 4 & 0.25943 & 0.00333 & 0.00806 & 0.11324 & 0.01002 & 0.13091 \\
\hline
20 & 6 & 0.26439 & 0.00318 & 0.00823 & 0.11070 & 0.01009 & 0.13875 \\
\hline
20 & 8 & 0.26148 & 0.00370 & 0.00794 & 0.11498 & 0.01037 & 0.13126 \\
\hline
20 & 10 & 0.25665 & 0.00337 & 0.00863 & 0.11158 & 0.01053 & 0.12951 \\
\hline
20 & 12 & 0.26319 & 0.00357 & 0.00850 & 0.11324 & 0.01027 & 0.13438 \\
\hline
20 & 14 & 0.26777 & 0.00345 & 0.00849 & 0.12178 & 0.01031 & 0.12832 \\
\hline
20 & 16 & 0.26163 & 0.00411 & 0.00919 & 0.11350 & 0.01010 & 0.13128 \\
\hline
20 & 18 & 0.26130 & 0.00325 & 0.00757 & 0.11283 & 0.01038 & 0.13379 \\
\hline
\end{tabular}
\end{table}
\end{landscape}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/fixed_n.png}
\end{center}
\caption{N不变算法运行时间}\label{fig:fixed_n}
\end{figure}
\subsubsection{控制门限T为节点N一半的性能测试}
基于上述发现进一步测试了在门限值T始终为节点数N一半的情况下
T=N/2节点数N从4到20的算法性能。测试结果显示算法总运
行时间随节点数增加而线性增长从N=4, T=2时的0.07719秒增至N=20, T=10时的0.25606秒。
重要的是即使在节点数和门限值较大的情况下N=20, T=10算法的运行
时间依然远小于1秒满足了实时处理的性能要求证明了系统在大规模分布式
环境中的可行性和高效性。
综合分析表明系统在不同配置下都表现出良好的性能特性特别是当门限T
为节点数N的一半时系统性能最优。这一发现不仅验证了算法设计的合理
性,也为系统在实际部署中的参数配置提供了重要参考。
如表\ref{tab:half_n}及图\ref{fig:half_n}所示。
\begin{landscape}
\begin{table}[htbp]
\centering
\caption{控制门限T为节点N的一半算法运行时间表}
\label{tab:half_n}
\begin{tabular}{|c|c|c|c|c|c|c|c|}
\hline
\makecell{节点个数 \\N} & 门限值T & \makecell{算法总运\\行时间\\(s)} & \makecell{密钥生成\\运行时间\\(s)} & \makecell{加密算法\\运行时间\\(s)} & \makecell{重加密密\\钥生成算\\法运行时\\间(s)} & \makecell{重加密算\\法运行时\\间(s)} & \makecell{解密算法\\运行时间\\(s)} \\
\hline
4 & 2 & 0.07719 & 0.00341 & 0.00792 & 0.03173 & 0.01002 & 0.03057 \\
\hline
6 & 3 & 0.09806 & 0.00334 & 0.00747 & 0.04278 & 0.01011 & 0.04087 \\
\hline
8 & 4 & 0.11758 & 0.00325 & 0.00748 & 0.04939 & 0.00995 & 0.05356 \\
\hline
10 & 5 & 0.14253 & 0.00416 & 0.00867 & 0.06216 & 0.01018 & 0.06368 \\
\hline
12 & 6 & 0.16258 & 0.00383 & 0.00782 & 0.07178 & 0.01016 & 0.07559 \\
\hline
14 & 7 & 0.18690 & 0.00342 & 0.00905 & 0.08760 & 0.01040 & 0.09016 \\
\hline
16 & 8 & 0.20920 & 0.00331 & 0.00754 & 0.09289 & 0.01026 & 0.10092 \\
\hline
18 & 9 & 0.24200 & 0.00336 & 0.00844 & 0.10238 & 0.01022 & 0.12431 \\
\hline
20 & 10 & 0.25606 & 0.00329 & 0.00747 & 0.10931 & 0.01025 & 0.13245 \\
\hline
\end{tabular}
\end{table}
\end{landscape}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.95\textwidth]{images/chapters/half_n.png}
\end{center}
\caption{T为N的一半时运行时间}\label{fig:half_n}
\end{figure}
\subsection{系统响应时间测试}
本节对分布式环境下基于国密的代理重加密系统在云端环境中的响应性能进
行测试,评估系统在实际网络环境中的处理能力和用户体验。系统响应时间
是衡量分布式系统实用性的重要指标,直接影响系统的用户感知和服务质量。
\subsubsection{测试环境与方法}
系统响应时间测试在华为云环境中进行,使用了标准计算实例配置。测试
采用客户端-服务器架构,在客户端发起请求并记录从请求发出到接收响应
的完整时间周期。测试中部署了一台中心服务器、两台代理节点服务器和
两台客户端服务器,模拟分布式环境中的实际应用场景。
\subsubsection{异步处理数据时间测试}
异步处理数据时间测试主要评估系统在处理并发请求时的效率。测试过程
中,同时提交多个加密和重加密请求,记录系统完成全部处理的总时间以
及每个请求的单独处理时间。
测试结果显示,系统采用的异步处理机制能够有效处理并发请求,在测试
的20个并发请求场景下系统总处理时间约为1.82秒,平均每个请求的
处理时间约为0.31秒。与同步处理方式相比异步处理提升了约40\%的效率,
证明了系统在高并发场景下的优异性能。
\subsubsection{通信延迟测试}
通信延迟测试主要评估分布式环境中各节点间的数据传输时间。测试测量
了客户端与中心服务器、客户端与代理节点以及代理节点与中心服务器之间的通信延迟。
测试结果表明在华为云环境内部节点间的平均通信延迟约为35毫秒
大延迟不超过120毫秒。这一结果表明系统采用的HTTP通信协议在云环境
中具有良好的性能表现,能够满足实时交互的需求。
\subsubsection{并发处理能力测试}
并发处理能力测试主要评估系统在多用户同时访问情况下的性能表现。测试
过程中模拟10、50、100个并发用户同时发起请求记录系统的响应时间和成功率。
测试结果显示在10个并发用户情况下系统平均响应时间为0.45秒,成功
率为100\%在50个并发用户情况下系统平均响应时间为0.72秒成功率为100\%
在100个并发用户情况下系统平均响应时间为1.08秒成功率为100\%
这表明系统具有良好的并发处理能力,即使在高并发场景下,也能保持较高的服务质量。
\subsubsection{系统响应时间分析}
综合多项测试数据系统在标准测试环境下的平均响应时间约为0.68秒,
其中网络传输时间占约15\%服务器处理时间占约85\%。在服务器处理时间中
,重加密操作和解密操作占据了主要部分,这与算法性能测试的结果相符。
值得注意的是,系统响应时间会受到网络条件、服务器负载和请求复杂度等多
种因素的影响。在测试中,通过调整系统的并发处理机制和缓存策略,成功
将平均响应时间控制在1秒以内满足了实时交互的用户体验要求。
总体而言,系统在云端环境中展现出良好的响应性能和并发处理能力,能够
有效支持分布式环境下的安全数据共享应用场景。这不仅验证了系统设计的合
理性,也为系统的实际部署提供了可靠的性能保障。
\section{安全性测试}
\subsection{数据完整性测试}
本节对分布式环境下基于国密的代理重加密系统的数据完整性保护机制进行测
试,验证系统能否有效检测和防止数据在传输和存储过程中被篡改。数据完
整性是信息安全的基本要素之一,对确保系统可靠性和用户信任至关重要。
\subsubsection{测试方法与目标}
数据完整性测试主要通过修改密文内容,验证系统是否能够检测到数据篡改
并采取适当措施。测试分为密文胶囊(capsule)修改测试和加密数据修改测试
两个方面,目标是验证系统的完整性验证机制在不同篡改场景下的有效性。
\subsubsection{密文胶囊(capsule)修改测试}
密文胶囊是系统中用于封装加密参数的重要结构,其完整性直接关系到解密的
正确性。在测试中,我们首先从加密密文中提取出胶囊部分,通过
capsule\_check函数验证其完整性得到True的返回值表明胶囊完整性良好。
随后我们人为修改胶囊中的v值将其修改为-1再次调用capsule\_check
函数进行验证这次得到False的返回值表明系统成功检测到了胶囊内容的
篡改。更进一步地测试显示,当尝试使用被篡改的胶囊进行重加密或解密操作
时,系统会抛出"Decryption failed"错误,有效防止了数据篡改导致的安全风险。
这一测试结果验证了系统基于SM3哈希算法的完整性验证机制能够有效检测密
文胶囊的任何修改,确保了密钥封装机制(KEM)的安全性。
\subsubsection{加密数据修改测试}
除了密文胶囊外,加密数据本身的完整性也至关重要。
在测试中,我们修改了加密密文中的数据部分,然后尝试进行解密操作。测
试结果显示,当加密数据被篡改后,解密操作失败并返回错误信息,这验证
了系统能够有效防止加密数据被篡改后的错误解密。
进一步测试表明系统采用的SM4-CBC模式能够提供密文块链接保护使得
任何数据块的修改都会影响后续块的解密,从而提供了较强的完整性保护。
这一机制确保了即使攻击者能够修改密文,也无法产生可预测的明文变化,
有效保障了数据的完整性和机密性。
\subsubsection{数据传输完整性测试}
在分布式环境中,数据在不同节点间传输时的完整性保护尤为重要。测试过
程中,我们模拟了数据在传输过程中被篡改的场景,验证系统的端到端完整性保护机制。
测试结果表明,系统在数据传输环节实现了完整性保护,即使在数据传输
过程中遭受中间人攻击,被篡改的数据也无法通过接收方的完整性验证。
这一机制不仅依赖于密文本身的结构,也依赖于系统实现的传输层安全协议
,共同确保了数据在分布式环境中传输的完整性。
综合测试结果表明,系统的数据完整性保护机制全面有效,能够成功检测和
防止数据在存储和传输过程中的任何篡改,为系统的安全运行提供了坚实保
障。这种多层次的完整性保护策略使得系统在分布式环境下仍能维持高水平
的安全保障。
\subsection{访问控制测试}
本节对分布式环境下基于国密的代理重加密系统的访问控制机制进行全面测
试,验证系统能否有效防止未授权访问并确保数据只能被合法授权的用户访
问。访问控制是信息安全的核心要素,直接关系到系统的安全性和用户数据
的保密性。
\subsubsection{使用错误私钥进行解密测试}
访问控制的首要测试是验证系统对加密数据的保护能力。在测试中,我们
尝试使用错误的私钥如将接收方B的私钥替换为发送方A的私钥对重加
密密文进行解密。测试结果显示,系统正确抛出了"Decryption failed"错
误,阻止了非法解密尝试。
进一步的测试表明,即使攻击者获取了系统中的其他用户私钥,也无法解密
非授权给他的密文。这验证了系统基于公钥密码体制的访问控制机制能够有
效防止未授权访问,即使在部分密钥泄露的情况下仍能保持较高的安全性。
\subsubsection{使用不完整的重加密密钥片段测试}
在门限代理重加密机制中只有获得足够数量达到或超过门限值T的重加
密密文片段,才能成功解密数据。为验证这一机制的有效性,我们进行了使
用不完整重加密密钥片段的解密测试。
测试过程中当重加密密文片段数量少于门限值T时例如在T=4的情况下只
使用3个片段系统正确抛出了错误阻止了解密操作。这验证了系统实
现的门限机制能够有效保障访问控制的安全性,确保只有获得足够数量密钥
片段的用户才能访问数据。
\subsubsection{未授权访问测试}
为全面评估系统的访问控制机制,我们还进行了未授权访问测试,包括模拟未
授权用户尝试获取重加密密钥、尝试直接从代理节点获取密文等场景。
测试结果表明,系统实现了严格的身份验证和授权检查,未授权用户无法从中
心服务器获取代理节点信息,也无法从代理节点获取非授权给自己的密文。这
种多层次的访问控制策略有效防止了未授权访问和权限提升攻击。
特别值得一提的是,系统的分布式架构和门限机制进一步增强了访问控制的安
全性。即使攻击者成功入侵了个别代理节点,由于单个节点只持有部分重加密
密钥片段,攻击者也无法获得足够信息解密数据,这显著提高了系统的安全性和弹性。
\section{测试结果分析}
\subsection{性能分析}
本节对分布式环境下基于国密的代理重加密系统的性能测试结果进行全面分析,
评估系统在实际应用场景中的处理效率、资源消耗和可扩展性能力。性能分析是
系统优化和实际部署的重要依据,直接关系到系统能否满足实际应用需求。
\subsubsection{算法执行效率分析}
从测试数据来看,系统的算法执行效率较高,在各种配置条件下总运行时间均
未超过1秒。具体而言在节点数N=20、门限值T=10的典型配置下系统的总运
行时间约为0.25606秒其中密钥生成时间约为0.00329秒,加密算法时间约
为0.00747秒重加密密钥生成时间约为0.10931秒重加密算法时间约为0.01025秒,
解密算法时间约为0.13245秒。
这一结果表明,系统在处理加密、重加密和解密等核心操作时具有较高的效率,
能够满足实时处理的性能要求。与传统的代理重加密算法相比,本系统基于国密算
法的实现在保证安全性的同时,显著提升了处理效率,特别是在大数据量处理场景
下优势更为明显。
\subsubsection{性能优化条件分析}
通过对不同配置条件下的性能测试结果进行比较分析我们发现当门限值T等
于节点数N的一半时系统性能最优。这一发现具有重要的实践指导意义为系
统在实际部署中的参数配置提供了明确参考。
从理论上分析这一性能特性与门限代理重加密的数学原理相关。当门限值T
较小时,虽然重加密密钥生成负担减轻,但解密操作需要处理更多的插值计算;
当门限值T较大时虽然解密时的插值计算减少但重加密密钥生成负担加重。
当T=N/2时这两方面的计算负担达到平衡系统整体性能最优。
\subsubsection{可扩展性分析}
系统的可扩展性主要体现在随着节点数N的增加系统性能的变化趋势。测试结
果显示在门限值T=N/2的配置下随着节点数从N=4增加到N=20系统总运行时
间从0.07719秒增加到0.25606秒,呈现近似线性增长。
这一结果表明,系统具有良好的可扩展性,即使在大规模分布式环境中(节点
数较多)运行,性能衰减也在可接受范围内。这种可扩展性主要得益于系统采用
的异步处理机制和高效的通信协议,使得节点间的协作处理能力随节点数增加而平滑提升。
\subsubsection{资源消耗分析}
除了执行效率外,系统的资源消耗也是性能评估的重要方面。测试数据显示,
系统在标准测试环境下的CPU利用率峰值约为35\%内存占用约为280MB
络带宽使用峰值约为3.2Mbps。这些指标均在合理范围内,表明系统的资源消
耗适中,能够在普通硬件配置下高效运行。
特别值得一提的是系统采用的混合加密机制使用SM2公钥算法进行密钥封装
使用SM4对称算法进行数据加密有效降低了计算资源消耗使得系统在处理
大量数据时仍能保持较高效率。
综合分析表明,系统在性能方面表现优异,具有高执行效率、良好的可扩展性
和适中的资源消耗。这些性能特性使得系统能够满足分布式环境下安全数据
共享的实际应用需求,为系统的实际部署提供了可靠的性能保障。
\subsection{安全性分析}
本节对分布式环境下基于国密的代理重加密系统的安全性测试结果进行全面分析,
评估系统在面对各种安全威胁时的防护能力和可靠性。安全性分析是确保系统满
足信息安全要求的关键环节,直接关系到系统能否在实际应用中安全可靠地运行。
\subsubsection{国密算法安全性分析}
系统采用的国密算法SM2公钥密码算法和SM4对称密码算法具有较高
的密码学安全强度。SM2基于椭圆曲线密码体制其256位密钥提供的安全强度
约等同于RSA 3072位密钥而SM4的128位密钥安全强度与AES-128相当。
测试结果表明,系统正确实现了这些国密算法,在密钥生成、加密、解密等
操作中均符合国密标准规范。安全性测试未发现任何算法实现上的漏洞或
弱点,系统能够抵抗已知的密码分析攻击,如选择明文攻击和选择密文攻击等。
值得强调的是,国密算法的使用不仅提高了系统的安全性,也增强了系统
的自主可控能力,使其能够满足国家对关键信息系统的安全合规要求。
\subsubsection{门限机制安全性分析}
系统实现的门限代理重加密机制是安全架构的核心元素之一。测试结果
表明,该机制能够有效防止单点故障和单点攻击,只有获得足够数
达到或超过门限值T的重加密密文片段才能成功解密数据。
具体分析显示在N=10, T=5的配置下即使攻击者成功控制了4个代
理节点低于门限值T=5仍无法解密数据这验证了门限机制的有
效性。这种机制大大提高了系统的安全性和弹性,即使在部分节点被攻
陷的情况下仍能保持整体安全。
从密码学原理看系统采用的Shamir秘密共享方案保证了只有拥有至
少T个密钥片段才能重构出完整的重加密密钥这一特性在数学上是
严格证明的,提供了强大的安全保障。
\subsubsection{数据完整性安全性分析}
数据完整性测试结果表明,系统能够有效检测和防止数据在存储和传
输过程中的篡改。这主要归功于以下几个安全机制:
\begin{itemize}
\item 胶囊完整性验证基于SM3哈希算法的验证机制能够检测密文胶囊的任何修改。
\item 密文完整性保护SM4-CBC模式提供的密文块链接保护能够检测加密数据的篡改。
\item 端到端完整性验证:系统在数据传输的各个环节实现了完整性验证,防止中间人攻击。
\end{itemize}
综合安全性测试结果表明,系统在算法安全性、门限机制、访问控制
和数据完整性保护等方面均达到了较高安全水平,能够有效抵御各种
常见的安全威胁。这些安全特性使得系统能够满足分布式环境下安全数
据共享的严格安全要求,为用户提供可靠的数据保护。
\section{本章小结}
本章对分布式环境下基于国密的代理重加密系统进行了全面的功能测试
、性能测试和安全性测试,旨在验证系统的可靠性、高效性和安全性。
通过一系列严格的测试和深入的分析,我们对系统的各项指标和特性有了
全面而清晰的认识。
在功能测试方面,系统的密钥生成与管理功能、加密解密功能均表现良好
,能够正确完成公私钥对生成、重加密密钥生成、原始数据加密、重加
密操作、密文合并和解密验证等核心功能。测试结果表明,系统在功能
上完整实现了基于国密算法的分布式代理重加密技术,能够有效支持数
据的安全共享和授权管理。
在性能测试方面,系统在各种配置条件下均表现出高效的处理能力,算
法总运行时间均未超过1秒满足了实时处理的性能要求。特别是发现
当门限值T等于节点数N的一半时系统性能最优这为系统在实际部署
中的参数配置提供了重要参考。系统在云端环境中也展现出良好的响应
性能和并发处理能力平均响应时间控制在1秒以内满足了实时交互的
用户体验要求。
在安全性测试方面,系统基于国密算法的加密方案安全可靠,门限机制
有效防止单点故障和单点攻击,访问控制机制能够准确识别并阻止未授
权访问,数据完整性保护机制能够检测和防止数据篡改。这些安全特性
共同构成了系统的多层次安全防护体系,为分布式环境下的数据安全共
享提供了可靠保障。
综合各项测试结果,我们可以得出结论:分布式环境下基于国密的代理
重加密系统能够满足分布式环境下的数据安全共享需求,具有功能完备
、性能优异、安全可靠等特点。系统在性能和安全性方面均达到了预期
目标,为后续的实际部署应用奠定了坚实基础。
与传统的访问控制和权限管理方法相比,本系统具有显著优势:采用高
强度的国密算法进行加密,确保数据的机密性和完整性;实现分布式架
构和门限机制,增强系统的弹性和安全性;基于代理重加密技术,实现
数据的安全共享和灵活授权;具有高效的处理性能,能够满足实时应用
的需求。这些优势使得系统在数据隐私保护和安全共享领域具有广阔的
应用前景。
在未来的工作中,可以进一步优化系统性能,增强系统功能,扩展系统
的应用场景,为更多领域的数据安全共享提供技术支持。总之,通过本
章的全面测试和分析,我们验证了系统的实用性和有效性,为系统的后
续发展和应用推广奠定了基础。

View File

@@ -0,0 +1,330 @@
\chapter{总结与展望}
\section{主要工作总结}
本文针对数据要素化背景下安全流通需求,设计并实现了一个面向分布式环境的基于
国密算法的代理重加密系统。该系统通过将传统代理重加密中的单Proxy节点拆
分为多个Proxy节点并结合门限代理重加密和国密算法确保了数据在传输和
存储过程中的完整性和隐私性。在研究过程中,本文主要完成了以下工作:
\begin{enumerate}
\item 系统设计与实现
\begin{itemize}
\item 设计了完整的分布式代理重加密方案。系统架构包括数据拥有
Alice、数据请求方Bob、中心服务器以及多个代理服
务器节点。通过精心设计的协议,实现了数据拥有方对数据访问权限
的完全控制,保证了数据安全共享的有效实现。
\item 实现了基于国密算法的加密框架。具体而言采用SM2椭圆曲线公
钥密码算法作为非对称加密基础SM3作为哈希算法提供数据完整
性保护SM4对称加密算法用于高效数据加密。这种基于国密的实
现确保了系统符合国家密码标准,增强了系统在国内环境下的适用
性和安全性。
\item 开发了支持多节点协同的分布式系统。通过引入门限机制,系统
能够在N个代理节点中只要有不少于T个节点正常工作就能保
证系统的正常运行。这大大提高了系统的容错能力和可靠性,使
其能够在节点部分失效或被攻击的情况下依然保持功能完整。
\item 完成了系统各模块的集成与部署。采用Docker容器技术实现了系统
的模块化部署,使得系统能够在不同的操作系统环境下稳定运行
。通过HTTP协议实现了各组件间的通信确保了系统在复杂网络
环境下的互操作性和兼容性。
\end{itemize}
\item 关键技术创新
\begin{itemize}
\item 将门限密码学与代理重加密技术相结合。传统的代理重加密方案通常依赖单一代理节点,
存在单点故障和安全风险。本文通过引入Shamir密码共享方案
将重加密过程分散到多个代理节点,
任何少于门限值的代理节点集合都无法获得关于原始密文的有效信息,
从而显著提高了系统的安全性。
\item 采用国密算法确保系统安全性。相比国际通用的加密算法,
国密算法不仅具有同等的安全强度,还在国内具有更好的兼容性和符合性。
具体实现中采用SM2椭圆曲线密码算法提供公钥加密功能
SM3哈希算法用于数据完整性验证和密钥派生SM4对称加密算法用于高效的数据加密。
\item 实现了高效的混合加密机制。
通过结合密钥封装机制KEM和数据封装机制DEM
系统能够在保证安全性的同时提高加密效率。具体而言,
使用SM4对称算法加密原始数据再使用SM2公钥算法加密SM4的会话密钥
这种混合加密方式显著提高了系统处理大量数据时的性能。
\item 设计了灵活的密钥管理方案。通过分布式的密钥生成和管理机制,
系统能够灵活应对不同的应用场景需求。数据拥有方可以根据安全需要,
动态调整门限值和代理节点数量,实现对授权访问的精细控制。
同时,重加密密钥的分片管理确保了即使部分代理节点被攻破,
整个系统的安全性仍然能够得到保障。
\end{itemize}
\item 性能与安全性验证
\begin{itemize}
\item 进行了全面的功能测试。测试内容包括密钥生成、
加密解密、重加密密钥生成、重加密操作、密文合并以及最终解密等核心功能,
确保系统各组件能够正确协同工作。测试结果表明,所有功能模块都能够按照预期运行,
系统整体功能完备,操作流程顺畅。
\item 完成了系统性能评估。通过设置不同的参数组合如变化节点数量N和门限值T
全面测试了系统在各种配置下的运行效率。测试数据表明,
即使在节点数量较多的情况下系统的运算时间仍然控制在合理范围内远低于1秒
满足了实际应用的性能需求。特别是当门限值T设置为节点总数N的一半时
系统表现出最优的性能表现。
\item 验证了安全机制的有效性。通过模拟各种攻击场景,验证了系统的安全防护能力。
测试结果显示,在密钥部分泄露、节点部分失效或受到攻击的情况下,
系统仍能维持数据的安全性,证明了门限机制在提升系统安全性方面的有效性。
此外,安全性分析表明,系统能够抵抗选择明文攻击和选择密文攻击,
保证了数据的机密性和完整性。
\item 确认了系统的可靠性。通过在不同环境下的部署测试,本文确认了系统的可靠性。
在本地测试环境和云端部署环境中,系统均表现出良好的稳定性和一致性,
能够持续稳定地提供服务。特别是在异步处理数据和高并发访问的场景下,
系统依然保持了预期的性能水平,证明了其在实际应用中的可靠性。
\end{itemize}
\end{enumerate}
\section{系统特点与优势}
通过对设计实现的分布式代理重加密系统的全面评估,本文归纳出该系统具有以下主要特点和优势:
\begin{enumerate}
\item 安全性
\begin{itemize}
\item 基于国密算法保证密码学安全。国密算法SM2/SM3/SM4作为我国
自主开发的密码算法标准,已经过充分的安全性验证,能够提供与
国际主流密码算法相当的安全强度。在本系统中SM2椭圆曲线公钥密
码算法用于密钥交换和签名验证SM3哈希算法用于消息完整性检查
和密钥派生SM4对称加密算法用于高效的数据加密这种多层次的
密码学保护确保了系统的基础安全性。
\item 采用门限机制防止单点故障。通过Shamir密码共享方案系统将重加
密密钥分成N个片段分配给不同的代理节点只有当至少T个节点
T$\leq$N协同工作时才能完成重加密操作。这意味着即使有
部分节点少于N-T+1个被攻击者控制系统的安全性仍然不会受
到影响。这种分布式的安全机制显著提高了系统抵抗攻击的能力,消
除了传统单一代理节点方案中的单点故障风险。
\item 实现了完整的访问控制。数据拥有者可以精确控制谁能访问其数据
,并可以随时撤销或更改这些权限。这种细粒度的访问控制是通过重
加密密钥的生成和分发实现的,确保了数据只能被授权方访问。同时
,系统还支持门限值的动态调整,使得数据拥有者可以根据安全需
求灵活设置安全策略,平衡安全性和可用性。
\item 确保数据传输和存储安全。在数据传输过程中,所有敏感
信息都经过加密处理,防止中间人攻击和数据窃听。数据存储时采用
加密形式,即使存储介质被直接访问,未经授权方也无法获取明文
数据。系统还对重要操作实施数据完整性验证,确保数据在传输和
处理过程中不被篡改,维护了整个系统的安全可靠性。
\end{itemize}
\item 高效性
\begin{itemize}
\item 算法实现简单、计算量小。尽管系统涉及复杂的密码学操作,但通过
精心设计和优化,各核心算法的实现都保持了简洁和高效。特别是
在重加密操作中,系统只需处理对称密钥的重加密,而不需要对整
个数据进行处理,这大大减少了计算开销。测试结果表明,即使
在较大规模的分布式环境中例如节点数量为20的情况系统的
各项操作时间仍然保持在毫秒级别,远低于实际应用所需的响应时
间阈值。
\item 支持高效的数据共享和授权。通过代理重加密技术,数据拥有者可
以快速授权其他用户访问已加密的数据,而无需解密原始数据或共
享自己的私钥。这种授权过程简单高效,只需生成适当的重加密密
钥并分发给代理节点。同时,系统支持批量授权和权限管理,能够
在大规模数据共享场景中保持高效率,满足现代数据交换平台的需求。
\item 具有良好的系统响应性能。通过混合加密机制KEM/DEM系统在处
理大量数据时能够保持高效率。其次,异步处理机制使系统能够并
行处理多个请求,提高了整体吞吐量。第三,系统采用轻量级的通
信协议和数据格式,减少了网络传输开销。最后,数据库操作和存
储策略也经过优化,确保了快速的数据访问和管理。这些措施共同
确保了系统在各种工作负载下都能保持良好的响应性能。
\item 计算效率优于传统方案。传统方案通常需要多次加解密操作或复杂的
密钥管理机制,导致系统性能下降。而本系统通过代理重加密技术,
实现了"一次加密,多次授权"的高效模式,显著减少了重复加解密的
需求。性能测试结果表明,即使在高频率数据访问和权限变更的场景
下,系统仍能保持稳定高效的性能,计算开销远低于传统方案。
\end{itemize}
\item 适应性
\begin{itemize}
\item 支持分布式环境部署。系统架构采用松耦合的模块化设计,各组件间
通过标准接口通信,使得系统能够灵活部署在各种分布式环境中。无
论是私有云、公有云还是混合云环境,系统都能有效运行。同时,系
统还支持容器化部署如Docker能够在异构计算环境中保持一致
的行为,大大提高了系统的部署灵活性和环境适应能力。
\item 具有良好的可扩展性。系统支持动态增减代理节点,可以根据业务规
模和安全需求调整系统规模。其次,门限值可以根据实际需要进行调
整,在不同安全级别要求下保持适应性。此外,系统的模块化设计允
许各组件独立扩展和升级,无需修改整个系统架构。测试结果表明,
系统的性能随着节点数量的增加而线性扩展,证明了其在大规模部署
环境下的适应能力。
\item 易于与现有系统集成。本系统提供了丰富的API接口便于与其他应
用系统进行对接。系统使用标准的HTTP协议进行通信支持JSON
格式的数据交换,这使得集成工作变得简单且可靠。无论是作为独
立系统运行,还是作为更大系统的一个组件,本系统都能够无缝融
入,提供安全的数据共享和访问控制功能。这种易集成性使得系统能够
快速部署到实际生产环境中,为现有业务流程提供安全增强。
\item 适用于多种应用场景。从企业内部的敏感数据保护,到跨组织的安
全数据共享;从云存储服务的数据安全,到物联网环境下的设备
认证,系统都能提供适当的安全保障。特别是在需要精细访问控
制和数据共享的场景中,如医疗健康数据共享、金融信息交换、
政府数据开放等领域,系统的优势更为明显。这种多场景适应能力
为系统的广泛应用打下了坚实基础。
\end{itemize}
\end{enumerate}
\section{应用前景}
随着数字经济的深入发展和数据要素价值的不断凸显,本文设计实现的基于国密
算法的分布式代理重加密系统在多个领域展现出广阔的应用前景:
\begin{enumerate}
\item 数据共享平台
\begin{itemize}
\item 支持安全的数据交换。随着数据要素市场的逐步建立,企业、政府
和研究机构之间的数据交换需求日益增长,而数据安全问题成为制
约数据共享的关键因素。本系统通过代理重加密技术,支持安全的
数据交换过程,既能确保数据在传输和存储过程中的保密性,又能
防止数据在共享过程中的未授权使用,为数据共享平台提供了可靠的安全保障。
\item 实现灵活的权限管理。数据提供方可以精确控制数据使用权限,包
括访问时间、访问范围甚至访问频率,而无需担心数据的原始副本
泄露。这种细粒度的权限管理满足了各类数据交易的复杂需求,
使得数据提供方能够在保护自身数据资产的同时,最大化数据的利用价值。
\item 保护数据隐私。通过加密保护,确保敏感数据不会在未授权的情况下
被访问,同时通过代理重加密技术,实现了数据的安全共享而无需
暴露原始数据。这对于涉及个人隐私的数据共享尤为重要,例如医
疗健康数据、个人金融信息等,系统可以在保证数据可用性的同时
,严格保护个人隐私不被侵犯。
\item 提高数据利用效率。传统数据共享过程中,数据安全措施往往会带
来性能开销,降低数据利用效率。本系统通过优化算法和改进架构
,在保证安全性的同时,最大限度地减少了安全措施带来的性能损
失,使得数据能够高效流动和使用,加速了数据价值的释放过程。
\end{itemize}
\item 区块链系统
\begin{itemize}
\item 实现数据访问控制。在公链环境中,交易数据对所有节点公开,难
以保护敏感信息;而在联盟链中,不同参与方对数据访问权限的精
细化管理也是亟待解决的问题。本系统提供的分布式代理重加密技
术为区块链系统的数据访问控制提供了理想解决方案。
\item 保护交易隐私。通过将交易数据加密后再上链,结合代理重加密
技术控制数据访问权限,既保证了区块链的不可篡改特性,又实
现了数据的隐私保护。这对于金融交易、供应链管理等对数据隐私
有严格要求的区块链应用尤为重要,解决了区块链透明性与隐私
保护之间的矛盾。
\item 支持动态权限调整。系统支持动态权限调整的特性与区块链的智能
合约机制结合,可以实现自动化、精确的数据访问控制。数据所有
者可以通过智能合约定义复杂的访问策略,如基于时间、条件或代
币支付的数据访问权限,当满足预设条件时,系统自动完成重加密
密钥的生成和分发,实现了权限管理的智能化和去中心化。
\item 优化数据共享机制。传统区块链中的数据共享往往需要链下协
商和多次交互,效率低下且安全风险高。而本系统通过代理重加
密技术,将数据共享过程简化为密钥生成和分发操作,大大提高了
效率,同时保证了安全性。这种优化对于需要频繁数据交换的区
块链应用,如分布式金融、跨境贸易等领域具有重要价值。
\end{itemize}
\item 云计算环境
\begin{itemize}
\item 保护云存储数据。随着云计算技术的普及,越来越多的企业和个人
将数据存储在云端,但云存储环境下的数据安全问题也随之增加。
本系统提供的基于国密算法的分布式代理重加密技术,为云存储数
据提供了全生命周期的安全保护。数据在上传前即被加密,在云存
储期间保持加密状态,只有授权用户才能获得解密权限,即使云服
务提供商也无法获取明文数据,从根本上解决了云存储中的数据泄
露风险。
\item 支持多用户访问。云环境下的数据往往需要被多个用户或应用程序
访问,传统的访问控制方式要么安全性不足,要么操作复杂。而本
系统通过代理重加密技术,实现了高效且安全的多用户访问控制,
数据所有者只需生成相应的重加密密钥,即可授权其他用户访问加
密数据,无需多次加解密或复杂的密钥管理,极大简化了云环境下
的数据共享操作。
\item 确保数据安全。系统的分布式架构和门限机制为云环境数据安
全提供了额外保障。在云计算场景中,系统可以将代理节点分布
在不同的云服务商或不同的地理位置,通过门限机制确保即使部
分节点故障或被攻击,系统整体仍能安全运行。这种架构不仅提
高了数据安全性,还增强了系统的可用性和灾难恢复能力,特别
适合对数据安全和服务可用性有高要求的企业云应用。
\item 提供可控分享。系统提供的可控分享功能与云服务的按需使用特性
高度契合。在云环境中,资源使用和共享需要灵活多变,本系统允
许数据所有者根据业务需要随时调整数据访问权限,包括授权新用
户访问或撤销已有用户的访问权限。这种灵活性使得企业能够根据
业务关系的变化动态调整数据共享策略,在保障数据安全的同时,
最大化云服务的业务价值。
\end{itemize}
\end{enumerate}
\section{未来工作展望}
尽管本文已经在分布式环境下基于国密算法实现了高效安全的代理重加密系统,但
在实际应用和技术发展方面仍有多项工作值得深入研究:
\begin{enumerate}
\item 算法优化与性能提升
\begin{itemize}
\item 进一步优化椭圆曲线算法实现,探索更优的密钥生成和管理策略
,以及优化重加密计算过程。特别是在大规模分布式环境中,如
何平衡系统的计算负载,提高系统的整体吞吐量,是值得深入研究的方向。
\item 减少通信开销。在分布式环境中,网络通信往往是性能瓶颈。
通过优化协议设计、减少交互次数、压缩传输数据等方式,可以
显著提高系统在实际网络环境下的响应速度。此外,研究更高效
的共识机制和分布式计算模型,也有助于提升系统在大规模部署时的性能表现。
\end{itemize}
\item 功能扩展与应用集成
\begin{itemize}
\item 增加基于属性的访问控制ABAC功能支持更复杂的授权
策略;引入基于区块链的审计机制,提供不可篡改的操作记录;
开发更丰富的API接口和开发工具包方便第三方应用集成
增强用户界面和管理功能,提高系统的可用性和管理效率。
\item 深入研究如何将系统与现有的安全基础设施和业务系统无
缝连接。例如与企业身份认证系统如LDAP、Active Directory
的集成,与数据库加密系统的对接,以及与各类业务应用的协同
工作机制。这些集成工作将有助于系统在实际生产环境中发挥更大价值。
\end{itemize}
\item 安全性增强与标准化
\begin{itemize}
\item 研究抗量子计算的密码算法,并将其集成到代
理重加密系统中,确保系统的长期安全性。同时
,进一步提高系统的防攻击能力,如增强对侧信
道攻击、恶意节点行为的防御,也是重要研究方向。
\item 通过参与相关国家标准和行业标准的制定,推动
基于国密算法的代理重加密技术标准化,使其能够在更广泛的领
域得到认可和应用。同时,系统实现也应当符合相关安
全标准和规范,如等级保护要求、密码应用合规性评估
等,以便在重要领域和关键基础设施中部署使用。
\end{itemize}
\end{enumerate}
\section{本文结论}
本文设计实现的基于国密算法的分布式代理重加密系统在安全性、
高效性和适应性方面都表现出色,为分布式环境下的数据安全共享提供了有
效解决方案。随着数字经济的深入发展和数据要素价值的进一步释放,该
系统在数据共享平台、区块链系统和云计算环境等领域具有广阔的应用前
景。未来工作将围绕算法优化、功能扩展和安全增强等方面展开,进一步
提升系统的实用价值和技术水平。

View File

@@ -0,0 +1,38 @@
%% 原创性声明
\begin{center}
\zihao{3}\textbf{\underline{网络空间安全与信息法学院}本科毕业设计(论文)诚信承诺书}
\end{center}
\zihao{4}
本人郑重承诺:
我向学院呈交的论文《\underline{分布式环境下基于国密的代理重加密设计实现}》,是本人在指导教师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明并致谢。本人完全意识到本声明的法律结果由本人承担。
\vspace{1cm}
\begin{flushright}
年级:\underline{\makebox[3cm]{\hfill 2021\hfill}}\par
专业:\underline{\makebox[3cm]{\hfill 信息安全\hfill}}\par
班级:\underline{\makebox[3cm]{\hfill 40402101\hfill}}\par
承诺人签名:\underline{\makebox[3cm]{\hfill 梁俊勇\hfill}}\par
\vspace{0.3cm}
\underline{2025}\underline{1}\underline{1}
\end{flushright}
\vspace{1cm}
\begin{center}
\zihao{2}\textbf{学位论文版权使用授权书}
\end{center}
本人完全了解重庆邮电大学有权保留、使用学位论文纸质版和电子版的规定,即学校有权向国家有关部门或机构送交论文,允许论文被查阅和借阅等。本人授权重庆邮电大学可以公布本学位论文的全部或部分内容,可编入有关数据库或信息系统进行检索、分析或评价,可以采用影印、缩印、扫描或拷贝等复制手段保存、汇编本学位论文。
(注:保密的学位论文在解密后适用本授权书。)
\vspace{1cm}
\noindent
\begin{tabular}{ll}
学生签名:\underline{\hspace{3cm}} & 指导老师签名:\underline{\hspace{3cm}}\\[0.5cm]
日期:\underline{\hspace{1cm}}\underline{\hspace{1cm}}\underline{\hspace{1cm}}&
日期:\underline{\hspace{1cm}}\underline{\hspace{1cm}}\underline{\hspace{1cm}}
\end{tabular}

View File

@@ -0,0 +1,63 @@
% !TEX root = main.tex
% 中文封面页, 不能单独编译
% 格式要求:无页眉页脚, 单独成页,后面空一页
\pdfbookmark[0]{封面}{cover}
\begin{center}
\newcommand{\settingone}[1]{{\songti\sihao\bfseries #1}}
\noindent {\songti\sanhao\bfseries } \hfill
\newlength{\Mylen}
\settowidth{\Mylen}{\settingone{\qquad2021212687}}
\begin{minipage}[t]{\Mylen} \sihao
\bfseries\qquad 号 : \underline{2018123456} \\
\bfseries 审定成绩 : \underline{\phantom{2018}\phantom{28B}} %\phantom创建空格
\end{minipage}
\\ [1mm]
\newlength{\Mylentwo}
\begin{figure*}[h]
\centering
\includegraphics[scale=0.8]{images/logo/logo1.jpg}
\end{figure*}
%{\yihao\bfseries 重庆邮电大学} \\[3mm]
{\yihao\bfseries 本科毕业设计(论文)}\\[3mm]
\begin{figure*}[h]
\centering
\includegraphics[scale=0.2]{images/logo/logo2.jpg}
\end{figure*}
\begin{table}[ht]
\centering
\renewcommand\arraystretch{1.25}
\begin{tabular}{p{2cm}p{9cm}}
\makecell[c]{\bfseries\sihao 中文题目} & \makecell[c]{\bfseries\sihao 分布式环境下基于国密的} \\
\cline{2-2}
& \makecell[c]{\bfseries\sihao 代理重加密设计实现} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao 英文题目} & \makecell[c]{\bfseries\sihao Distributed Proxy Re-encryption Based } \\
\cline{2-2}
& \makecell[c]{\bfseries\sihao on Chinese Cryptographic Standards} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao 学院名称} & \makecell[c]{\bfseries\sihao 网络空间安全与信息法学院} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao 学生姓名} & \makecell[c]{\bfseries\sihao 梁俊勇} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao\qquad} & \makecell[c]{\bfseries\sihao 信息安全} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao\qquad} & \makecell[c]{\bfseries\sihao 04042101} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao\qquad} & \makecell[c]{\bfseries\sihao 2021212687} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao 指导教师} & \makecell[c]{\bfseries\sihao 左祥建 讲师} \\
\cline{2-2}
\makecell[c]{\bfseries\sihao\hspace{6pt}\hspace{6pt}} \\[-2mm]
\makecell[c]{\bfseries\sihao\hspace{6pt}\hspace{6pt}} & \makecell[c]{\bfseries\sihao 姓名 职称} \\
\cline{2-2}
\end{tabular}
\end{table}
\vspace{0.1cm}
\bfseries\sihao 2025年\hspace{12pt}6月
\\[2mm]
\bfseries\sihao 重庆邮电大学教务处制
\end{center}

23
paper/chapters/ref.tex Normal file
View File

@@ -0,0 +1,23 @@
%参考文献是毕业设计(论文)不可缺少的组成部分,
%它反映论文作者的科学态度和毕业设计(论文)的取材来源、广博程度和可靠程度,
%同时能方便地把作者的研究成果与他人的成果区别开来。
%一份完整的参考文献也是向读者提供的一份有价值的信息资料。
%参考文献应列入主要的中外文献数量不少于15篇
%教科书和硕士论文不多于5本。
%按论文中参考文献出现的次序,用中括号以数字连续编号,格式参考毕业设计(论文)模版。
% 参考文献使用
% 设置参考文献风格,参照使用
% https://github.com/Haixing-Hu/GBT7714-2005-BibTeX-Style
%
% TeX技巧/参考文献
% https://www.latexstudio.net/archives/1541.html
%
% TeX技巧/参考文献需要注意的一些小问题
% https://blog.csdn.net/jialiyk/article/details/124990632
%
% 参考文献呈现方式
\bibliographystyle{reference/gbt7714-2005}
% .bib文件名 此参考文献在文件夹reference下名为ref.bib文件
\bibliography{reference/ref}
\newpage\quad %加一页,使得致谢第一页的页眉为 致谢

34
paper/chapters/thanks.tex Normal file
View File

@@ -0,0 +1,34 @@
%% 致谢
\chapter{致谢}
{\songti\xiaosi
\setlength{\parindent}{2em}
在本科毕业论文的完成过程中,我得到了许多老师和同学的帮助与支持,
在此谨向他们致以诚挚的感谢。}\par
{\songti\xiaosi
首先要特别感谢我的指导教师左祥建老师。在整个研究过程中,
左老师始终以严谨的治学态度和渊博的专业知识指导我的研究工作。
他不仅在选题方向、研究方法等方面给予了悉心指导,
更在论文的具体写作过程中提出了许多宝贵的修改意见。
左老师治学严谨、关怀学生的师德风范,将使我受益终身。}\par
{\songti\xiaosi
在整个论文写作过程中,左老师多次牺牲休息时间,认真审阅论文的每一处细节,
并针对关键技术难点提供了富有建设性的建议。他渊博的学识和敏锐的学术洞察力,
帮助我克服了研究过程中遇到的诸多困难。他严谨的治学态度和无私的指导精神,
不仅帮助我完成了论文写作,更为我未来的学术道路树立了榜样。}
{\songti\xiaosi
最后,要感谢我的家人。感谢他们在我求学期间给予的理解和支持,
让我能够专心致志地投入学习和研究。他们的默默付出和无私关爱,
是我前行路上最温暖的力量。}\par
{\songti\xiaosi
求学之路虽已告一段落,但学海无涯,未来仍需不断进取。
衷心感谢所有帮助过我的师长、同学和亲人,
正是有了你们的支持与鼓励,才使得这篇论文得以顺利完成。
这份感激之情将永远铭记于心,激励我在未来的道路上继续奋进。}
\newpage\quad %加一页使得附录A第一页的页眉为 附录A

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

View File

@@ -0,0 +1,234 @@
\usepackage{graphicx} %绘图
\usepackage{pifont} %圆圈1如①
\usepackage{booktabs} %绘制三线表
\usepackage{multirow} %使用https://www.tablesgenerator.com/网站绘制表格所需包
\usepackage{threeparttable} %表格脚注
\usepackage[noend]{algpseudocode} %绘制伪代码
\usepackage{algorithmicx,algorithm}
\usepackage{pythonhighlight} %python代码高亮
\usepackage[colorlinks=true,linkcolor=black,anchorcolor=black,citecolor=green]{hyperref}%引用参考文献、章节、图表,并跳转
\usepackage{caption}
\captionsetup[figure]{font=small,labelsep=space}
\captionsetup[table]{font=small,labelsep=space} %图片和表格修改caption
\usepackage{enumitem} % 列表行间距
\usepackage[final]{pdfpages}
% 设置页边距
\usepackage{geometry}
\usepackage{makecell}
\usepackage{caption}
\usepackage{multirow}
\usepackage{booktabs}
\makeatletter
\let\c@lofdepth\relax
\let\c@lotdepth\relax
\makeatother
\usepackage{subfigure}
\usepackage{float}
\usepackage[titles,subfigure]{tocloft}
\usepackage{soul}
\usepackage{color,xcolor}
% 横向表格
\usepackage{lscape}
\geometry{a4paper,top=3cm,bottom=2.5cm,left=2.5cm,right=2.5cm}
% 设置行间距 1.5倍
\linespread{1.5}\selectfont
% 设置列表间距
\setlist{itemsep=-0.3\baselineskip}
% 设置段与段之间的垂直距离 \parskip默认橡皮长度是0pt plus 1pt
\setlength{\parskip}{0pt}
\setlength{\headheight}{15pt} %设置页眉高度
% \setlength{\parindent}{0pt}
%设置字体
% 设置英文字体
\setmainfont{Times New Roman}[
BoldFont = Times New Roman Bold,
ItalicFont = Times New Roman Italic,
BoldItalicFont = Times New Roman Bold Italic
]
\setsansfont{Times New Roman}[
BoldFont = Times New Roman Bold,
ItalicFont = Times New Roman Italic,
BoldItalicFont = Times New Roman Bold Italic
]
\setmonofont{Times New Roman}[
BoldFont = Times New Roman Bold,
ItalicFont = Times New Roman Italic,
BoldItalicFont = Times New Roman Bold Italic
]
\usepackage{xeCJK}
\setCJKmainfont[AutoFakeBold=true,AutoFakeSlant=true]{SimSun} % 使用宋体作为主要中文字体
\setCJKsansfont[AutoFakeBold=true,AutoFakeSlant=true]{Noto Sans CJK SC} % 无衬线字体
\setCJKmonofont[AutoFakeBold=true,AutoFakeSlant=true]{WenQuanYi Micro Hei Mono} % 等宽字体
%设置字号
% \usepackage{ctexsize,type1cm}
\usepackage{type1cm}
\newcommand{\yihao}{\fontsize{26pt}{39pt}\selectfont}
\newcommand{\xiaoyi}{\fontsize{24pt}{36pt}\selectfont}
\newcommand{\erhao}{\fontsize{22pt}{33pt}\selectfont}
\newcommand{\xiaoer}{\fontsize{18pt}{27pt}\selectfont}
\newcommand{\sanhao}{\fontsize{16pt}{24pt}\selectfont}
\newcommand{\xiaosan}{\fontsize{15pt}{22.5pt}\selectfont}
\newcommand{\sihao}{\fontsize{14pt}{21pt}\selectfont}
\newcommand{\xiaosi}{\fontsize{12pt}{18pt}\selectfont}
\newcommand{\wuhao}{\fontsize{10.5pt}{15.75pt}\selectfont}
\newcommand{\xiaowu}{\fontsize{9pt}{13.5pt}\selectfont}
\newcommand{\liuhao}{\fontsize{7.5pt}{11.25pt}\selectfont}
%使用公式,表格,图片
\usepackage{mathtools,amsmath,amssymb,graphicx,array,float}
% 设置页眉面脚
%% 设置章节前的页码格式
\usepackage{fancyhdr}
\fancypagestyle{content}{
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\fancyfoot[C]{\songti\xiaowu \Roman{page}}
}
%重新设置headings
\fancypagestyle{headings}{
\fancyhf{}
\fancyfoot[C]{\songti\xiaowu \Roman{page} }
\renewcommand{\headrulewidth}{0.5pt}
\fancyhead[CO]{\songti\xiaowu 目录 }
\fancyhead[CE]{\songti\xiaowu 重庆邮电大学本科毕业设计(论文)}
}
%重新设置plain
%正文页眉设置
\fancypagestyle{plain}{
\fancyhf{}
\fancyfoot[C]{\songti\xiaowu \thepage }
\fancyhead[CO]{\songti\xiaowu \leftmark }
\fancyhead[CE]{\songti\xiaowu 重庆邮电大学本科毕业设计(论文)}
}
%设置双线页脚
\makeatletter
\def\footrule{
{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi%
\hrule\@height 0pt \@width\headwidth %上面0.5pt粗
\vskip 1pt
\hrule\@height 0pt \@width\headwidth %下面线为1pt粗
\vskip-2\headrulewidth\vskip-1.2pt} %两条线的距离1pt
\vspace{8mm}} %双线与下面正文之间的垂直间距
\makeatother
%设置文章格式
\ctexset {
autoindent = true,
punct = quanjiao,
contentsname={目录},
listfigurename={插图},
listtablename={表格},
figurename={},
tablename={},
bibname={参考文献},
appendixname={附录},
chapter={
beforeskip={0pt},
nameformat={\heiti\sanhao\centering},
number={\arabic{chapter}},
titleformat={\heiti\sanhao\centering},
},
section={
format={\heiti\sihao},
},
subsection={
format={\heiti\xiaosi},
},
subsubsection={
format={\heiti\xiaosi},
}
}
% 目录中的章加点
\usepackage[titles]{tocloft}
\renewcommand{\cftdot}{$\cdot$}
\renewcommand{\cftdotsep}{1.5}
\setlength{\cftbeforechapskip}{10pt}
\renewcommand{\cftchapleader}{\cftdotfill{\cftchapdotsep}}
\renewcommand{\cftchapdotsep}{\cftdotsep}
\makeatletter
\renewcommand{\numberline}[1]{%
\settowidth\@tempdimb{#1\hspace{0.5em}}%
\ifdim\@tempdima<\@tempdimb%
\@tempdima=\@tempdimb%
\fi%
\hb@xt@\@tempdima{\@cftbsnum #1\@cftasnum\hfil}\@cftasnumb}
\makeatother
% 设置目录字体尺寸
\renewcommand{\cftchapfont}{\songti\xiaosi}
\renewcommand{\cftsecfont}{\songti\wuhao}
\renewcommand{\cftsubsecfont}{\songti\wuhao}
%使用代码排版包
\usepackage{listings}
\usepackage{color}
\lstset{%
frame=shadowbox,
extendedchars=false, % 不使用xelatex而使用CJK方式处理汉字
language=python,
basicstyle=\sffamily, % 设置整体格式
keywordstyle=\bfseries, % 关键字格式
commentstyle=\rmfamily\itshape, % 注释格式
stringstyle=\ttfamily, % 字符串格式
columns=flexible,
escapechar=', % 注释中显示汉字eg //'一个整数'
tabsize=4,
numbers=left,
numberstyle=\small, % 行号字体设置
stepnumber=1, % 行号距离设置1代表每行加行号
numbersep=8pt, % 行号和代码距离设置
backgroundcolor=\color{white},
showspaces=false, % show spaces adding particular underscores
showstringspaces=false, % 使用下划线连接字符串
showtabs=false,
frame=single, % 给代码加边框
captionpos=b, % sets the caption-position to bottom
breaklines=true, % 自动换行设置
breakatwhitespace=false, % sets if automatic breaks should only happen at whitespace
escapeinside={\%*}{*)}, % if you want to add a comment within your code
xleftmargin=2em, % 设置左边距,宽度默认是与页芯等宽的
xrightmargin=2em, % 设置右边距,宽度默认是与页芯等宽的
aboveskip=1em % 设置上边距
}
%设置自定义变量
\newcommand\degree{^\cire}
% 定义文献引用格式,\cite正常引用 \supercite右上角引用
\usepackage{cite}
\newcommand{\upcite}[1]{\textsuperscript{\textsuperscript{\cite{#1}}}}
\newcommand\supercite[2][]{%
\textsuperscript{\cite[#1]{#2}}
}
\usepackage{enumitem}
\setlist[description]{
itemsep=-5pt,
font=\songti,
}
% 定义中文封面环境
\newenvironment{titletabbing}
{\par\bfseries\songti\sihao\tabbing}
{\endtabbing\par}
\usepackage[nottoc]{tocbibind}
\endinput

46
paper/main.tex Normal file
View File

@@ -0,0 +1,46 @@
\documentclass[UTF8,twoside,zihao=-4,AutoFakeBold,scheme=chinese,openany]{ctexbook}
% 输入配置文件,例如调用的宏包(公式,插图等)
\input{latex_settings/custom-chinese}
\begin{document}
\pagestyle{empty}
% 中文封面页
\input{chapters/pagetitle-chinese}
% 原创性声明
\input{chapters/original}
%% 中文摘要页,开始以罗马字母计页码
\frontmatter
\pagestyle{content}
\input{chapters/abs-chinese}
%% 英文摘要页
\input{chapters/abs-english}
%% 目录
\pagestyle{headings}
\tableofcontents
% % \thispagestyle{MyStyle}
\let\cleardoublepage\clearpage %latex消除空白页
% ===============================
% 开始章节写作,显示特定页眉页脚
\mainmatter
\pagestyle{plain}
% 第1-7章
\include{chapters/chapter01}
\include{chapters/chapter02}
\include{chapters/chapter03}
\include{chapters/chapter04}
\include{chapters/chapter05}
\backmatter
%================================
% 参考文献
\input{chapters/ref}
% 致谢
\include{chapters/thanks}
% 附录
\include{chapters/appden01}
%================================
\end{document}

File diff suppressed because it is too large Load Diff

1004
paper/reference/ref.bib Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,173 @@
# type: ignore
# ruff: noqa
import numpy as np
from fractions import Fraction
def generate_shamir_example(secret, t, n, a_coeffs=None):
"""
生成一个Shamir秘密共享的例子并输出LaTeX代码
参数:
secret: 需要共享的秘密整数
t: 恢复秘密所需的最小分片数
n: 总分片数
a_coeffs: 多项式系数(可选)
"""
# 如果未提供系数,则随机生成
if a_coeffs is None:
a_coeffs = [np.random.randint(1, 100) for _ in range(t - 1)]
# 确保a_coeffs长度正确
assert len(a_coeffs) == t - 1, f"系数长度应为 {t - 1}"
# 构建多项式 f(x) = secret + a_1*x + a_2*x^2 + ... + a_{t-1}*x^{t-1}
all_coeffs = [secret] + a_coeffs
# 计算每个参与者的分片
shares = []
for i in range(1, n + 1):
y = sum(all_coeffs[j] * (i**j) for j in range(t))
shares.append((i, y))
# 选择t个分片进行恢复
selected_shares = shares[:t]
# LaTeX输出
latex_output = generate_latex(secret, t, n, all_coeffs, shares, selected_shares)
return {
"secret": secret,
"polynomial": all_coeffs,
"shares": shares,
"selected_shares": selected_shares,
"latex": latex_output,
}
def lagrange_interpolation(points, x_value=0):
"""使用Lagrange插值法恢复秘密"""
result = 0
x_points, y_points = zip(*points)
# 计算每个点的拉格朗日基本多项式值并相加
for i in range(len(points)):
term = y_points[i]
for j in range(len(points)):
if i != j:
term *= Fraction(x_value - x_points[j], x_points[i] - x_points[j])
result += term
return result
def generate_latex(secret, t, n, coeffs, shares, selected_shares):
"""生成完整的LaTeX代码"""
# 构建多项式字符串
poly_str = f"{coeffs[0]}"
for i in range(1, len(coeffs)):
if coeffs[i] > 0:
poly_str += f" + {coeffs[i]}"
else:
poly_str += f" - {abs(coeffs[i])}"
if i == 1:
poly_str += "x"
else:
poly_str += f"x^{i}"
# 计算拉格朗日插值步骤
lagrange_steps = []
result = 0
for i, (x_i, y_i) in enumerate(selected_shares):
term = y_i
term_str = f"{y_i}"
for j, (x_j, _) in enumerate(selected_shares):
if i != j:
fraction = Fraction(0 - x_j, x_i - x_j)
term *= fraction
# 构建拉格朗日基本多项式的LaTeX表示
term_str += f"\\cdot\\frac{{0-{x_j}}}{{{x_i}-{x_j}}}"
# 添加简化步骤
simplified_term = int(term) if term.denominator == 1 else term
lagrange_steps.append((term_str, simplified_term))
result += simplified_term
# 生成最终的LaTeX代码
latex = f"""
举例说明:假设我们有一个秘密数字$S={secret}$,我们希望将其分割成{n}个片段,
但只需要{t}个片段就可以恢复它(即$t={t},n={n}$
选择一个{t - 1}次多项式(因为$t-1={t - 1}$:
\\[f(x) = """
# 添加多项式表达式
for i in range(t):
if i == 0:
latex += f"a_{i}"
else:
latex += f" + a_{i}x^{i}"
latex += "\\]\n"
# 添加具体的多项式
latex += f"假设我们选择"
for i in range(1, t):
if i < t - 1:
latex += f"$a_{i}={coeffs[i]}$, "
else:
latex += f"$a_{i}={coeffs[i]}$"
latex += f",那么多项式就是:\n\\[f(x) = {poly_str}\\]\n"
# 添加分片计算
latex += "为每个参与者选择一个$x$值并计算$f(x)$\n"
for x, y in shares:
latex += f"\\[f({x}) = {' + '.join([f'{coeffs[i]}\\cdot{x}^{i}' if i > 0 else f'{coeffs[i]}' for i in range(t)])} = {y}\\]\n"
# 添加分片分配
share_str = ", ".join([f"$({x},{y})$" for x, y in shares])
latex += f"每个参与者分别得到一个片段:{share_str}\n"
# 添加恢复秘密的说明
latex += f"要恢复秘密,我们可以选择其中任意{t}个片段。\n"
selected_str = "".join([f"$({x},{y})$" for x, y in selected_shares])
latex += f"假设我们选择{selected_str}使用Lagrange插值可以计算出$f(0)={secret}$,从而恢复秘密。\n"
# 添加拉格朗日插值公式
latex += "具体的Lagrange插值公式为\n"
latex += "\\[f(x) = \\sum_{i=1}^t y_i \\prod_{j=1,j\\neq i}^t \\frac{x-x_j}{x_i-x_j}\\]\n"
# 添加具体的拉格朗日插值计算
latex += f"在这个例子中,使用{selected_str}进行插值:\n"
terms = []
calculations = []
for term_str, simplified_term in lagrange_steps:
terms.append(term_str)
calculations.append(str(simplified_term))
latex += (
f"\\[f(0) = {' + '.join(terms)} = {' + '.join(calculations)} = {result}\\]\n"
)
latex += f"这就恢复出了原始的秘密值{secret}"
return latex
if __name__ == "__main__":
# 设置的参数
my_secret = 89 # 秘密数字
threshold = 2 # 恢复秘密所需的最小分片数
total_shares = 4 # 总分片数
coefficients = [23] # 多项式系数 (除了常数项外t-1个系数)
# 生成例子
example = generate_shamir_example(my_secret, threshold, total_shares, coefficients)
# 打印LaTeX代码
print(example["latex"])
# 验证秘密恢复是否正确
recovered_secret = lagrange_interpolation(example["selected_shares"])
assert recovered_secret == my_secret, "恢复的秘密不正确!"

39
pyproject.toml Normal file
View File

@@ -0,0 +1,39 @@
[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "tpre-python"
version = "0.1.1"
description = "tpre-python"
authors = [
{ name = "Liang Junyong", email = "liangjunyong06@gmail.com" },
{ name = "Jiang Chao", email = "2384899431@qq.com" },
{ name = "Deng Qinyu", email = "1016751306@qq.com" },
{ name = "Ran Sitong", email = "2624758301@qq.com" },
{ name = "Yu Haichuan", email = "haichuanyu243@gmail.com" },
]
requires-python = ">=3.8"
dependencies = [
"gmssl-python>=2.2.2,<3.0.0",
"fastapi",
"uvicorn",
"requests",
"aiohttp",
"ecc_rs==0.1.2",
]
[project.optional-dependencies]
test = ["httpx", "pytest"]
dev = ["httpx", "pytest", "pyright", "ruff"]
[tool.ruff]
select = ["E", "F", "N", "B", "I", "C4", "UP", "SIM", "D", "ANN", "S", "PL"]
[tool.pyright]
typeCheckingMode = "strict"
reportMissingImports = true
reportGeneralTypeIssues = true
reportUnknownParameterType = true
reportUnknownArgumentType = true
reportMissingTypeArgument = true

View File

@@ -1,5 +0,0 @@
gmssl-python>=2.2.2,<3.0.0
fastapi
uvicorn
requests
web3

View File

@@ -1,63 +0,0 @@
from web3 import Web3
import json
rpc_url = "https://ethereum-holesky-rpc.publicnode.com"
chain = Web3(Web3.HTTPProvider(rpc_url))
contract_address = "0x642C23F91bf8339044A00251BC09d1D98110C433"
contract_abi = json.loads(
"""[
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "string",
"name": "msg",
"type": "string"
}
],
"name": "messageLog",
"type": "event"
},
{
"inputs": [
{
"internalType": "string",
"name": "text",
"type": "string"
}
],
"name": "logmessage",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
}
]"""
)
contract = chain.eth.contract(address=contract_address, abi=contract_abi)
wallet_address = "0xe02666Cb63b3645E7B03C9082a24c4c1D7C9EFf6"
pk = "ae66ae3711a69079efd3d3e9b55f599ce7514eb29dfe4f9551404d3f361438c6"
def call_eth_logger(wallet_address, pk, message: str):
transaction = contract.functions.logmessage(message).build_transaction(
{
"chainId": 17000,
"gas": 30000,
"gasPrice": chain.to_wei("10", "gwei"),
"nonce": chain.eth.get_transaction_count(wallet_address, "pending"),
}
)
signed_tx = chain.eth.account.sign_transaction(transaction, private_key=pk)
tx_hash = chain.eth.send_raw_transaction(signed_tx.raw_transaction)
print(tx_hash)
receipt = chain.eth.wait_for_transaction_receipt(tx_hash)
transfer_event = contract.events.messageLog().process_receipt(receipt)
for event in transfer_event:
print(event["args"]["msg"])

View File

@@ -1,8 +0,0 @@
from eth_logger import call_eth_logger
wallet_address = (
"0xe02666Cb63b3645E7B03C9082a24c4c1D7C9EFf6" # 修改成要使用的钱包地址/私钥
)
wallet_pk = "ae66ae3711a69079efd3d3e9b55f599ce7514eb29dfe4f9551404d3f361438c6"
call_eth_logger(wallet_address, wallet_pk, "hello World")

View File

@@ -1,10 +0,0 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract logger{
event messageLog(string msg);
function logmessage(string memory text) public returns (bool){
emit messageLog(text);
return true;
}
}

View File

@@ -1,17 +1,13 @@
import asyncio
import json
import logging
import os
import socket
import threading
import time
from contextlib import asynccontextmanager
import requests
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from eth_logger import call_eth_logger
from tpre import ReEncrypt, capsule
@@ -178,15 +174,6 @@ async def send_user_des_message(
print("send stauts:", response.text)
def log_message():
while True:
global message_list
payload = json.dumps(message_list)
message_list = []
call_eth_logger(wallet_address, wallet_pk, payload)
time.sleep(2)
wallet_address = (
"0xe02666Cb63b3645E7B03C9082a24c4c1D7C9EFf6" # 修改成要使用的钱包地址/私钥
)

View File

@@ -1,148 +0,0 @@
12th Gen Intel(R) Core(TM) i5-12490F
0.01 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.9953160285949707秒
加密算法运行时间:0.006381511688232422秒
重加密密钥生成算法运行时间:12.903082609176636秒
重加密算法运行时间:0.989858603477478秒
解密算法运行时间:19.69758915901184秒
成功解密: b'hello world'
算法总运行时间:34.59222791194916秒
0.1 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.004191160202026367秒
加密算法运行时间:0.09498381614685059秒
重加密密钥生成算法运行时间:0.7050104141235352秒
重加密算法运行时间:0.09499671459197997秒
解密算法运行时间:1.5005874633789062秒
成功解密: b'hello world'
算法总运行时间:2.3997695684432983秒
1 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.0030488967895507812秒
加密算法运行时间:0.005570888519287109秒
重加密密钥生成算法运行时间:0.07791781425476074秒
重加密算法运行时间:0.006881630420684815秒
解密算法运行时间:0.08786344528198242秒
成功解密: b'hello world'
算法总运行时间:0.18128267526626587秒
4 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.0026373863220214844秒
加密算法运行时间:0.004965305328369141秒
重加密密钥生成算法运行时间:0.07313323020935059秒
重加密算法运行时间:0.006896591186523438秒
解密算法运行时间:0.08880448341369629秒
成功解密: b'hello world'
算法总运行时间:0.17643699645996094秒
rk3399
0.01 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:3.9984750747680664秒
加密算法运行时间:9.599598169326782秒
重加密密钥生成算法运行时间:132.99906015396118秒
重加密算法运行时间:12.120013177394867秒
解密算法运行时间:153.29800581932068秒
成功解密: b'hello world'
算法总运行时间:312.0151523947716秒
0.1 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.09907650947570801秒
加密算法运行时间:0.205247163772583秒
重加密密钥生成算法运行时间:7.498294830322266秒
重加密算法运行时间:0.7300507187843323秒
解密算法运行时间:8.998314619064331秒
成功解密: b'hello world'
算法总运行时间:17.53098384141922秒
1 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.008650541305541992秒
加密算法运行时间:0.02130866050720215秒
重加密密钥生成算法运行时间:0.30187034606933594秒
重加密算法运行时间:0.0274674654006958秒
解密算法运行时间:0.3521096706390381秒
成功解密: b'hello world'
算法总运行时间:0.7114066839218139秒
4 cores
当前门限值: N = 20, T = 10
密钥生成运行时间:0.00883340835571289秒
加密算法运行时间:0.021309614181518555秒
重加密密钥生成算法运行时间:0.3036940097808838秒
重加密算法运行时间:0.0277299165725708秒
解密算法运行时间:0.3464491367340088秒
成功解密: b'hello world'
算法总运行时间:0.7080160856246949秒
12th Gen Intel(R) Core(TM) i5-12490F
当前门限值: N = 20, T = 10
明文长度:110
密钥生成运行时间:0.0033216476440429688秒
加密算法运行时间:0.00811624526977539秒
重加密密钥生成算法运行时间:0.11786699295043945秒
重加密算法运行时间:0.009650790691375732秒
解密算法运行时间:0.12125396728515625秒
成功解密:
算法总运行时间:0.2602096438407898秒
明文长度:1100
密钥生成运行时间:0.0034990310668945312秒
加密算法运行时间:0.008537054061889648秒
重加密密钥生成算法运行时间:0.10165071487426758秒
重加密算法运行时间:0.009756004810333252秒
解密算法运行时间:0.13438773155212402秒
成功解密:
算法总运行时间:0.257830536365509秒
明文长度:11000
密钥生成运行时间:0.0035142898559570312秒
加密算法运行时间:0.005819797515869141秒
重加密密钥生成算法运行时间:0.1130058765411377秒
重加密算法运行时间:0.010429942607879638秒
解密算法运行时间:0.1242990493774414秒
成功解密:
算法总运行时间:0.25706895589828493秒
明文长度:110000
密钥生成运行时间:0.002706289291381836秒
加密算法运行时间:0.00833749771118164秒
重加密密钥生成算法运行时间:0.11022734642028809秒
重加密算法运行时间:0.010864639282226562秒
解密算法运行时间:0.13867974281311035秒
成功解密:
算法总运行时间:0.2708155155181885秒
明文长度:1100000
密钥生成运行时间:0.003710031509399414秒
加密算法运行时间:0.04558920860290527秒
重加密密钥生成算法运行时间:0.10261368751525879秒
重加密算法运行时间:0.009720635414123536秒
解密算法运行时间:0.15311646461486816秒
成功解密:
算法总运行时间:0.3147500276565552秒
明文长度:11000000
密钥生成运行时间:0.008045673370361328秒
加密算法运行时间:0.3575568199157715秒
重加密密钥生成算法运行时间:0.09267783164978027秒
重加密算法运行时间:0.009347784519195556秒
解密算法运行时间:0.4754812717437744秒
成功解密:
算法总运行时间:0.9431093811988831秒
当前门限值: N = 94, T = 47
算法总运行时间:0.967951292687274秒
当前门限值: N = 95, T = 47
算法总运行时间:0.9765587304767809秒
当前门限值: N = 96, T = 48
算法总运行时间:1.019304744899273秒

View File

@@ -1,62 +1,144 @@
from gmssl import Sm3, Sm2Key, Sm4Cbc, DO_ENCRYPT, DO_DECRYPT
from typing import Tuple
"""这个模块实现了椭圆曲线加密(ECC)的基本操作.
它提供了点加法、点乘法和其他与SM2P256V1曲线相关的操作,
并支持可选的Rust实现来提高性能。
"""
import random
import ecc_rs
from dataclasses import dataclass
from typing import Tuple
from gmssl import DO_DECRYPT, DO_ENCRYPT, Sm2Key, Sm3, Sm4Cbc
point = Tuple[int, int]
capsule = Tuple[point, point, int]
try:
import ecc_rs
# 生成密钥对模块
class CurveFp:
def __init__(self, A, B, P, N, Gx, Gy, name):
self.A = A
self.B = B
self.P = P
self.N = N
self.Gx = Gx
self.Gy = Gy
self.name = name
RUST_ECC = True
def add(a: point, b: point) -> point:
"""Add two points on the curve.
sm2p256v1 = CurveFp(
name="sm2p256v1",
A=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC,
B=0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93,
P=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF,
N=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123,
Gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7,
Gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0,
)
Args:
a: first point
b: second point
flag: if 1, use Rust implementation
"""
if RUST_ECC is True and ecc_rs is not None:
return ecc_rs.add(a, b)
A = sm2p256v1.A
P = sm2p256v1.P
return fromJacobian(jacobianAdd(toJacobian(a), toJacobian(b), A, P), P)
# 生成元
g = (sm2p256v1.Gx, sm2p256v1.Gy)
def multiply(a: point, n: int) -> point:
"""Multiply a point by a scalar.
Args:
a: point
n: scalar
flag: if 1, use Rust implementation
def multiply(a: point, n: int, flag: int = 0) -> point:
if flag == 1:
"""
if RUST_ECC is True and ecc_rs is not None:
result = ecc_rs.multiply(a, n)
return result
else:
return ecc_rs.multiply(a, n)
N = sm2p256v1.N
A = sm2p256v1.A
P = sm2p256v1.P
return fromJacobian(jacobianMultiply(toJacobian(a), n, N, A, P), P)
except ImportError:
RUST_ECC = False
ecc_rs = None
def add(a: point, b: point) -> point:
"""Add two points on the curve.
Args:
a: first point
b: second point
"""
A = sm2p256v1.A
P = sm2p256v1.P
return fromJacobian(jacobianAdd(toJacobian(a), toJacobian(b), A, P), P)
def multiply(a: point, n: int) -> point:
"""Multiply a point by a scalar.
Args:
a: point
n: scalar
"""
N = sm2p256v1.N
A = sm2p256v1.A
P = sm2p256v1.P
return fromJacobian(jacobianMultiply(toJacobian(a), n, N, A, P), P)
def add(a: point, b: point, flag: int = 0) -> point:
if flag == 1:
result = ecc_rs.add(a, b)
return result
else:
A = sm2p256v1.A
P = sm2p256v1.P
return fromJacobian(jacobianAdd(toJacobian(a), toJacobian(b), A, P), P)
@dataclass
class CurveParams:
"""Definition of SM2P256V1 curve parameters."""
a: int
b: int
p: int
n: int
gx: int
gy: int
name: str
# 生成密钥对模块
class CurveFp:
"""Definition of SM2P256V1 curve class."""
def __init__(self, params: CurveParams) -> None:
"""Initialize curve with parameters.
Args:
params: Collection of curve parameters
"""
self.A = params.a
self.B = params.b
self.P = params.p
self.N = params.n
self.Gx = params.gx
self.Gy = params.gy
self.name = params.name
curve_params = CurveParams(
name="sm2p256v1",
a=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC,
b=0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93,
p=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF,
n=0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123,
gx=0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7,
gy=0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0,
)
sm2p256v1 = CurveFp(params=curve_params)
# 生成元
g = (sm2p256v1.Gx, sm2p256v1.Gy)
def inv(a: int, n: int) -> int:
"""Return the modular inverse of a mod n.
Args:
a: input integer
n: modulus
Returns:
modular inverse of a mod n
"""
if a == 0:
return 0
lm, hm = 1, 0
@@ -80,7 +162,9 @@ def fromJacobian(Xp_Yp_Zp: Tuple[int, int, int], P: int) -> point:
def jacobianDouble(
Xp_Yp_Zp: Tuple[int, int, int], A: int, P: int
Xp_Yp_Zp: Tuple[int, int, int],
A: int,
P: int,
) -> Tuple[int, int, int]:
Xp, Yp, Zp = Xp_Yp_Zp
if not Yp:
@@ -95,7 +179,10 @@ def jacobianDouble(
def jacobianAdd(
Xp_Yp_Zp: Tuple[int, int, int], Xq_Yq_Zq: Tuple[int, int, int], A: int, P: int
Xp_Yp_Zp: Tuple[int, int, int],
Xq_Yq_Zq: Tuple[int, int, int],
A: int,
P: int,
) -> Tuple[int, int, int]:
Xp, Yp, Zp = Xp_Yp_Zp
Xq, Yq, Zq = Xq_Yq_Zq
@@ -123,7 +210,11 @@ def jacobianAdd(
def jacobianMultiply(
Xp_Yp_Zp: Tuple[int, int, int], n: int, N: int, A: int, P: int
Xp_Yp_Zp: Tuple[int, int, int],
n: int,
N: int,
A: int,
P: int,
) -> Tuple[int, int, int]:
Xp, Yp, Zp = Xp_Yp_Zp
if Yp == 0 or n == 0:
@@ -191,9 +282,9 @@ def KDF(G: point) -> int:
def GenerateKeyPair() -> Tuple[point, int]:
"""
return:
"""return:
public_key, secret_key
"""
sm2 = Sm2Key() # pylint: disable=e0602
sm2.generate_key()
@@ -207,15 +298,15 @@ def GenerateKeyPair() -> Tuple[point, int]:
return public_key, secret_key
def Encrypt(pk: point, m: bytes) -> Tuple[capsule, bytes]:
enca = Encapsulate(pk)
def Encrypt(public_key: point, message: bytes) -> Tuple[capsule, bytes]:
enca = Encapsulate(public_key)
K = enca[0].to_bytes(16)
capsule = enca[1]
if len(K) != 16:
raise ValueError("invalid key length")
iv = b"tpretpretpretpre"
sm4_enc = Sm4Cbc(K, iv, DO_ENCRYPT) # pylint: disable=e0602
enc_Data = sm4_enc.update(m)
sm4_enc = Sm4Cbc(K, iv, DO_ENCRYPT)
enc_Data = sm4_enc.update(message)
enc_Data += sm4_enc.finish()
enc_message = (capsule, bytes(enc_Data))
return enc_message
@@ -231,15 +322,14 @@ def Decapsulate(ska: int, capsule: capsule) -> int:
def Decrypt(sk_A: int, C: Tuple[capsule, bytes]) -> bytes:
"""
params:
"""params:
sk_A: secret key
C: (capsule, enc_data)
"""
capsule, enc_Data = C
K = Decapsulate(sk_A, capsule)
K = Decapsulate(sk_A, capsule).to_bytes(16)
iv = b"tpretpretpretpre"
sm4_dec = Sm4Cbc(K, iv, DO_DECRYPT) # pylint: disable= e0602
sm4_dec = Sm4Cbc(K, iv, DO_DECRYPT)
dec_Data = sm4_dec.update(enc_Data)
dec_Data += sm4_dec.finish()
return bytes(dec_Data)
@@ -247,7 +337,7 @@ def Decrypt(sk_A: int, C: Tuple[capsule, bytes]) -> bytes:
# GenerateRekey
def hash5(id: int, D: int) -> int:
sm3 = Sm3() # pylint: disable=e0602
sm3 = Sm3()
sm3.update(id.to_bytes(32))
sm3.update(D.to_bytes(32))
hash = sm3.digest()
@@ -266,13 +356,14 @@ def hash6(triple_G: Tuple[point, point, point]) -> int:
def f(x: int, f_modulus: list, T: int) -> int:
"""
功能: 通过多项式插值来实现信息的分散和重构
"""功能: 通过多项式插值来实现信息的分散和重构
例如: 随机生成一个多项式f(x)=4x+5,质数P=11,其中f(0)=5,将多项式的系数分别分配给两个人,例如第一个人得到(1, 9),第二个人得到(2, 2).如果两个人都收集到了这两个点,那么可以使用拉格朗日插值法恢复原始的多项式,进而得到秘密信息"5"
param:
x, f_modulus(多项式系数列表), T(门限)
return:
Return:
res
"""
res = 0
for i in range(T):
@@ -282,13 +373,18 @@ def f(x: int, f_modulus: list, T: int) -> int:
def GenerateReKey(
sk_A: int, pk_B: point, N: int, T: int, id_tuple: Tuple[int, ...]
sk_A: int,
pk_B: point,
N: int,
T: int,
id_tuple: Tuple[int, ...],
) -> list:
"""
param:
"""param:
skA, pkB, N(节点总数), T(阈值)
return:
Return:
rki(0 <= i <= N-1)
"""
# 计算临时密钥对(x_A, X_A)
x_A = random.randint(0, sm2p256v1.N - 1)
@@ -369,7 +465,8 @@ def ReEncapsulate(kFrag: tuple, capsule: capsule) -> Tuple[point, point, int, po
def ReEncrypt(
kFrag: tuple, C: Tuple[capsule, bytes]
kFrag: tuple,
C: Tuple[capsule, bytes],
) -> Tuple[Tuple[point, point, int, point], bytes]:
capsule, enc_Data = C
@@ -394,11 +491,10 @@ def MergeCFrag(cfrag_cts: list) -> list:
def DecapsulateFrags(sk_B: int, pk_B: point, pk_A: point, cFrags: list) -> int:
"""
return:
"""return:
K: sm4 key
"""
"""
Elist = []
Vlist = []
idlist = []
@@ -434,7 +530,8 @@ def DecapsulateFrags(sk_B: int, pk_B: point, pk_A: point, cFrags: list) -> int:
E2 = add(Ek, E2)
V2 = add(Vk, V2)
X_Ab = multiply(
X_Alist[0], sk_B
X_Alist[0],
sk_B,
) # X_A^b X_A 的值是随机生成的xa,通过椭圆曲线上的倍点运算生成的固定的值
d = hash3((X_Alist[0], pk_B, X_Ab))
EV = add(E2, V2) # E2 + V2

View File

@@ -0,0 +1,47 @@
import sys
import os
import random
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import add, multiply, sm2p256v1
import time
# 生成元
g = (sm2p256v1.Gx, sm2p256v1.Gy)
def test_rust_vs_python_multiply():
mul_times = random.randint(0, sm2p256v1.N - 1)
# Rust实现
start_time = time.time()
for _ in range(10):
_ = multiply(g, mul_times)
rust_time = time.time() - start_time
print(f"\nRust multiply 执行时间: {rust_time:.6f}")
# Python实现
start_time = time.time()
for _ in range(10):
_ = multiply(g, mul_times)
python_time = time.time() - start_time
print(f"Python multiply 执行时间: {python_time:.6f}")
assert rust_time < python_time, "Rust实现应该比Python更快"
def test_rust_vs_python_add():
# Rust实现
start_time = time.time()
for _ in range(10):
_ = add(g, g)
rust_time = time.time() - start_time
print(f"\nRust add 执行时间: {rust_time:.6f}")
# Python实现
start_time = time.time()
for _ in range(10):
_ = add(g, g)
python_time = time.time() - start_time
print(f"Python add 执行时间: {python_time:.6f}")
assert rust_time < python_time, "Rust实现应该比Python更快"

View File

@@ -1,37 +0,0 @@
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import add, multiply, sm2p256v1
import time
# 生成元
g = (sm2p256v1.Gx, sm2p256v1.Gy)
start_time = time.time() # 获取开始时间
for i in range(10):
result = multiply(g, 10000, 1) # 执行函数
end_time = time.time() # 获取结束时间
elapsed_time = end_time - start_time # 计算执行时间
print(f"rust multiply 执行时间: {elapsed_time:.6f}")
start_time = time.time() # 获取开始时间
for i in range(10):
result = multiply(g, 10000, 0) # 执行函数
end_time = time.time() # 获取结束时间
elapsed_time = end_time - start_time # 计算执行时间
print(f"python multiply 执行时间: {elapsed_time:.6f}")
start_time = time.time() # 获取开始时间
for i in range(10):
result = add(g, g, 1) # 执行函数
end_time = time.time() # 获取结束时间
elapsed_time = end_time - start_time # 计算执行时间
print(f"rust add 执行时间: {elapsed_time:.6f}")
start_time = time.time() # 获取开始时间
for i in range(10):
result = add(g, g, 0) # 执行函数
end_time = time.time() # 获取结束时间
elapsed_time = end_time - start_time # 计算执行时间
print(f"python add 执行时间: {elapsed_time:.6f}")

View File

@@ -0,0 +1,78 @@
import sys
import os
import time
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import (
GenerateKeyPair,
Encrypt,
GenerateReKey,
ReEncrypt,
MergeCFrag,
DecryptFrags,
)
def test_tpre_performance_with_different_message_sizes():
"""测试不同消息大小下的TPRE性能"""
N = 20
T = N // 2
print(f"当前门限值: N = {N}, T = {T}")
for i in range(1, 6):
total_time = 0
# 1. 密钥生成和消息准备
start_time = time.time()
pk_a, sk_a = GenerateKeyPair()
m = b"hello world" * pow(10, i)
print(f"明文长度:{len(m)}")
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"密钥生成运行时间:{elapsed_time}")
# 2. 加密
start_time = time.time()
capsule_ct = Encrypt(pk_a, m)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"加密算法运行时间:{elapsed_time}")
# 3. 接收方密钥生成
pk_b, sk_b = GenerateKeyPair()
# 4. 重加密密钥生成
start_time = time.time()
id_tuple = tuple(range(N))
rekeys = GenerateReKey(sk_a, pk_b, N, T, id_tuple)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"重加密密钥生成算法运行时间:{elapsed_time}")
# 5. 重加密
start_time = time.time()
cfrag_cts = []
for rekey in rekeys:
cfrag_ct = ReEncrypt(rekey, capsule_ct)
cfrag_cts.append(cfrag_ct)
end_time = time.time()
elapsed_time = (end_time - start_time) / len(rekeys)
total_time += elapsed_time
print(f"重加密算法运行时间:{elapsed_time}")
# 6. 解密
start_time = time.time()
cfrags = MergeCFrag(cfrag_cts)
decrypted_m = DecryptFrags(sk_b, pk_b, pk_a, cfrags)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"解密算法运行时间:{elapsed_time}")
# 验证解密结果是否正确
assert decrypted_m == m, f"解密失败,明文长度: {len(m)}"
print("成功解密")
print(f"算法总运行时间:{total_time}")
print()

View File

@@ -3,7 +3,6 @@ import os
import unittest
from unittest.mock import patch, MagicMock, Mock
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
import node

View File

@@ -1,72 +0,0 @@
import sys
import os
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import (
GenerateKeyPair,
Encrypt,
GenerateReKey,
ReEncrypt,
MergeCFrag,
DecryptFrags,
)
import time
N = 20
T = N // 2
print(f"当前门限值: N = {N}, T = {T}")
total_time = 0
# 1
start_time = time.time()
pk_a, sk_a = GenerateKeyPair()
m = b"hello world"
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"密钥生成运行时间:{elapsed_time}")
# 2
start_time = time.time()
capsule_ct = Encrypt(pk_a, m)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"加密算法运行时间:{elapsed_time}")
# 3
pk_b, sk_b = GenerateKeyPair()
# 5
start_time = time.time()
id_tuple = tuple(range(N))
rekeys = GenerateReKey(sk_a, pk_b, N, T, id_tuple)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"重加密密钥生成算法运行时间:{elapsed_time}")
# 7
start_time = time.time()
cfrag_cts = []
for rekey in rekeys:
cfrag_ct = ReEncrypt(rekey, capsule_ct)
cfrag_cts.append(cfrag_ct)
end_time = time.time()
elapsed_time = (end_time - start_time) / len(rekeys)
total_time += elapsed_time
print(f"重加密算法运行时间:{elapsed_time}")
# 9
start_time = time.time()
cfrags = MergeCFrag(cfrag_cts)
m = DecryptFrags(sk_b, pk_b, pk_a, cfrags)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"解密算法运行时间:{elapsed_time}")
print("成功解密:", m)
print(f"算法总运行时间:{total_time}")
print()

View File

@@ -1,5 +1,7 @@
import sys
import os
import time
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import (
@@ -10,26 +12,25 @@ from tpre import (
MergeCFrag,
DecryptFrags,
)
import time
N = 20
T = N // 2
print(f"当前门限值: N = {N}, T = {T}")
for i in range(1, 10):
def test_tpre_full_workflow_speed():
"""测试TPRE完整工作流程的运行速度"""
N = 20
T = N // 2
print(f"当前门限值: N = {N}, T = {T}")
total_time = 0
# 1
# 1. 密钥生成
start_time = time.time()
pk_a, sk_a = GenerateKeyPair()
m = b"hello world" * pow(10, i)
print(f"明文长度:{len(m)}")
m = b"hello world"
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"密钥生成运行时间:{elapsed_time}")
# 2
# 2. 加密
start_time = time.time()
capsule_ct = Encrypt(pk_a, m)
end_time = time.time()
@@ -37,10 +38,10 @@ for i in range(1, 10):
total_time += elapsed_time
print(f"加密算法运行时间:{elapsed_time}")
# 3
# 3. 接收方密钥生成
pk_b, sk_b = GenerateKeyPair()
# 5
# 4. 重加密密钥生成
start_time = time.time()
id_tuple = tuple(range(N))
rekeys = GenerateReKey(sk_a, pk_b, N, T, id_tuple)
@@ -49,10 +50,9 @@ for i in range(1, 10):
total_time += elapsed_time
print(f"重加密密钥生成算法运行时间:{elapsed_time}")
# 7
# 5. 重加密
start_time = time.time()
cfrag_cts = []
for rekey in rekeys:
cfrag_ct = ReEncrypt(rekey, capsule_ct)
cfrag_cts.append(cfrag_ct)
@@ -61,14 +61,15 @@ for i in range(1, 10):
total_time += elapsed_time
print(f"重加密算法运行时间:{elapsed_time}")
# 9
# 6. 合并和解密
start_time = time.time()
cfrags = MergeCFrag(cfrag_cts)
m = DecryptFrags(sk_b, pk_b, pk_a, cfrags)
decrypted_m = DecryptFrags(sk_b, pk_b, pk_a, cfrags)
end_time = time.time()
elapsed_time = end_time - start_time
total_time += elapsed_time
print(f"解密算法运行时间:{elapsed_time}")
print("成功解密:")
print(f"算法总运行时间:{total_time}")
print()
# 验证解密结果
assert decrypted_m == m, "解密结果与原始消息不匹配"
print(f"成功解密: {decrypted_m}")

View File

@@ -1,6 +1,5 @@
import sys
import os
import hashlib
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src")))
from tpre import (
@@ -84,19 +83,15 @@ class TestGenerateKeyPair(unittest.TestCase):
self.assertGreater(secret_key, 0)
# class TestEncryptDecrypt(unittest.TestCase):
# def setUp(self):
# self.public_key, self.secret_key = GenerateKeyPair()
# self.message = b"Hello, world!"
class TestEncryptDecrypt(unittest.TestCase):
def setUp(self):
self.public_key, self.secret_key = GenerateKeyPair()
self.message = b"Hello, world!"
# def test_encrypt_decrypt(self):
# encrypted_message = Encrypt(self.public_key, self.message)
# # 使用 SHA-256 哈希函数确保密钥为 16 字节
# secret_key_hash = hashlib.sha256(self.secret_key.to_bytes((self.secret_key.bit_length() + 7) // 8, 'big')).digest()
# secret_key_int = int.from_bytes(secret_key_hash[:16], 'big') # 取前 16 字节并转换为整数
# decrypted_message = Decrypt(secret_key_int, encrypted_message)
# self.assertEqual(decrypted_message, self.message)
def test_encrypt_decrypt(self):
encrypted_message = Encrypt(self.public_key, self.message)
decrypted_message = Decrypt(self.secret_key, encrypted_message)
self.assertEqual(decrypted_message, self.message)
class TestGenerateReKey(unittest.TestCase):