隐私计算迎来千亿级风口,一文讲清它的技术理论基础

一、安全多方计算

在讨论安全多方计算(下文使用 MPC) 之前,我们先讨论安全多方计算的设定,在MPC 的所有参与者中,某些参与者可能会被一个敌手 (攻击者) 控制,在敌手控制下的参与者被称为被腐化方,它在协议执行过程中会遵循敌手的指令对协议进行攻击。一个安全的协议应经得起任何敌手的攻击。为了正式描述和证明一个协议是“安全”的,我们需要对MPC的安全性进行精准定义。

1.安全性

安全多方计算的安全性规范是通过一种理想世界/现实世界的范式 (Ideal/Real Paradigm)来定义的。在理想世界中,存在一个可信的第三方 (Trusted Third Party,TTP),每个参与方将各自的秘密数据通过安全信道提供给可信第三方,由第三方在联合的数据上进行函数的计算,在完成计算后,可信第三方把输出发给各个参与方。由于在计算过程中,每个参与者唯一可执行的动作是将秘密数据发送给可信第三方,因此,攻击者唯一可执行的是选择被腐化参与者的输入,且攻击者除能获得计算结果以外,不能得到其他任何信息。
与理想世界相对应的是现实世界,现实世界中不存在可信第三方,参与者在没有任何外部节点帮助下参与协议执行,且部分参与者可能被攻击者“腐化”或存在合谋。因此,现实世界中的一个安全协议,需要经受它在现实世界的任竟敌手的攻击,当在理想世界中存在同样敌手攻击时,敌手与诚实参与者在理想世界执行中的输入/输出数据的联合分布与现实世界执行中的输入/输出数据的联合分布在计算上不可区分,即在理想世界中模拟了现实世界的协议执行。
理想世界/现实世界范式是为了确保满足“安全性”所隐含的多个属性。

  1. 隐私:任何一方都不应该获取超过它规定的输出,特别是不应该从输出信息中获取其他合作方的输入信息。攻击者在理想世界中获取不到任何除被腐化方输出以外的其他信息,那么在现实世界中也同样如此。
  2. 正确性:保证每一方收到的输出都是正确的。诚实参与者在现实世界所得到的输出与理想世界从可信第三方得到的输出是相同的。
  3. 输入独立性:被腐化的参与者所选择的输入必须与诚实参与者输人无关。在理想世界的协议执行中,被腐化参与者在发送输入给可信第三方时,无法获取诚实参与者的任何输入信息。
  4. 保证输出:被腐化的参与者不应当具备阻止诚实参与者获取输出的能力。
    5)公平性:当且仅当诚实参与者获取输出时,被腐化的参与者才能获取输出,即不存在被腐化参与者获取了输出而诚实参与者未获取输出的情况。在理想世界中,可信第三方总是将输出返回给所有参与者。因此可以保证输出和公平性。这也意味着在现实世界中,诚实参与者得到与理想世界同样的输出。

2.参与者

我们需要对 MPC 的参与者进行定义:MPC 的参与者是指参与协议的各方,每个参与者可被抽象为具有概率多项式时间算法 (Probabilistic Polynomial Time Algorithm,PPT Algorithm)的交互图灵机。根据协议执行过程中的敌手对参与者的控制能力/权利,可将被腐化参与者分为三种敌手类型。

  1. 半诚实敌手:这类参与者会按照协议的要求执行各个步骤。然而,半诚实敌手会设法获取所有协议执行过程中的信息 (包括执行脚本和所有接收到的消息),并试图推导额外的隐私信息。
  2. 恶意敌手:这类参与者在执行协议过程中,完全按照攻击者的指令执行协议的各个步骤,不仅会将所有的输入、输出,以及中间结果泄露给攻击者,还会根据攻击者的意图改变输入信息、伪造中间及输出信息,甚至终止协议。
  3. 秘密敌手:这种类型的敌手可能对协议进行恶意攻击,一旦它发起攻击,有一定的概率会被检测到。如果没有被检测到,那么它就可能完成了一次成功的攻击 (发起攻击是为了获取额外的信息)。

