热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【论文笔记】PrivacyPredictionofLightweightConvolutionalNeuralNetwork

摘要基于云的深度学习的日益普及引发了关于准确预测和数据隐私的问题。以前的研究已经实现了简单神经网络的隐私预测。由于更复杂的神经网络需要更多的计算开销,现有的隐私预测

摘要

基于云的深度学习的日益普及引发了关于准确预测和数据隐私的问题。以前的研究已经实现了简单神经网络的隐私预测。由于更复杂的神经网络需要更多的计算开销,现有的隐私预测方案效率低下。为了解决上述问题,本文介绍了一种可应用于加密数据的轻量级卷积神经网络(CNN)的隐私预测方法。首先,在不影响原有精度的情况下,将复杂的 CNN 剪裁成轻量级网络,可以高效地实现安全预测。其次,采用FV同态加密方案对用户的敏感数据进行加密,CNN中的每一层都是在密文上计算的,从而保护用户的数据隐私。最后,安全分析和实验结果证明了所提方案的隐私保护特性和实用性,在MNIST数据集上的复杂CNN可以达到98%以上的准确率。

1. 介绍

近年来,人们对机器学习和深度学习越来越感兴趣。由于数据量的激增、计算能力和算法的突破,深度学习在各个领域取得了巨大成功,如医疗诊断[6,11]、人脸识别[5,22]和信用风险评估[1,4]。自1996年美国国会通过《健康保险可携带性与责任法案》(HIPAA)以来,用户隐私问题越来越受到关注。随后,各国通过了1974年《支持多重隐私法》、《一般数据保护条例》和其他法案来保护用户的数据隐私。在大数据环境下,用户担心他们的私人信息会被收集,服务提供商也会担心模型的泄露。因此,在保证双方数据隐私的同时,实现基于深度学习的数据分析是一个重要的问题。

对于神经网络,基于同态加密、安全多方计算和差分隐私等密码学工具已经广泛研究了几种隐私保护方案。其中,同态加密允许对密文进行计算生成加密结果,其结果与解密后以明文形式执行的结果相同。然而,目前的同态加密方案有很多局限性。例如,它们只支持整数数据,需要固定的乘法深度或者不能无限期地执行加法和乘法运算。由于同态加密算法的局限性,它们不能直接用于机器学习或深度学习,以支持比较和最大值的操作。安全多方计算是另一种将功能分发给多方的隐私保护工具,每一方都无法获取其他方的数据。最早的安全多方计算是 1986 年由 Andrew Yao [27] 提出的百万富翁问题。

卷积神经网络是一种常用的有监督机器学习算法,通常分为两个阶段:训练阶段和推理阶段。在培训阶段,用户的敏感数据不应泄露给执行模型培训的服务器,而在推理阶段,用户想要预测的敏感数据不应泄露给服务器,服务器拥有的深度学习模型不应泄露给用户。同样,安全卷积神经网络在应用于敏感信息(如医疗数据)时也包括上述两个阶段。目前,卷积神经网络有各种隐私预测方案,以实现安全训练[17,26]和安全推理[9,21]。然而,更复杂的神经网络会带来更大的计算开销,现有的预测方案不适合实际应用。

1.1 主要贡献

为了实现安全高效的隐私预测,我们提出了一种新的带有轻量级卷积神经网络 (CNN) 的隐私预测方法。我们在患者希望使用医院服务器训练的复杂 CNN 对私人图像进行分类的情况下考虑这个问题 。主要贡献总结如下。


  • 受Li等人方案[15]的启发,我们将复杂的CNN裁剪为轻量化CNN,对准确性的影响可以忽略不计,这可以有效地支持数据预测。
  • 我们利用FV同态加密方案[7]对患者的私人图像进行加密,以保护敏感数据的隐私。除softmax层外,CNN中的每一层都是在密文上计算的。

  • 最后,我们分析了所提出的隐私预测方案在 CNN 中的安全性并进行了实验,证明了复杂的 CNN 在 MNIST 数据集上可以达到 98% 准确率的实用性。

1.2 相关工作

近年来,人们提出了几种卷积神经网络隐私预测方案来实现安全训练。Hokri和Shmatikov[24]提出的方法允许双方在本地训练自己的神经网络模型,并有选择地与中央服务器共享某些参数的梯度。安全培训还允许每个数据所有者秘密地将培训数据共享到两个(或更多)无冲突的服务器,如SecureML[17]或SecureRenn[26]。这两种方案都基于同态加密、乱码电路[27]和秘密共享[2,23]。SecureML使用自定义激活函数,这对于使用安全计算协议训练神经网络更有效。

