ComSec期末总结

ComSec期末总结


一、公钥密码

发展的原因:密钥分配和数字签名
1、公钥密码组成部分(6):
 明文,密文,加密算法,解密算法,公钥,私钥
【数据加密(保密性):公钥加密私钥解密;数字签名(认证、完整性):私钥加密公钥解密】
2、为得到安全算法,公钥密码体制应满足那些要求?
 1. 通过计算很容易生成一对公钥和私钥。
 2.使用公钥和加密算法通过计算将明文转换为密文是很容易的。
 3.使用私钥和解密算法通过计算将密文转换为明文是很容易的。
 4.即使知道公钥,在计算上也不可能知道私钥。
 5.即使知道公钥和密文,也无法从计算中获得明文。
 6.一些公钥算法还满足以下条件:
 明文可以在解密前加密,也可以在加密前解密。即加密解密函数顺序可以交换

二、RSA

1、RSA算法密钥生成过程:
 (1)选择两个素数p、q。(要求出大质数,先生成随机数,通过Miller-Rabin测试和费尔马测试判断是不是质数)
 (2)计算n=p*q。
 (3)计算φ(n)=(p-1)(q-1)。
 (4)选择e,满足gcd(φ(n),e)=1; 1 < e < φ(n).
 (5)选择d,满足 d≡e-1 (mod φ(n)); d<φ(n)。(可用扩展Euclid计算乘法逆元)
 (6)得到公钥PU={e,n},私钥PR={d,n}。
2、基本运算:
 加密:C=Me mod n
 解密:M=Cd mod n
3、RSA的安全性应该建立在哪些事实上?
 RSA是建立在“大整数的素因子分解是困难问题”的基础上的,即两个大素数做乘法非常容易,但反过来对其乘积进行因式分解却很困难。因此可以将乘积作为公钥公开,而我们也将因子分解的性能作为基准来评判RSA的安全性。
4、数论相关:

  • GCD
  • EGCD
  • CRT中国剩余定理****
  • Fermat小定理:ap-1≡1(mod p),a与p互素
  • 欧拉定理:aφ(n)≡1(mod n),a与n互素
  • Miller-Rabin素性测试:
     素数的两个性质:
    1、若p是素数,a是小于p的正整数,则a2 mod p=1当且仅当a mod p=1或a mod p=-1 mod p=p-1。
    2、对于aq mod p,a2q mod p,…,a2kq mod p,根据费马定理有,素数应满足以下两个条件之一,要么第一个数模n为1,要么数列中某个数模n为(n-1)。

Test(n):

//n相当于测试的p
找出整数k、q,其中k>0,q是奇数,使(n-1=2^k *q);
随机选取整数a,1<a< n-1;
if a^q mod n=1,then 返回“不确定”
for j=0 to k-1 do
    if a^(2^j *q) mod n= n-1,then 返回“不确定”;
返回“合数”

5、针对RSA的CCA攻击(选择密文攻击):
 CCA适用于这种情况:攻击者可以得到某些密文的明文,却不能直接得到他感兴趣的密文(即c*=Me mod n)的明文。利用了RSA的如下性质:
E(PU,M1) * E(PU,M2)=E(PU,[M1 * M2])
 因此可以构造new c **( 例如c *=c2 [Y=M2],或者 c =2ec[Y=2M])
则新密文X=c
2 mod n=M2e mod n,
对应明文Y=Xd mod n=M2 mod n,
由此Y开根号可得M。
 为了防止CCA这种简单攻击,我们可以有以下两种策略:
(1)对明文随机填充,使密文随机化,使得上述RSA性质不成立;
(2)最优非对称加密填充OAEP,使用Hash函数和异或来实现对明文的双层掩蔽

6、CRT快速求模幂:
(若n,d很大难以求模幂,可用CRT快速求幂)
对任意(m1,m2),必有m使得:

  • m1=m mod p
  • m2=m mod q   →  m=m2+h*q(联立两式计算h,后面用于计算明文)

因此对于解密 M=Cd mod n 可分解为:

  • m1=Cd mod p   →降阶  =Cd mod (p-1) mod p
  • m2=Cd mod q   →降阶  =Cd mod (q-1) mod q