因此,根据安全多方计算协议中的不同参与者在现实世界的攻击行为,可将协议的安全模型进行如下划分。

1)半诚实模型 (The Semi-Honest Model):在协议执行时,参与者按照协议规定的流程执行,但是可能会被恶意攻击者监听并获取到在协议执行过程中自己的输入、输出,以及在协议运行过程中获得的信息。
2)恶意模型 (The Malicious Model):在协议执行时,攻击者可以利用在其控制下的参与者,通过不合法的输入或者恶意篡改输入等方法来分析诚实参与者的隐私信息,还可以通过提前终止和拒绝参与等方式导致协议终止。
另外,根据敌手何时及如何控制参与方,可以将敌手的腐化策略分为下列三种模型。
1)静态腐化模型 (Static Corruption Model):在该模型中,在协议开始之前,由敌手固定控制一组合作方。诚实的合作方始终是诚实的,腐化的合作方始终是腐化的。
2)自适应腐化模型 (Adaptive Corruption Model):敌手能够自主决定什么时间对哪个参与者进行腐化,需要注意的是,一旦一个参与者被腐化,它将始终保持腐化状态。
3)主动安全模型(Proactive Security Model):诚实参与者可能在某一段时间被腐化,被腐化参与者也可能在某一段时间变为诚实参与者。主动安全模型是从一个可能存在入侵网络、服务或设备的外部敌手的角度来讲的,当网络被修复时,敌手失去了对机器的控制,被腐化的参与者变为诚实参与者。

在现实世界中,MPC 协议不是孤立运行的,通常是对协议进行模块序列化组合或与其他协议并行 (运行) 组合得到一个更大的协议来运行。

有研究证明,如果一个 MPC 协议在一个更大的协议中按序列运行,则它仍然遵守现实/理想世界范式,即存在一个可信第三方执行该协议并输出对应结果。这个理论被称为“模块化组合”,它允许使用安全子协议以模块化的方式构造更大的协议,以及分析一个使用MPC 进行某些计算的更大的系统。
对于协议并行运行的情况,当有其他协议与当前协议并行运行时,若该协议不需要其他并行协议发送任何消息,则可将该假设称为协议的独立设定,它也是 MPC 安全性的基本安全定义。在独立设定下,一个并行运行的协议与可信第三方执行的行为一样。
最后,在一些其他场景中,MPC 协议可能与该协议的其他实例,或其他 MPC 协议,抑或其他不安全协议并行运行,协议实例可能需要与其他实例进行交互,此时该协议的运行可能是不安全的。协议在理想世界中不包含与其他协议 (功能函数) 的交互,而在现实世界中需要与另一个功能函数进行交瓦,与理想世界的模拟存在不同的执行条件 (可将此时的现实世界称为混合世界)。在这种情况下,主流的方式是采用“通用组合”(Universal Composability) 进行安全定义,在此定义下,任何被证明是安全的协议都被保证按照理想的行为执行,而不论它与其他任何协议是否并行执行。
MPC 的安全定义具有重要作用,具体地讲,如果一个 MPC 协议在现实世界是安全的,那么对于一个使用 MPC 协议的从业人员,他可以仅考虑该 MPC 协议在理想世界中的执行情况,即对于非密码学的 MPC 协议的使用者,可以不考虑 MPC 协议如何运行,或者该协议是否安全,因为理想模型对 MPC 的功能提供了更清晰和更简单的抽象。
尽管理想模型提供了简单的抽象,但有些情况下容易产生如下问题。

  1. 在现实世界中,敌手可能输入任何值,且 MPC 协议没有通用的解决方案来防止这种情况。例如,对于“百万富翁”问题,敌手可以任意输入被腐化参与者的财富量 (比如直接输入最大值),那么敌手腐化方永远是“胜利”的一方。如果一个 MPC 协议的应用依赖于参与者的正确输入,那么需要通过其他技术增强/验证参与者输入的正确性。
  2. MPC 协议仅保证计算过程安全,而无法保证输出安全。MPC 协议的输出结果在各参与者揭秘之后,给出的输出结果可能会透露其他参与者的输入信息。例如,需要计算两个参与者薪资的平均数,MPC 协议可以保证除输出平均薪资以外不会输出任何其他信息。但是,其中一个参与者完全可以根据自己的薪资和平均薪资,计算出另一个参与者的薪资。因此,使用 MPC 并不意味着所有信息都能受到保护。