训练神经网络的安全推理也是主要的研究方向。微软提出的加密网[9]使用分级同态加密,可以实现一定数量的密文乘法。考虑到非多项式激活函数和池操作的支持,Rouhani等人[21]提出了DeepSecure框架,该框架使用ARBLED电路作为其主要加密算法。针对不同安全计算协议的特点,提出了许多基于混合协议的安全预测框架。例如,MiniONN框架[16]是基于乱码电路协议提出的,用于执行非线性化功能,并采用基于秘密共享的协议来执行线性操作。Chanelemon框架[20]将GMW协议[10]用于低阶非线性激活函数,并利用乱码电路协议计算更复杂的非线性激活函数。

2. 准备工作

2.1 同态加密

同态加密是一种重要的密码技术,其实现是基于数学难题的计算复杂性理论。同态加密可分为三类:部分同态加密(PHE)、分级同态加密(LHE)和完全同态加密(FHE)。2009年,Gentry [8]通过利用“自举”操作减少同态操作产生的密文噪声,构建了第一个FHE方案。他们的方案可以支持更多层次的同态乘法运算,但“自举”运算效率不高。在此基础上,构造了许多提高计算效率的FHE模式,如基于整数的FHE和基于误差的FHE(环)学习。

本文使用的加密方案是FV同态加密方案[7],它优化了Gentry提出的FHE方案,以提高“自举”操作的效率并减少密文中的噪声增加。FV同态加密方案主要包括五种算法:密钥生成、加密算法、解密算法、同态加法和同态乘法运算。

对于密钥生成算法,用户从环RN2随机选择多项式sk作为密钥:sk←Rn2,我们用a←Rbcto表示多项式环Rbc中的均匀分布随机向量a←χ表示服从标准偏差的高斯分布的随机向量。FV方案中的公钥由两部分组成,pk=(pk0,pk1)=([−(as+e)]q,a),其中a←Rnq,e←χ. 评估键包括两部分sevk=(evk0,evk1)=([−(ai·s+ei)+Ti·sk2],ai),i∈[0,l],i←Rnq,ei←χ、 这是FV方案的基础,l= logTq 

其中,u←Rn2、e1、e2←χ. 

解密是通过计算来完成的:

两个密文上的加法运算sca=(c0a,c1a)和cb=(c0b,c1b)在Rnq中可以得到: 

将两个消息sca=(c0a,c1a)和cb=(c0b,c1b)相乘,我们需要计算:

 

密文由两部分组成,以上三个变量需要重新线性化:

 

解密结果Ca是对应于Ca和Cb的明文的运算结果。有关更多详细信息,请参阅[7]。 

2.2 卷积神经网络

神经网络是一个复杂的模型,由许多不同的神经元层组成,每一层接收来自前一层的输入,并将输出传递给下一层。1962年,Hubel和Wiesel[13]对猫的视觉进行了系统的研究。受此启发,Lecun [14]于1989年提出了卷积神经网络(CNN)。CNN是深度学习的经典算法之一,在图像识别、人脸识别、语音识别和自然语言处理等领域有着广泛的应用。CNN通常包括五层:卷积层、池化层、激活层、全连接层和softmax层。

卷积层。卷积层的作用是提取输入数据的特征,输入数据由多个神经元形成的一组特征映射组成。过滤器对上一层的feature map执行卷积运算,以生成下一层的feature map。滤波器中的每个神经元对应一个权重参数和一个偏置向量。我们用Xi表示卷积层中的第i个特征映射。第l层convolution层接收Nl特征映射作为输入,并在卷积操作后生成Nl+1特征映射。卷积层的操作可以表示为:

其中,⊗表示卷积运算,Wij表示第j个神经元和第i个神经元之间的连接权重。

池化层。池化层通常遵循卷积层。与卷积层一样,池化层也由多个特征映射组成。不同之处在于,池化层中的每个特征映射分别对应于前一层的特征映射。目前有两种主要池操作:最大池化和平均池化。最大池化是选择本地连接域中的最大值,平均池化是取本地连接域的平均值。 