预先计算:

  1. dp= d mod (p-1) [一直降阶到最小] = e-1 mod (p-1) [d很大时可用]
  2. dq= d mod (q-1) = e-1 mod (q-1)
  3. qInv= q-1 mod p

使用私钥解密:

  1. m1=cdp mod p
  2. m2=cdq mod q
  3. h= (qInv*((m1 - m2)mod p)) mod p
  4. m = m2 + h*q
    m就是明文。

例题:
n=77,e=13,C=20.将RSA和CRT结合解密求得M.
解:选择两个素数:p=11,q=7
 则φ(n)=106=60
 d=13-1 mod 60=37
 则M=2037 mod 77
 (数字大,难计算)
预先计算:
 dp= 37 mod 10 = 7
 dq= 37 mod 6 =1
 qInv= 7-1 mod 11 = 8
则:
 m1=207 mod 11 = 4
 m2=20 mod 7 = 6
 h=(8
((4-6)mod 11)) mod 11 = (89) mod 11 =6
 m=m2+hq=6+6
7=48
最终解密得到明文M=48

三、密钥交换

1、Diffie-Hellman协议
 DH协议是一种 使用户能在公共信道上安全交换加密密钥 的协议,其安全性是建立在下述事实上:
求关于素数的模素数幂运算相对容易,而计算离散对数却非常困难;
对于大素数,求离散对数被认为是不可行的。

DH密钥交换基本过程 * * *:

  1. 使用过DH密钥交换的双方共享一个大素数q和其对应的本原根α(α是一个整数,且其幂可以产生1到q-1之间所有整数)
  2. 双方各自随机生成一个私钥X(X < q ),并计算各自公钥Y(Y是公开可访问的)。如其中一方A:随机生成私钥XA,计算公钥YAXA mod q
  3. 利用模算术的运算规律,双方可根据各自的私钥和对方的公钥计算出相同值的共享密钥K = YBXA mod q = YAXB mod q

攻击方法 —— 中间人攻击:
 假如Alice和Bob希望交换密钥,而Darth是攻击者,攻击过程如下:

  1. 中间人Darth生成两个随机的私钥XD1和XD2,然后计算相应的公钥YD1和YD2
  2. Alice将YA传给Bob
  3. Darth截获YA,将YD1传给Bob。同时计算和Alice的共享密钥K2=YAXD2 mod q。
  4. Bob收到YD1,计算和假Alice(Darth)的共享密钥K1=YD1XB mod q。
  5. Bob将YB传给Alice。
  6. Darth截获YB,将YD2传给Alice。同时计算和Bob的共享密钥K1=YBXD1 mod q。
  7. Alice收到YD2,计算和假Bob(Darth)的共享密钥K2=YD2XA mod q。

此时,Alice和Bob以为双方共享了密钥,但实际上是Alice和Darth共享密钥K2,而Bob和Darth共享密钥K1
攻击者Darch既可以窃听消息后重放,也可以修改后重放。

DH抵抗中间人攻击的改进方法:使用数字签名和公钥证书,对通信的参与方进行身份认证。

2、椭圆曲线密码学ECC
椭圆曲线的离散对数问题:Q=kP,其中 Q,P∈Ep(a,b)且 k < p 。运用椭圆曲线,对于给定的k和P计算Q比较容易,而对给定的Q和P计算k则比较困难。
计算:
(1)实数域上的椭圆曲线 —— y2=x3+ax+b;

(2)Zp上的椭圆曲线 —— y2 mod p =(x3+ax+b) mod p :
对于任何点 Q,P∈Ep(a,b), P+Q=(xR,yR),有

  • λ = (yQ-yP)/(xQ-xP) mod p, 若P != Q;
     =(3xP2+a)/2yP mod p,  若P = Q;

可得:

  1. xR =(λ2-xP-xQ)mod p,
  2. yR = (λ(xP-xR)-yP) mod p。

每一次求多倍点需要重复相加,计算每一次的λ,再求值。
具体代码如下:
2P=P+P; 3P=2P+P;…以此类推;