在实践过程中,考虑到 MPC 的计算和通信开销问题,通常会以半诚实模型为主要安全设定。因此,本书中讨论的 MPC 协议也主要以半诚实模型的协议为主,虽然部分 MPC 协议可以同时支持半诚实和恶意安全性,但本文仍主要关注 MPC 协议的半诚实设定。

二、密码学

密码学是隐私计算技术的重要基础,在隐私计算的各个技术路线中经常被使用。密码学理论体系非常庞大且复杂,感兴趣的读者可参考《现代密码学及其应用》等图书扩展学习,本文仅对密码学的基础知识和隐私计算中常用密码学原语进行简单介绍。
在MPC 协议中,经常会使用两种数据加密方式:对称加密和非对称 (公钥) 加密。

  1. 对称加密是应用较早的加密算法,其技术成熟。因为加密和解密使用同一个密钥,所以它被称为对称加密。常见的对称加密算法有 DES、AES、IDEA 等。
  2. 非对称加密也叫作公钥加密。与对称加密不同的是,非对称加密算法需要两个密钥:公 (public key) 和私钥 (private key),且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。通常使用公钥对数据进行加密,使用私钥进行解密。非对称加密还有另一种用法,即数字签名,使用私钥对数据进行签名,使用公钥进行验签。数字签名可以让公钥持有者验证私钥持有者的身份并且防止私钥持有者发布的内容被篡改。常见的非对称加密算法有 RSA、EIGamal、D-H、ECC 等。

1.椭圆曲线加密

椭圆曲线加密是一种公钥加密技术,它常常与其他公钥加密算法结合以得到对应椭圆曲线版本加密算法。通常认为,椭圆曲线可以使用更短的密钥而达到更高的安全性。
椭圆曲线加密是将实数域上的椭圆曲线加法群限制在素数域内,基于离散对数困难问题构造的加密算法。实数域上的一个椭圆曲线通常可通过一个二元三次方程定义,以常用的Weierstrass椭圆曲线方程为例:
在这里插入图片描述
其中,a、b 为可配置参数。该椭圆曲线方程对应的所有解 (二维平面在该方程对应曲线上所有的点)再加上一个无穷远处的点0 (群的单位元,0 点)构成该椭圆曲线的元素集合。在这些点的集合上,再定义对应的满足封闭、交换、结合性质的加法计算和逆元计算,即可构成椭圆曲线加法群。通过修改椭圆曲线不同的参数a、b,即可得到不同的圆曲线群,如图所示。

在这里插入图片描述

对于椭圆曲线上的两个点 P、Q,首先定义经过两个点的直线以及与椭圆曲线的交点 R,P与Q在椭圆曲线上的加法结果为 R 关于x轴的对称点。这个加法操作定义包含了多种情况,如图所示。
图片

  1. P、Q 不是切点且不互为逆元,则有第三个交点 R,此时 P+Q=-R。

  2. P或Q为切点 (假设为 0),此时 P与0连接后的线称为切线,则定义 R=O,此时P+Q+Q=0。即加法结果为 P+O=-Q。

  3. 若 P与Q的连线垂直于x轴,此时连线与椭圆曲线没有交点,则认为交点位于无穷远处,即 P+Q=0。

  4. 若 P=Q,则此时认为连线为椭圆曲线在 P 点的切线;若该切线与椭圆曲线有交点R,则结果为-R,否则认为交点为无穷远处点。