激活函数。在深层神经网络中,相邻两层神经元之间通常存在映射关系。这种映射关系称为激活函数。常见的激活函数包括Sigmoid[12]、tanh[3]和ReLU函数[18]。神经网络中这一层的输出层将传递给下一层神经元。

完全连接层。在CNN中,在组合多组集合层和池层之后,它通常包含几个完全连接的层。一个完全连接的层是两个相邻层中的每个神经元完全连接的层。完全连接层的操作可以表示为:

Softmax层。CNN依靠完全连接的网络对提取的特征进行分类,完全连接层的输出值被传递到softmax层进行分类。softmax函数将(−∞,+∞)k个整数映射到(0,1)中的k个整数,同时确保它们的和为1。 

3. 轻量级CNN的隐私预测方案

在本文中,我们设计了一个具有隐私保护的轻量级CNN预测方案,重点关注安全CNN推理阶段。我们提出的方案主要包括两个实体:用户和云服务器。在这里,我们考虑患者和医院之间的真实场景:患者将其个人加密的健康信息发送到医院,并且医院使用训练的预测模型来预测加密的健康信息;然后将加密的预测结果返回给患者,患者将其解密并获得最终诊断结果。在此过程中,医院无法获取患者的精神信息。同时,由于患者没有使用深度学习模型,因此该模型也为医院提供了保护。

3.1 CNN 裁剪

受Li等人的方案[15]的启发,我们在不影响理论准确性的情况下删减了CNN。在每个滤波器中,每个通道的卷积核的绝对值之和越小,滤波器的重要性越低。每个层选择最不重要的过滤器进行修剪。剪枝方法是在最小化精度损失的同时,从训练模型中删除一些不太重要的滤波器,以提高计算效率。对于CNN修剪,最重要的一点是如何选择需要修剪的过滤器,以及如何判断权重是否冗余。

每个过滤器包含一个或多个通道,每个通道代表一个演化内核。该滤波器的重要性通过每个滤波器中所有通道卷积核的绝对值之和来衡量。对于滤波器的第p个通道,的卷积核中每个权重的绝对值之和可以表示为:

其中k表示卷积核的大小,wi表示卷积核中的每个权重。 

第l层第j个滤波器的所有通道卷积核的绝对值之和可以表示为:

其中,ni表示第l层中滤波器的通道数。

在第l个卷积层中,共有nl+1个过滤器,将Slj(j≤nl+1)的顺序从小到大排序,选择绝对值最小的m个过滤器进行剪枝。 上面介绍了单层卷积层的构造方法。 在对多个卷积层的过滤器进行剪枝时,每一层都被认为是独立的,即每一层都按照单层过滤器的方法进行剪枝。 

3.2 预处理阶段

CNN中参数的数据类型通常是实数,例如NIST数据集。当用作输入层时,每个图片的像素位于[0,255]之间或转换为[0,1]之间的浮点数。然而,FV同态加密方案的明文空间不是整数字段或实数字段,而是多项式商ringRnt=Zt[x]/(xn+1),而密文空间Rnq=Zq[x]/(xn+1)。要使用同态加密,我们需要对输入数据和模型参数进行编码,并将整数或浮点数映射到明文空间。

整数编码。选择B=2,我们可以对−(2n−1)≤A.≤2n−1.首先,| a |由n位二进制表示asan表示−1.a1a0。具体编码公式如下:

浮点编码。我们将实数乘以一个比例因子,将小数转换成整数,然后用与上面整数相同的方法进行编码。具体公式如下:

CRT批处理。在同态加密方案中,通常使用称为单指令多数据(SIMD)[25]的批处理技术。一般来说,它将模块打包为明文多项式。批处理操作需要多项式顺序和明文空间系数modu lust,要求为素数和t≡1(mod2n)。如果将多项式选择为xn+1,则意味着可以将具有模的九个数压缩在多项式中。这种方法称为中国剩余定理批处理(CRT批处理)[19]。

3.3 CNN密文计算

原始CNN经过训练以获得修剪后的CNN,而轻量级CNNI用于隐私预测。由于只对滤波器进行了修剪,因此它类似于普通的CNN,仍然由卷积层、激活层、池层和完全连接层组成。请注意,在预测阶段,我们不使用softmax层,因为它不会影响预测结果。然后,我们将分不同层次解释密文计算过程。由于FV同态加密的明文空间和密文空间都是多项式,因此在预测密文之前,输入样本已被编码和加密,而神经网络参数仅被编码。