(3)GF(2m)上的椭圆曲线 —— y2+xy=x3+ax2+b:
计算特点:2GF(2m)=0;在GF(2m)上加减都一样。
对于任何点 Q,P∈E2m(a,b),P+Q=(xR,yR),有

  1. R=P+Q=(xR,yR):
    xR = λ2+λ+xP+xQ+a,
    yR = λ(xP+xR)+xR+yP
    其中 λ = (yQ+yP)/(xQ+xP);
  2. R=2P=(xR,yR):
    xR = λ2+λ+a,
    yR = xP2+(λ+1)xR,
    其中 λ = xP+yP/xP;

3、用ECC实现DH密钥交换过程
(1)A、B双方共享Ep(a,b)和G,(G的阶n是使得nG=O成立的最小整数)
(2)A随机生成一个nA(< n)作为私钥,产生公钥PA=nAG;
(3)B随机生成一个nB(< n)作为私钥,产生公钥PB=nBG;
(4)双方交换公钥生成共享密钥K=nAPB=nBPA

四、Hash

1. Hash函数功能: Hash函数将可变长度的数据块M作为输入,产生固定长度的Hash值,用于保证数据完整性。

2. Hash的安全定义(特性) * *

需求描述
输入长度可变H可应用于任意大小的数据块
输出长度固定H产生定长的输出
效率对任意给定的x,计算H(x)比较容易,用硬件和软件均可实现
抗原像攻击(单向性)对任意给定的Hash码h,找到满足H(y)=h的y在计算上是不可行的 ( H ( y ) = h ) → y × \color{#FF0000}{(H(y)=h) → y ×} (H(y)=h)y×
抗第二原像攻击(抗弱碰撞性)任何给定的分块x,找到满足y≠x且H(x)=H(y)的y在计算上是不可行的 ( H ( y ′ ) = H ( x ) = h ) → y × \color{#FF0000}{(H(y')=H(x)=h)→ y ×} H(y)=H(x)=hy×
抗碰撞攻击(抗强碰撞性)找到任何满足H(x)=H(y)的偶对(x,y)在计算上是不可行的 ( H ( y ′ ) = H ( x ′ ) ) → x 和 y × \color{#FF0000}{(H(y')=H(x'))→ x和y ×} H(y)=H(x)xy×
伪随机性H的输出满足伪随机性测试标准

注:抗弱碰撞和抗强碰撞之间的区别是什么?
  抗弱碰撞性可以保证,不能找到与给定消息具有相同Hash值的另一消息。
  而抗强碰撞性则是保证,不能找到任意两个具有同样Hash值的消息。
  一个函数如果是抗强碰撞的,那么同时也是抗弱碰撞的。因此,满足抗强碰撞性的函数安全性更高,但同时也要更加复杂困难一些。

(由生日悖论可知,攻击者对于Hash函数的强碰撞攻击,与原像攻击(单向性)和第二原像攻击(抗弱碰撞)相比,攻击者的穷举规模更小,付出的攻击代价更小)

3. 应用(只对Hash值作用,保证完整性,不保证保密性):

  • 消息认证:
    (1)消息加密,Hash码加密(对称加密)
    (2)不用加密算法,用通信双方共有的秘密值S与消息M串联后计算其Hash值。

  • 数字签名(公钥密码):
    用户用私钥加密Hash,将公钥公开,目的是验证消息完整性。攻击者篡改消息需要获得该用户的私钥。比MAC应用更广。
    (消息认证能防止第三方的攻击,但防不了通信双方的攻击,所以数字签名就用来解决这个问题)

若既希望保证保密性有希望有数字签名,则先用发送方的私钥对Hash码加密,再用对称密码中的密钥对消息和公钥算法加密结果进行加密。

五、消息认证

认证手段: Hash函数、消息加密、消息认证码MAC(带密钥的Hash函数)

1.消息加密

  • 区别:
    (1)对称加密:保密性和认证(密钥只有通信双方拥有)
    (2)公钥加密:保密性
    (3)私钥加密:认证和签名
    (4)先私钥加密,后公钥加密:认证、签名和保密性
     若既希望提供保密性又提供认证,则先用发送方A的私钥对M加密,这是数字签名;然后用B的公钥对上述结果进行加密,这可保证保密性。
     缺点是:要执行四次复杂的公钥算法而不是两次。

2、消息认证码MAC

由于收发双方共享密钥,因此MAC不能提供数字签名

(1)定义
 消息认证码,又称密码校验和或MAC,也是一种认证技术,它利用密钥来生成一个固定长度的短数据块,并将该数据块附加在消息之后。
 MAC=C(K,M);
 MAC函数将密钥和数据块作为输入,产生Hash值作为MAC码(带密钥的Hash函数),然后将MAC码和受保护的消息一起传递或存储。MAC算法不可逆,故与加密相比,认证函数更不易攻破。
(2)应用

  • 将同一消息广播给其他接收者。(像是军事控制中心发布警报,经济可靠,只需要一个接收者验证真实性然后通知其他接收者)。
  • 在信息交换中,通信某一方的处理负荷很大,没有时间解密收到的所有消息,他应能随机选择消息并对其进行认证。
  • 对明文形式的计算机程序进行认证。运行时不用每次对其解密,浪费资源。

(3)消息认证码的标准构造方法:HMAC、CMAC

  • HMAC(基于Hash函数的MAC):
    特点:将Hash函数视为“黑盒”,可随时更换更安全的Hash函数
    简要过程:三次Hash压缩函数如下:
     f(IV,(K+⊕ipad)) 输出n位
     输入嵌入的Hash函数中,填充至b位
     f(IV,(K+⊕opad)) 输出n位
    即,HMAC(K,M)=H[(K+⊕opad)) || H[(K+⊕ipad) || M] ]
  • CMAC(基分组密码的MAC):
    简要过程:C1=E(K,M1)
         C2=E(K,[M2⊕C1])
         …
         Cn=E(K,[Mn⊕Cn-1⊕K1])
         T=MSBTlen(Cn) (位串Cn的最左边的Tlen位)

(4)对MAC的安全需求:
如果没有提供保密性,那么攻击者可以访问明文形式的消息和MAC

  • 某个报文M的MAC必须要短小
  • 要有认证性,发送接受双方必须共享“秘密”
  • Hash还不足以保证安全
  • 避免“加密”运算

六、数字签名

**1、基本概念:**消息认证能防止第三方的攻击,但防不了通信双方自身发生的攻击。在收发双方不能完全信任的情况下,就需要数字签名来解决问题。

2、数字签名应该具有哪些性质?
(1)它必须能验证签名者、签名日期和时间
(2) 它必须能认证被签的消息内容
(3) 签名能由第三方仲裁,以解决争执

3、数字签名的构造:(私钥加密)

  • **对消息的Hash值签名:**验证时比较解密后的散列值和发送方的散列值
  • **直接数字签名:直接对于消息签名。**验证时比较解密后的消息和发送方的消息
    (这里是指内层先签名,再执行外层的加密。这样发生争执时,第三方可以查看消息和签名(比较签名解密后的消息和对方发送过来的消息);)
    直接数字签名一般使用公钥密码体制,再用共享的密钥对整个消息和签名加密,提供保密性。

 直接数字签名方法的有效性依赖于发送方的私钥的安全性,同时这也是一个弱点,因此可能存在以下威胁:
 1、发送方的私钥泄露,被攻击者盗用,攻击者伪造签名发送虚假信息;
 2、发送方否认曾发过某条消息。他可以称自己的私钥丢失或被盗用,否认自己发过消息的事实。
对于以上两种威胁,我们可以要求每条要签名的消息都包含一个时间戳,以及在密钥被泄密后及时向数字证书的证书管理中心(CA)报告。

 3、发送方的私钥可能在时刻T被盗用,但攻击者可用发送方的签名签发一条消息并加盖一个在T或T之前的时间戳。(这是针对带有时间戳的数字签名的攻击)

4、针对数字签名的攻击:(签名伪造)

  • 完全破译:攻击者C判断出发送者A的私钥(带时间戳或不带,参考上述直接数字签名的攻击威胁);
  • 通用伪造:掌握一个有效的算法,对于任意消息都能等价地构造出合法签名;
  • 选择伪造:C对特定消息能伪造签名;
  • 存在性伪造:C至少可以伪造出一个消息的合法签名,但不能控制对该消息的选择。(对A的危害最低)

5、实例

  • RSA
  • ElGamal数字签名方案:
    运用了原根的性质:αi ≡ αj(mod q)当且仅当i ≡ j(mod q)
    与ElGamal加密方案类似:(有素数q,对应原根α,m=Hash(M),随机整数K与(q-1)互素)
    发送者A生成签名:
     A生成私钥XA,公钥{q,α,YA},接着生成数字签名;
     计算S1K mod q,计算K-1 mod (q-1);
     计算S2=K-1(m-XAS1) mod (q-1)。
     生成签名(S1,S2)对
    任意用户B验证签名:
     计算V1m mod q;
     计算V2=YAS1S1S2 mod q;
     如果V1=V2则签名合法
  • Schnorr数字签名方案:
    将签名所需的消息计算量最小化,对Hash值(e = H(M || x))签名,根据接收到的签名对(包括e)计算得到x’,最后计算比较Hash是否相同。具体过程省略。
  • DSA:(全局公钥+公私钥对)
    与使用RSA对散列值私钥加密提供数字签名并用于密钥交换(数字签名最简单算法)稍有不同,DSA是只提供数字签名功能的算法,还多了一个全局公钥PUG(一组参数3)。具体过程省略。

6、数字签名无法解决的问题:
 公钥的正确性和安全性(无法正确验证)
 因此就有证书和证书管理中心的出现,保证公钥的正确获取。
(所谓证书,其实是对公钥的封装,在公钥的基础上添加了诸如颁发者之类的信息。)

7、数字签名的应用****

  • 安全信息公告
    此类消息是为了让更多人知道,因此没有加密的必要,只用在消息中加上数字签名(对明文施加的签名称为明文签名)
  • 软件下载
    用于检测所下载的软件是否被篡改
  • 公钥证书
    将公钥当作信息,对其加上数字签名。
  • SSL/TSL
    在认证服务器身份是否合法时所使用的服务器证书(加上签名的服务器公钥)
  • 应用实例:
  • 网站认证(证书)
  • 代码签名
  • 比特币
    确认你是账户拥有者的唯一办法就是看你有没有账户对应的私钥。对于比特币中的任意一个交易记录,只有当其中付款方的签名是有效的,它才是有效的。如果账户私钥丢失,那么你将永远地失去里面的钱;一旦被黑客盗取,里面的钱就完全归黑客所有。

七、PKI认证系统

**1、公钥基础设施 (PKI):**是为了能够安全、便捷、高效地获得运用公钥而制定的一系列的规范和规格的总称。
PKI所能提供的三大功能:加密、签名、认证。

2、PKI组成,以PKIX(X.509)模型为例:

  • 证书签证机构CA,负责颁发证书。
  • 证书注册机构RA,可以接受用户的证书注册申请。
  • 证书撤销列表CRL,用于存放作废的证书。
  • 证书存取库,用于存放证书,供用户获取。

3、公钥证书
(1)定义:证书包含公钥和公钥拥有者的标识(PUA+IDA),整个数据块由可信的第三方进行签名(PRCA加密)。
注意:A从CA获取证书,公开给其他用户。
   任意用户可验证证书由管理员颁发(管理员公钥解密认证)
   只有证书管理员可以产生并更新证书
   可验证证书时效性
(2)功能:使公钥分配更加安全,使获得的公钥安全可信
(3)格式:(X.509标准是用来规范公钥证书的格式)

  • 版本号:用于区分X.509的不同版本;
  • 序列号:一个整数,在CA中唯一标识证书。
  • 签名算法标识:带参数的、用于给证书签名的算法。
  • 有效期:包含两个日期,即证书的生效日期和终止日期。
  • 发行商名字:X.500中创建、签名证书的签证机构CA的名字。
  • 证书主体名:证书拥有者姓名。
  • 发行商唯一标识:唯一标识签证机构。
  • 证书主体唯一标识:唯一标识证书主体。
  • 扩展
  • 签名:用CA私钥生成的数字签名。

八、认证协议(用户认证)

1、消息认证和用户认证的区别:

  • 认证分为消息认证和用户认证(实体认证)。消息认证包括消息源和消息完整性认证;而用户认证更严格(不同于消息源认证),是对用户实际身份的确定(生物特征)。
  • 另外,MAC和数字签名都是Hash函数的应用,其中,数字签名可以实现消息源和消息完整性认证,但相比于消息认证它可以防止通信双方发起的攻击;而MAC只能实现消息完整性认证。
    关键在于数字签名使用了私钥(间接与签名者身份绑定),具有不可否认性;而消息认证码的双方使用同一密钥。
  • 数字签名可实现不可否认性,为什么还需要实体认证?
    虽然实现了不可否认性,与实际的本人还存在区别,谁知道我们。因此可通过生物识别技术等来认证实体(本人操作)。

2、实体认证两种方式:

(1)弱认证(基于口令的认证) —— 口令弱

  • 口令脆弱性体现在:

  • 口令泄露(网络明文传输、非法访问口令文件)。
    解决的办法是使用一个单向hash函数将口令hash为伪随机数 ,即生成动态口令,一次性口令OTP

  • 口令重复使用

  • 攻击口令的方法:

  • 猜测攻击、字典攻击、穷举攻击、混合攻击(加强口令策略)

  • 工作站劫持、搭线窃听(像网络嗅探)、键盘监听、社会工程学(加强用户安全意识,系统安全防控)

  • 如何对抗口令猜测
    随机选择口令
    限制用户选择的口令
    口令的时效性

  • 口令认证协议PAP:
    首先被认证方向认证方发送认证请求(包含用户名和密码),以明文形式进行传输,认证方接到认证请求,再根据被认证方发送来的用户名去到自己的数据库认证用户名密码是否正确,如果密码正确,PAP认证通过,如果用户名密码错误,PAP认证未通过。
    包含两次握手,是弱认证协议。

  • 协议改进:每一次在口令上加盐(利用算法生成随机的字符串),并对其进行散列计算生成一个动态口令OTP,然后加密发送给系统服务器。
    通过这种方式,用户每次提交的口令都不一样,即使攻击者能够窃听网络并窃取登录信息,但由于每次窃取的数据都只有一次有效,并且无法通过一次性口令反推出用户的口令,从而极大地提升了认证过程的安全性。

  • 基于口令的认证密钥交换
    Alice:gx. Mpw
    Bob: gy. Npw
    g, M,N是 Z*q 的生成元
    1< x,y < q 是随机数,pw是口令,映射成群Z*q上的元
    最后双方得到 gxy

(2)强认证(质询-应答协议) —— 密钥强
 假设用户U想向系统S认证自己。设U和S有个协商好的函数与密钥sk。质询-应答认证系统就是这样一个系统:
 S发送一个随机消息m(Challenge)给U;
 用户U回应以m的变形r=f(m,sk)(Response);
 S通过独立计算r来验证r。

协议实例:

  • 单边认证,使用时间戳
    A - >B:Ek(tA, B)

  • 单边认证,使用随机数
    1、A <-- B: rB (认证A)
    2、A --> B: Ek(rB,B)

  • 双边认证,使用随机数(B给A发消息)
    1、A <-- B : rB(临时交互号)
    2、A–> B: Ek(rA, rB, B)
    3、A <–B: Ek(rB, rA)

  • 双边认证,使用hash函数
    1、A <–B : rB
    2、A --> B: rA,Hk(rA, rB, B)
    3、A <-- B: Hk(rB, rA,A)

九、安全策略

CIA:保密性、完整性、可用性(真实性、可追溯性)
安全服务通过安全机制实现安全策略。

1、安全策略模型的种类:
机密性和完整性模型

2、访问控制的三种方式:****
防止非法授权用户的非法访问。

  • 自主访问控制(DAC):
    基于请求者的身份和访问规则
    实体可授权

  • 访问控制矩阵
    | 用户 | 文件 |
    | ------ | ------ |
    | 用户1 | r/w |
    | 用户2 | r/w |
    | 用户3 | r/w |

  • 访问控制列表ACL(矩阵的列):对某一客体(文件)

  • 能力表C-List(矩阵的行):对某一用户

  • 强制访问控制(MAC):
    基于安全许可(实体的能力)和安全标记(资源的敏感度)
    实体不可对另一实体授权

  • 基于角色的访问控制(RBAC):
    基于角色授权,而不给单独用户授权

4、BLP模型的基本思想:
简单安全属性:不能向上读
安全属性,又称*-属性(星号属性):不能向下写
自主安全属性:使用访问控制矩阵实施自主访问控制。

总结:

  • 下读、上写;信息自下而上流动;侧重于保护数据的机密性和对客体的受控访问
  • 本质是强制型访问控制,但结合了自主型访问控制的内容。
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值