椭圆曲线的加法具体到实现上,则是先计算 P与Q连线的斜率

图片

然后根据韦达定理计算交点 R的坐标

图片

若P和Q为同一点,其斜率计算修改

图片

然后按照上式计算 R的坐标

椭圆曲线的标量乘法 (或称多倍点运算) 可以通过点的多次相加实现,如nP表示对n个P点进行加法:
图片

由于椭圆曲线加法群满足交换律和结合律,因此可通过 Double-and-Add 算法进行优化。

在将椭圆曲线加法群应用到加密时,通常需要将椭圆曲线的元素限制在一个素数域图片内,于是可基于其标量乘法构造离散对数难题。素数域的椭圆曲线定义如下:
在这里插入图片描述

图片a=-1,b=3 的一个素数域椭圆曲线点分布如图:

对于定义在素数域图片上的椭圆曲线的点,其坐标的加法和标量乘法与实数域计算规则一样,但所有的计算均需要在素数域E进行。如图1-3 所示的 P点 (16,20)与0点(41.120)的交点为 R (86,46)在素数域F定义下的 PO 直线上[素数域下。上的直线定义为所有满足 ax+by+c三0(modp)的点T,其加法结果-R(86,81)。
同样,根据加法计算规则,可得到素数域的标量乘法,当标量 n 很大时,计算 Q=nP后,将Q点作为公钥,n 作为私钥,已知P、Q计算n 就构造了素数域圆曲线的离散对数难题。显然,若 n 定义在整数域,则P 的标量乘法所遍历得到的点集构成了该椭圆曲线的循环子群,为保证安全性,需要使 P的标量乘法覆盖的点足够多(子群的阶足够大),因此需要找到一个元素阶较高的基点。
寻找基点的一个简单方法是,首先根据椭圆曲线的阶N确定子群的阶n(需要为素数),计算余因子h=N/n,然后在椭圆曲线中随机选择点 P,计算 G=hP,若 G=0,则重新选择点,否则点 G 即为基点。
有多个主流的被认为安全的椭圆曲线及参数可供选择,如比特币签名中的椭圆曲线secp256k1、curve25519等;在开源框架FATE 中,实现了扭曲爱德华曲线Edwards25519。

三、密文计算

若经过加密的密文可进行直接计算,则可将对应的加密技术称为同态加密。“同态”的概念来自于抽象代数中的同态映射,它是指两个代数系统(群/环/域)之间能保持运算的一类映射,即对于代数系统图片,若经过某个映射图片后,对图片,有F(A·B)= F(A)XF(B),则可称F为A到B的同态映射。
若一个明文经过某种加密算法,其密文进行与明文“对应的”密文运算后,解密得到与明文运算相同的结果,则可认为该加密算法具有同态性质,即可对明文进行同态加密。同态加密根据支持的计算类型和支持程度,可分为三种类型:半同态加密 (Partially Homomorphic Encryption,PHE)、近似全同态加密 (SomeWhat Homomorphic Encryption,SWHE) 和全同态加密 ( Fully Homomorphic Encryption,FHE)。

(1) 半同态加密

半同态加密是指只支持加法或乘法运算的加密算法,可分别称为加法同态和乘法同态。常见的半同态加密算法包括RSA、EIGamal、ECC-EIGamal、Paillier,其中 RSA 和EIGamal具有乘法同态性质,ECC-EIGamal和Paillier具有加法同态性质。Paillier 是常用的一个半同态加密算法。它依赖于复合剩余类的困难问题构造,经过多年研究,已被证实非常可靠,且在多个开源隐私计算框架中经常被使用。下面将对 Paillier 原理做简要介绍。

一个 PHE 通常包含以下几个功能。

  1. KeyGen():密钥生成,用于产生加密数据的公钥 pk 和私钥 sk,以及一些公共参数( public parameter)。

  2. Encrypt():加密算法,使用pk 对用户数据 m 进行加密,得到密文 (ciphertext) c。

  3. Decrypt():解密算法,使用 sk 对密文c解密,得到数据原文 (plaintext) m。

  4. Add():密文同态加法,输入两个密文 c1、c2,进行同态加运算。

  5. ScalaMul():密文同态标量乘法,输入 c 和一个标量 s,计算c与标量乘的结果。

(2) 近似全同态加密

近似全同态加密 (有限级数同态加密)是同时支持密文加法和密文乘法的加密算法,但它往往仅能支持有限级数的密文乘法。近似全同态加密是大部分全同态加密的基础。全同态加密算法往往会在近似全同态加密方案上加人一个自举(Bootstraping)或渐进式的模数切换 (Modulus Switching)。全同态加密算法起源于 2009年 Gentry 提出的方案,通过对近似全同态加密算法加入自举操作,控制运算过程中噪声的增长。自举方法是指通过将解密过程本身转化为同态运算电路,并生成新的公私钥对,对原私钥和含有噪声的原密文进行加密,然后用原私钥的密文对原密文的密文进行解密的同态运算,其可得到不含噪声的新密文。

(3) 全同态加密

Gentrv于2009年提出一种基于电路模型的全同态加密算法,它仅支持对每个比特进行加法和乘法同态运算(布尔运算)。目前主流的同态加密方案基于格上 LWE Learning With Errors)/Ring-LWE (RLWE) 问题构造,LWE/RLWE 都可以规约到基于格上的困难问题【如最短线性无关向量 (SIVP) 问题】,然而LWE 问题中涉及矩阵与向量的乘法,计算较复杂,而基于 RLWE 的问题仅涉及环上多项式的运算,具有更小的计算开销。因此,虽然主流的同态加密算法 (如BGV、BFV 等)都可同时基于LWE/RLWE 构造,但在实现上会以RLWE 为主。另外,Cheon 等人在 2017 年提出了一种浮点数的全同态加密方案–CKKS,该方案支持针对实数或复数的浮点数加法和乘法同态运算,得到的计算结果为近似值,它通常适用于机器学习模型训练等不需要精确结果的场景。
伪随机函数
隐私计算中另一个被广泛使用的密码学原语为伪随机函数 (Pseudo Random Function)。一个伪随机函数是一个形如 y= F(k,x)的确定性函数,其中是密钥空间K 的一个密钥,x 是输人空间X的一个元素,y 是输出空间Y上的一个元素。其安全性要求:给定一个随机密钥k,函数 F(k,·)应该看上去像一个定义在X到Y的随机函数。Oded 等人证明了通过伪随机数生成器可构造伪随机函数。