卷积层。在卷积层上计算密文,输入的是加密的图片。用FV加密的图片中的每个元素用[·]表示,权重用WI表示。密文上的卷积运算可以表示为:

其中,∑表示密文累积操作,⊗表示卷积运算。Xj是第j层特征映射输入,yi是第i层特征映射输出,wij表示卷积运算中使用的卷积核。客户端对图片[X]进行加密并上传到服务器,服务器对密文执行卷积操作。 

激活功能。在CNN模型中,卷积层和完全连接层都是线性层,执行线性运算。如果没有非线性函数,无论神经网络有多深,网络逼近的效果都是一样的。常用的激活函数包括Sigmoid、ReLU、tanh函数及其一些变体,但它们都是非线性运算,无法计算同态加密算法。我们的方案选择平方函数作为激活函数。平方函数是一个非线性函数和一个低阶多项式,可以提高效率。

 

池化层。最大池化和平均池化是CNN中两种常见的池操作,但它们都是非线性的,不能使用同态加密方案进行操作。在cryptonets[9]中选择了一个特殊的池层,它可以替代最大池层的操作。最大函数可以表示为: 

与密文对应的操作可以表示为:

 

其中k是对应于过滤器大小的密文像素数。 

为了减少同态乘法运算,d应尽量小,有意义的最小值为d=1。此时的结果是平均池化函数的标量倍数,即滑动窗口中密文的总和。 在同态加密运算中,不能进行除法运算。 获得平均池化结果。 平均时,我们考虑乘以一个因子而不是除法。 池化操作可以表示为:

·表示向下取整函数,P[·]表示处理实数因子的CRT批量编码。缩放后的池化层操作仅包括密文加法和密文与明文的乘法,可以执行FV加密算法。

全连接层。在CNN中,在组合了多个集合的集合层和池层之后,它通常包含几个完全连接的层。在完全连接的层中,两个相邻层中的每个神经元都是完全连接的。全连接层的操作可以表示为:

 

 

4. 安全性分析

模型场景涉及两个实体:用户和服务器。用户拥有原始数据,服务器拥有CNN中的加权参数。在此场景中,CNN模型的结构、激活函数的类型和池层不受保护。也就是说,神经网络每一层的类型和神经元的数量已经公开了。对于用户而言,不应披露其输入信息,但输入的大小不受保护。对于云服务器,他不希望自己的模型参数被泄露。

用户首先对原始数据进行编码,然后使用FV完全同态加密方案[7]对编码后的数据进行加密,最后将加密后的数据上传到云服务器。云服务器拥有训练有素的CNN,CNN已经被删减。然后云服务器执行NN预测操作。由于在云服务器计算过程中,用户输入的数据一直保持在iPhone文本状态,因此用户的输入内容受到FV同态加密的保护。该方案设计的神经网络上的所有操作均基于FV同态加密方案,并受密码学保护。云服务器预测加密数据后,结果将返回给用户。用户使用其私钥解密,并获得最终结果。在整个过程中,用户不需要进行计算,自然无法知道云服务器模型中的参数,因此服务器上的CNN得到了保护。

5. 实验结果

通过两组不同参数的实验,我们在FV同态加密下实现了CNN预测方案,并将其与加密网进行了比较[9]。

5.1 训练有素的CNN

我们使用MNIST数据集1,其中包含70000张灰度手写数字图片,其中60000张用于培训,10000张用于测试。每张图片是一张28×28像素的样本图片,通道为1。每个样本包括784个特征,每个特征的值介于[0255]之间。用于实验的计算机是Windows 10操作系统,带有a3。5 GHz Intel(R)Core(TM)i3-4150 CPU和4 GB RAM。经过充分培训后,我们使用的CNN如下:

(1)卷积层1:输入图像的大小为1×28×28。进化核的大小为1×3×3,步长为(1,1),映射计数为5。该层的输出为5×28×28。

(2)平均池化层1:该层有2×2个窗口,该层的输出为5×14×14。

(3)激活层1:该层使用方形激活函数,输出大小与输入大小相同,均为5×14×14。

(4) 卷积层2:输入大小为5×14×14。卷积核的大小为5×3×3,映射计数为8。该层的输出为8×14×14。