四、机器学习

从隐私计算根据其保护的计算过程来看,有一大类是隐私保护的机器学习。机器学习根据其学习方式通常可分为三种类型:监督学习、半监督学习和无监督学习。
监督学习是在给定带标签/标记训练数据下的学习方式,其目标是在给定的训练数据集中学习到一个模型(函数),当新数据出现时,可根据这个函数给出预测结果。常见的监穆学习算法包括朴素贝叶斯、逻辑回归、线性回归、决策树、集成树、支持向量机、(深度)神经网络等。然而,很多实际问题中,因为对数据进行标记的代价有时很高,所以通常只能拿到少量标签数据和大量的无标签数据。半监督学习是在给定较少带标签训练数据和大量无标签数据下的学习方式,它使用无标签数据来获得数据结构更多的信息,其目标是要得到比单独使用带标签数据训练的监督学习技术更好的结果。常见的半监督学习策略包括 selftraining、PU Learning、Co-training 等。无监督学习中的常见任务有聚类、表示学习和密度估计。这些任务都是希望在无明确提供的标签的情况下了解数据的内在结构。常见的无监督学习算法包括 k-means 聚类、主成分分析和自动编码器等。由于没有提供标签,因此在多数无监督学习算法中没有用于比较模型性能的具体方法。
在实际应用中,监督学习应用范围比较广,因此本文以监督学习为主对一些基本概念进行介绍。

1.损失函数

监督学习通常给出带标签训练数据 (x,y),x作为输入数据,通常由一个向量表示,向量的每个元素称为特征;y为模型需要学习的输出数据,通常也称为标签。训练数据一般由多条 (x,y) 数据组成,每条 (x,y) 数据被称为一个样本,所有样本的输入组成输入空间/特征空间X,所有输出标签组成输出空间 Y。根据输出空间的分布,可将监督学习划分为分类模型和回归模型,分类模型通常根据输出标签 y的基数分为二分类模型和多分类模型.
因此,监督学习的目标是通过一个学习算法,在训练集 X×Y 上找到一个模型f(x,w)使模型图片得到的预测值图片与真实输出值一致。然而,模型的预测值图片可能与y一致或不一致。因此,需要使用一个损失函数来量化模型预测值图片与真实值y的差异(一般称图片-y为残差)。损失函数 L(y,f(x,w))是一个非负实值函数,需要根据监督学习的任务类型进行不同定义。常用的损失函数包括 0-1 损失函数、平方损失函数、对数损失函数、交叉损失函数、合页损失函数等。然而,前面的损失函数仅仅是定义在训练数据集上的期望损失,通常被称为经验损失或经验风险,只有当样本数量趋于无穷大时,才可认为其损失是期望的损失 (通常也被称为期望风险)。当模型参数复杂而训练数据较少时,可能会存在模型在训练数据上预测正确性很高,而在训练集外的未知数据集上预测正确性较低的现象,这种现象被称为“过拟合”。为了防止“过拟合”现象,通常会在经验损失基础上加入参数正则化项(正则化损失),限制模型参数对的复杂度,这个新的损失函数可称为结构化损失函数(或结构风险函数)。

2.梯度下降

在定义了损失函数之后,便可以通过优化方法寻找模型参数图片,使损失值不断下降,损失值越低,则可认为模型预测值图片与真实输出值y之间的差异越小。一种常见的参数优化方法是梯度下降法,对于每次训练迭代,先计算损失函数对参数的梯度 (一阶连续偏导数),用梯度的反方向 (梯度的负数) 乘以一定步长 lr(学习速率),对参数进行更新:
图片

步长lr 可以固定为一个比率,也可以通过各类优化器计算得到一个自适应的比率。梯度下降按照训练样本的选取策略可分为随机梯度下降 (每次随机选取一个样本)、批量梯度下降(每次使用所有样本)和小批量 (mini batch) 梯度下降(每次按顺序选取一批样本)。

在联邦学习中,有标签一方可直接计算梯度,在无标签一方,梯度必须在密态方式下计算,可通过有标签一方对残差进行同态加密并发送给无标签一方计算,也可以通过 MPC 方式联合计算。

3.深度学习

深度学习是近年来非常流行的一种机器学习方法。与传统机器学习相比,深度学习主要采用深度神经网络作为特定模型结构,通过对网络结构的层结构、层连接方式、连接权重采样、单元结构、激活函数、学习策略、正则化等多种方式优化,实现远超传统机器学习的模型性能。多种经典的深度学习技术被广泛采用,包括卷积神经网络 (Convolutional Neural Networks,CNN)、图卷积神经网络 (GCN)、Dropout、Poling、长短期记忆网络 (LongShort-Term Memory,LSTM)、RNN、GRU、残差网络、DQN、DDQN、Batch Normalization.Layer Normalization、 Attention 、Transformer 等。
由于深度学习模型复杂、参数量大,而隐私计算中很多计算涉及密文计算,因此,在实际应用中,通常会使用网络层级更少、结构更为简单的神经网络,如 CNN、Dropout、Pooling、Batch Normalization、Layer Normalization 等。隐私计算中有多种实现方案,如在联邦学习中,通常首先会在参与方本地进行神经网络的前向计算,然后在协调节点上进行梯度计算,最后在各本地进行网络的反向传播。MPC 实现的深度神经网络则通常将模型参数和数据进行秘密共享,进行全密态的训练或预测。基于全同态加密的方案 CKKS 可直接在全密态下(数据加密或模型加密) 进行网络的训练和预测,且可以满足模型和数据的完全分离。