(5) 平均池化层2:该层有2×2个窗口,该层的输出为8×7×7。

(6) 卷积层3:输入大小为8×7×7。卷积核大小为8×3×3,映射计数为10。该层的输出为10×7×7。

(7) 激活层2:激活函数使用平方函数,输出大小与输入大小相同,均为10×7×7。

(8) 全连接层1:输入尺寸为10×7×7,输出尺寸为100×1。

(9) 全连接层2:输入尺寸为100×1,输出尺寸为10×1。

(10) Softmax层:多分类任务中的分类和规范化。

使用MNIST数据集时,将batchsize设置为64,epoch设置为20,Learning rate设置为0.01。使用Pytorch存储训练模型,初始训练CNN模型的大小为46 KB。训练和二传测验的准确率分别为98.33%和97.52%。图1所示的CNN是修剪前的进化神经网络。

5.2 CNN 修剪过程 

第二步是修剪前一步训练的模型,预先设置要修剪的卷积层,每个卷积层依次用2、3和3个过滤器进行修剪。每个卷积层所需的剪枝数是为了满足FV同态加密,在执行密文操作时不会产生过多的噪声,并避免无法解密的情况。每个卷积层修剪的过滤器编号如表1所示。然后,图2展示了修剪过的CNN。

 

修剪CNN后,测试集的准确率为79.23%。我们还对重量进行了微调,然后进行训练以获得最终的CNN。微调训练使用epoch=10,学习率为0.01。微调后的CNN模型大小为28 KB,列车组的准确度为98.11%,测试组的准确度为98.64%。

5.3 密文图像预测

在预测阶段,不使用softmax层,不影响预测结果。 在进行密文图像预测之前,需要对输入数据和模型参数进行预处理。 设置多项式模数n、系数模数q和明文模数t。 由于FV方案[7]中参数选择的不同,同态运算的效率会有所不同。 选择两组不同的参数分别进行实验。 并将 CryptoNets 方案 [9] 在相同的实验环境中重现,并进行对比实验。

第一组参数是:n=4096,(q,t)对的集合是:(2191−2589751,40961),(2191−491527,65537),(2191−2232751,114689),(2191−2309565,147457),(2191−15131401,188417). 当我们使用CRT批处理时,我们需要将批处理大小设置为4096,即同时处理4096个样本图片。第二组参数选择一个较大的参数,n=8192,t1=109951122689,t2=1099512004609,q=2383−233+ 1. 实验结果如表2所示。

 

与加密网[9]相比,我们的方案使用了更复杂的CNN。该方案的预测精度与加密网方案相似,但是预测时间略有增加。由于CNN的复杂性,FV加密方案中的同态运算会增加,但该方案适用于复杂的CNN。可以提取的特征比较复杂,功能也比较强大。

6. 结论

为了解决云服务器卷积神经网络预测的隐私问题,我们利用李等人的剪枝思想,提出了一种适用于同态加密的轻量级卷积神经网络结构的隐私预测方案。 修剪神经网络。 我们采用FV同态加密设计了一种卷积神经网络中各层密文运算的计算方法。 与现有工作相比,我们提出的方案更趋于安全和实用。 


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • TensorFlow入门上
    前置准备在阅读本文之前,请确定你已经了解了神经网络的基本结构以及前向传播、后向传播的基本原理,如果尚未了解,可以查看下文。神经网络初探​chrer.com也可以直接在我博客阅读Te ... [详细]
  • 【历史上的今天】1 月 8 日:谷歌推出 Google Pay;Quibi 的重生;平衡二叉树的发明者出生
    整理|王启隆透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。今天是2022年1月8日,在1942年的今天,英国理论物理学家霍金(StephenHawking)出生;霍金在 ... [详细]
  • 加工|机床_工业4.0 资产管理壳学习笔记应用场景与架构
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了工业4.0资产管理壳学习笔记-应用场景与架构相关的知识,希望对你有一定的参考价值。        资产管理壳ÿ ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
  • 分类与聚类
    一:分类1:定义分类其实是从特定的数据中挖掘模式,做出判断的过程。分类是在一群已经知道类别标号的样本中,训练一种分类器 ... [详细]
  • 武汉市正式发布促进元宇宙创新发展实施方案
    武汉市正式发布促进元宇宙创新发展实施方案 ... [详细]
author-avatar
lqk
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有