五、图书推荐

图片

隐私计算是指在保护数据本身不对外泄露的前提下,实现数据共享、分析、计算、建模的技术集合,以达到对数据“可用、不可见”的目的。隐私计算涉及多个学科和技术体系,从实现所使用的技术上看,包含三个主要技术路线:联邦学习、安全多方计算和可信执行环境。
本书主要介绍联邦学习和安全多方计算两种技术路线,在讲解理论知识的基础上结合开源架构进行代码分析、安装和运行。第1章介绍隐私计算所需基础理论知识;第2章根据联邦学习建模流程结合开源框架FATE进行介绍;第3~5章介绍安全多方计算,包括不经意传输、秘密共享和混淆电路;第6章介绍具有特定功能的隐私计算协议,包括隐私集合求交和隐私信息检索;第7章介绍隐私保护的安全联合分析,分别介绍了SMCQL和Conclave两个框架,主要涉及联合分析过程的SQL计划优化和明密文混合运行。本书提供关联的开源架构源代码,获取方式见封底。

本书适合隐私计算入门从业者,以及需要快速搭建隐私计算产品的研发人员阅读学习。购买链接:https://item.jd.com/14244760.html

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

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

相关文章

算法(圆的定义和相关术语)

无向图的度 图中每一个顶点的度定义为以该项点为一个端点的边的数目 #include <cstdio>const int MAXN 100;int degree[MAXN] { 0 };int main() {int n, m, u, v;scanf("%d%d", &n, &m);//在输出边度的时候就已经表示度的数目了&#xff0c;所以用一…

Atlassian发布最新补贴政策,Jira/Confluence迁移上云最低可至零成本

到2024年2月15日&#xff0c;Atlassian将不再提供对Jira、Confluence、Jira Service Management等Server版产品的支持。 近期&#xff0c;Atlassian推出了一项针对云产品的特殊优惠。现在从Server版迁移到云版&#xff0c;您能享受到高额补贴&#xff0c;甚至成本低至零元。立…

vue中data属性为什么是一个函数?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-data属性 目录 为什么data属性是一个函数而不是一个对象&#xff1f; 一、实例和组件定义dat…

Servlet---API详解

文章目录 HttpServlet基础方法doXXX方法Servlet的生命周期 HttpServletRequest获取请求中的信息获取请求传递的参数获取 query string 里的数据获取form表单里的数据获取JSON里的数据如何解析JSON格式获取数据返回数据 HttpServletResponse设置响应的Header设置不同的状态码设置…

深入探讨软件测试技术:方法、工具与最佳实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 软件测试是软件开发生命周期中至关重要的…

【操作系统】文件系统之文件共享与文件保护

文章目录 文件共享硬链接软链接 文件保护口令保护加密保护访问控制 文件共享 为了实现文件的共享&#xff0c;引入了“计数器”字段&#xff0c;当一个文件每被一个用户所共享&#xff0c;那么计数器就加一。如果一个用户删除文件&#xff0c;计数器相应的减一。如果计数器为0…

威视佰科荣获:2023年“AI天马”高成长性企业

11月14日下午&#xff0c;2023年度“AI天马”认定评审会顺利召开。落实《深圳经济人工智能产业促进条例》&#xff0c;加快推进智能机器人、智能传感器、智能网联汽车、智能终端、脑科学和类脑智能等人工智能相关产业发展&#xff0c;加速AI产业化和产业AI化进程&#xff0c;持…

Redis篇---第十二篇

系列文章目录 文章目录 系列文章目录前言一、Memcache与Redis的区别都有哪些?二、单线程的redis为什么这么快三、redis的数据类型,以及每种数据类型的使用场景前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇…

BGP笔记实验

IGP(Interior Gateway Protocol)——内部网关协议 OSPF RIP IS-IS IGRP EIGRP EGP(External Gateway Protocol)——外部网关协议 EGP BGP——边界网关协议 AS——自治系统 由单一组织or机构独立维护的网络设备&网络资源的集合 网络范围太大 自治 AS号 为了区分不同…

66从零开始学Java之集合中的Collection体系

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 截止到今天&#xff0c;我们《从零开始学Java系列》的文章已经要到一个新的阶段了。在此之前&#xf…

每天分享五款工具,让大家工作生活更顺心

​ 快乐不是在于拥有什么,而在于我们和别人分享什么。每天分享五款工具&#xff0c;让大家工作办公更顺心就是我最大的快乐。 1.沙盒软件——Sandboxie ​ Sandboxie是一款可以在沙盒中运行程序的软件&#xff0c;它可以保护用户的系统和数据免受恶意软件、病毒和其他威胁的影…

pytorch下载离线包的网址

下载地址&#xff1a;https://download.pytorch.org/whl/torch_stable.html 安装GPU版本需要安装&#xff1a;torch、torchvision、 注意版本需要对应上 格式&#xff1a;适用cuda版本&#xff0c;torch版本 或者 orchvision版本&#xff0c;cp38就是适用python 3.8版本 下…

亚马逊车灯外贸出口CE认证标准办理解析

车灯是车辆夜间行驶在道路照明的工具&#xff0c;也是发出各种车辆行驶信号的提示工具。车灯一般分为前照灯、尾灯、转向灯等。车灯出口欧盟需要办理CE认证。 CE认证是欧盟对进入欧洲市场的产品强制性的认证标志&#xff0c;是指符合欧盟安全、健康、环境保护等标准和要求的产…

运动装备经营小程序商城效果如何

运动装备可包含服装、帐篷、渔具、箱包鞋帽等&#xff0c;对喜欢外出的人来说&#xff0c;靠谱的装备是关键&#xff0c;往往更容易选择品牌和信得过的商家。 而对商家来说&#xff0c;如何打造品牌提升卖货经营效率和提升营收是重中之重&#xff1b;互联网时代需要商家拓展线…

5款免费BI数据可视化工具,2023年最新精选推荐!

BI可视化工具顾名思义是进行数据分析和可视化的软件&#xff0c;旨在将数据以表格、图表、仪表盘等形式展示出来&#xff0c;让用户能够更加直观了解其业务状况、发现问题&#xff0c;并在必要时进行决策。   市面上BI数据可视化工具很多&#xff0c;目前比较火的像国外的Tabl…

windows如何查看自己的ip地址

windows如何查看自己的ip地址 1.打开控制面板 2.进入网络和internet 3.进入网络共享中心 4.点击以太网进入网络详情页&#xff0c;或邮件已连接的网络&#xff0c;点击属性 5.查看ipv4地址就是当前机器ip

[C语言 数据结构] 栈

1.什么是栈&#xff1f; 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压…

qt和window抓包程序

1.思路 使用原始套接字&#xff0c;将网卡设置为混杂模式&#xff0c;监听该网卡的数据。 2. 了解协议封包和协议层 下图是tcp封包详细过程 数据包传输情况 在TCP/IP协议栈中的每一层为了能够正确解析出上层的数据包&#xff0c;从而使用一些“协议类型”来标记&#xff0c;详…

java桌面程序

目标之一是把打印导出的功能最终用java实现一套&#xff0c;首先选定javafx&#xff0c;因为idea默认创建工程就带的javafx&#xff0c;没找到swing。 创建工程&#xff0c;这里要选1.8&#xff0c;高版本jdk默认不带fx 实现主界面的代码 package sample;import javafx.app…

RT-DETR手把手教程,注意力机制如何添加在网络的不同位置进行创新优化

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;本文首先复现了将EMA引入到RT-DETR中&#xff0c;并跟不同模块进行结合创新&#xff1b;1&#xff09;Rep C3结合&#xff1b;2&#xff09;直接作为注意力机制放在网络不同位置&#xff1b;3&#xff09;高效…