如何正确解密DES算法

如何正确解密DES算法,第1张

DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:

DES算法加密过程

对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:

IP 58 50 42 34 26 18 10 2

60 52 44 36 28 20 12 4

62 54 46 38 30 22 14 6

64 56 48 40 32 24 16 8

57 49 41 33 25 17 9 1

59 51 43 35 27 19 11 3

61 53 45 37 29 21 13 5

63 55 47 39 31 23 15 7

该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规则为:

f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2…… 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。

R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:

IP-1 40 8 48 16 56 24 64 32

39 7 47 15 55 23 63 31

38 6 46 14 54 22 62 30

37 5 45 13 53 21 61 29

36 4 44 12 52 20 60 28

35 3 43 11 51 19 59 27

34 2 42 10 50 18 58 26

33 1 41 9 49 17 57 25

经过置换IP-1后生成的比特串就是密文e。

下面再讲一下变换f(Ri-1,Ki)。

它的功能是将32比特的输入再转化为32比特的输出。其过程如图所示:

对f变换说明如下:输入Ri-1(32比特)经过变换E后,膨胀为48比特。膨胀后的比特串的下标列表如下:

E: 32 1 2 3 4 5

4 5 6 7 8 9

8 9 10 11 12 13

12 13 14 15 16 17

16 17 18 19 20 21

20 21 22 23 24 25

24 25 26 27 28 29

28 29 30 31 32 31

膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换后,其下标列表如下:

P: 16 7 20 21

29 12 28 17

1 15 23 26

5 18 31 10

2 8 24 14

32 27 3 9

19 13 30 6

22 11 4 25

经过P变换后输出的比特串才是32比特的f (Ri-1,Ki)。

下面再讲一下S盒的变换过程。任取一S盒。见图:

DES算法优点:DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。

DES算法缺点:

1、分组比较短。

2、密钥太短。

3、密码生命周期短。

4、运算速度较慢。

AES算法优点:

1、运算速度快。

2、 对内存的需求非常低,适合于受限环境。

3、分组长度和密钥长度设计灵活。

4、 AES标准支持可变分组长度,分组长度可设定为32比特的任意倍数,最小值为128比特,最大值为256比特。

5、 AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的。

6、很好的抵抗差分密码分析及线性密码分析的能力。

AES算法缺点:目前尚未存在对AES 算法完整版的成功攻击,但已经提出对其简化算法的攻击。

扩展资料:

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

参考资料来源:百度百科-aes (高级加密标准)

参考资料来源:百度百科-des算法

DES的原始思想可以参照二战德国的恩尼格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩尼格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。 攻击 DES 的主要形式被称为蛮力的或穷举,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 — 高级加密标准(Advanced Encryption Standard,AES)。

新的分析方法有差分分析法和线性分析法两种 本期Crackme用到MD5及DES两种加密算法,难度适中。这次我们重点来看一下DES的加密过程及注册算法过程。用调试器载入程序,下GegDlgItemTextA断点,可以定位到下面代码,我们先来看一下整个crackme的注册过程:

由于代码分析太长,故收录到光盘中,请大家对照着分析(请见光盘“code1doc”)

从上面分析可以看出,注册过程是类似:f(机器码,注册码)式的两元运算。机器码是经过md5算法得到的中间16位值,注册码是经过DES解密过程取得16位注册码,然后两者比较,如相等,则注册成功。机器码的运算过程可以参照上一期的MD5算法来理解。下面重点来说一下注册码DES的运算过程。

1、密钥处理过程:一般进行加解密过程都要初始化密钥处理。我们可以跟进004023FA CALL Crackme100401A40这个call,可以看到如下代码:

…(省略)

00401A4D LEA ECX,DWORD PTR DS:[ECX]

00401A50 /MOV EDX,EAX

00401A52 |SHR EDX,3

00401A55 |MOV DL,BYTE PTR DS:[EDX+ESI]

00401A58 |MOV CL,AL

00401A5A |AND CL,7

00401A5D |SAR DL,CL

00401A5F |AND DL,1

00401A62 |MOV BYTE PTR DS:[EAX+417DA0],DL

00401A68 |INC EAX

00401A69 |CMP EAX,40这里比较是否小于64

00401A6C \JL SHORT Crackme100401A50

以上过程就是去掉密钥各第八位奇偶位。

…(省略)

00401AB0 |MOV DL,BYTE PTR DS:[ECX+417D9F]

00401AB6 |MOV BYTE PTR DS:[EAX+417BA3],DL

00401ABC |ADD EAX,4

00401ABF |CMP EAX,38这里进行密钥变换

…(省略)

00401BFF ||MOVSX ECX,BYTE PTR DS:[EAX+412215]

00401C06 ||MOV CL,BYTE PTR DS:[ECX+417D9F]

00401C0C ||MOV BYTE PTR DS:[EAX+417BA5],CL

00401C12 ||ADD EAX,6

00401C15 ||CMP EAX,30这里产生48位的子密钥

00401C18 |\JL SHORT Crackme100401BA0

00401C1A |MOV EAX,DWORD PTR SS:[ESP+14]

00401C1E |MOV EDI,EAX

00401C20 |MOV ECX,0C

00401C25 |MOV ESI,Crackme100417BA0

00401C2A |REP MOVS DWORD PTR ES:[EDI],DWORD PTR D>

00401C2C |MOV EDI,DWORD PTR SS:[ESP+10]

00401C30 |ADD EAX,30下一组子密钥

00401C33 |INC EDI

00401C34 |CMP EAX,Crackme100417B90这里进行16次的生成子密钥过程

00401C39 |MOV DWORD PTR SS:[ESP+10],EDI

…(省略)

可以看到8位密钥为:1,9,8,0,9,1,7,0

2、对数据处理的过程,跟进004024C7 CALL Crackme100402050,到如下代码:

00402072 |MOV BYTE PTR DS:[EAX+417E30],DL

00402078 |INC EAX

00402079 |CMP EAX,40这里取得64位数据

0040207C \JL SHORT Crackme100402060

…(省略)

004020C6 |MOV BYTE PTR DS:[EAX+417BA3],DL

004020CC |ADD EAX,4

004020CF |CMP EAX,40进行第一次变换

004020D2 \JL SHORT Crackme100402080

004020D4 MOV AL,BYTE PTR SS:[ESP+20]

004020D8 TEST AL,AL

004020DA MOV ECX,10

…(省略)

00402191 MOV EBP,DWORD PTR DS:[415094] ; Crackme100417E30

00402197 SUB EAX,EBP这里对变换后的数据分为两部分

00402199 MOV DWORD PTR SS:[ESP+10],EAX

0040219D MOV DWORD PTR SS:[ESP+20],Crackme100417B60

004021A5 /MOV EAX,DWORD PTR SS:[ESP+20]

004021A9 |MOV ECX,8

004021AE |MOV ESI,EBP

004021B0 |MOV EDI,Crackme100417E10

004021B5 |PUSH EAX这里用上面生成的子密钥来解密数据

004021B6 |MOV EBX,EBP

…(省略)

004021FF |SUB EAX,30下一个子密钥

00402202 |CMP EAX,Crackme100417890这里将循环16次,典型的DES加解密过程

00402207 |MOV ECX,8

0040220C |MOV ESI,Crackme100417E10

00402211 |REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI>

…(省略)

0040225A |MOV BYTE PTR DS:[EAX+417BA2],DL

00402260 |MOV DL,BYTE PTR DS:[ECX+417E2F]

00402266 |MOV BYTE PTR DS:[EAX+417BA3],DL

0040226C |ADD EAX,4

0040226F |CMP EAX,40这里是未置换

00402272 \JL SHORT Crackme100402220

00402274 MOV EBP,DWORD PTR SS:[ESP+18]

00402278 MOV ECX,10

0040227D MOV ESI,Crackme100417BA0

…(省略)

有兴趣的读者可以参考DES算法来理解上面的过程。 一安全性比较高的一种算法,目前只有一种方法可以破解该算法,那就是穷举法

二采用64位密钥技术,实际只有56位有效,8位用来校验的譬如,有这样的一台PC机器,它能每秒计算一百万次,那么256位空间它要穷举的时间为2285年所以这种算法还是比较安全的一种算法

TripleDES。该算法被用来解决使用 DES 技术的 56 位时密钥日益减弱的强度,其方法是:使用两个独立密钥对明文运行 DES 算法三次,从而得到 112 位有效密钥强度。TripleDES 有时称为 DESede(表示加密、解密和加密这三个阶段)。

#include<iostreamh>

class SubKey{ //定义子密钥为一个类

public:

int key[8][6];

}subkey[16]; //定义子密钥对象数组

class DES{

int encipher_decipher; //判断加密还是解密

int key_in[8][8]; //用户原始输入的64位二进制数

int key_out[8][7]; //除去每行的最后一位校验位

int c0_d0[8][7]; //存储经PC-1转换后的56位数据

int c0[4][7],d0[4][7]; //分别存储c0,d0

int text[8][8]; //64位明文

int text_ip[8][8]; //经IP转换过后的明文

int A[4][8],B[4][8]; //A,B分别存储经IP转换过后明文的两部分,便于交换

int temp[8][6]; //存储经扩展置换后的48位二进制值

int temp1[8][6]; //存储和子密钥异或后的结果

int s_result[8][4]; //存储经S变换后的32位值

int text_p[8][4]; //经P置换后的32位结果

int secret_ip[8][8]; //经逆IP转换后的密文

public:

void Key_Putting();

void PC_1();

int function(int,int); //异或

void SubKey_Production();

void IP_Convert();

void f();

void _IP_Convert();

void Out_secret();

};

void DES::Key_Putting() //得到密钥中对算法有用的56位

{

cout<<"请输入64位的密钥(8行8列且每行都得有奇数个1):\n";

for(int i=0;i<8;i++)

for(int j=0;j<8;j++){

cin>>key_in[i][j];

if(j!=7) key_out[i][j]=key_in[i][j];

}

}

void DES::PC_1() //PC-1置换函数

{

int pc_1[8][7]={ //PC-1

{57, 49, 41, 33, 25, 17, 9},

{1, 58, 50, 42, 34, 26, 18},

{10, 2, 59, 51, 43, 35, 27},

{19, 11, 3, 60, 52, 44, 36},

{63, 55, 47, 39, 31, 23, 15},

{7, 62, 54, 46, 38, 30, 22},

{14, 6, 61, 53, 45, 37, 29},

{21, 13, 5, 28, 20, 12, 4}

};

int i,j;

for(i=0;i<8;i++)

for(j=0;j<7;j++)

c0_d0[i][j]=key_out[ (pc_1[i][j]-1)/8 ][ (pc_1[i][j]-1)%8 ];

}

int DES::function(int a,int b) //模拟二进制数的异或运算,a和b为整型的0和1,返回值为整型的0或1

{

if(a!=b)return 1;

else return 0;

}

void DES::SubKey_Production() //生成子密钥

{

int move[16][2]={ //循环左移的位数

1 , 1 , 2 , 1 ,

3 , 2 , 4 , 2 ,

5 , 2 , 6 , 2 ,

7 , 2 , 8 , 2 ,

9 , 1, 10 , 2,

11 , 2, 12 , 2,

13 , 2, 14 , 2,

15 , 2, 16 , 1

};

int pc_2[8][6]={ //PC-2

14, 17 ,11 ,24 , 1 , 5,

3 ,28 ,15 , 6 ,21 ,10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20 ,13 , 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

};

for(int i=0;i<16;i++) //生成子密钥

{

int j,k;

int a[2],b[2];

int bb[28],cc[28];

for(j=0;j<4;j++)

for(k=0;k<7;k++)

c0[j][k]=c0_d0[j][k];

for(j=4;j<8;j++)

for(k=0;k<7;k++)

d0[j-4][k]=c0_d0[j][k];

for(j=0;j<4;j++)

for(k=0;k<7;k++){

bb[7j+k]=c0[j][k];

cc[7j+k]=d0[j][k];

}

for(j=0;j<move[i][1];j++){

a[j]=bb[j];

b[j]=cc[j];

}

for(j=0;j<28-move[i][1];j++){

bb[j]=bb[j+1];

cc[j]=cc[j+1];

}

for(j=0;j<move[i][1];j++){

bb[27-j]=a[j];

cc[27-j]=b[j];

}

for(j=0;j<28;j++){

c0[j/7][j%7]=bb[j];

d0[j/7][j%7]=cc[j];

}

for(j=0;j<4;j++) //L123--L128是把c0,d0合并成c0_d0

for(k=0;k<7;k++)

c0_d0[j][k]=c0[j][k];

for(j=4;j<8;j++)

for(k=0;k<7;k++)

c0_d0[j][k]=d0[j-4][k];

for(j=0;j<8;j++) //对Ci,Di进行PC-2置换

for(k=0;k<6;k++)

subkey[i]key[j][k]=c0_d0[ (pc_2[j][k]-1)/7 ][ (pc_2[j][k]-1)%7 ];

}

}

void DES::IP_Convert()

{

int IP[8][8]={ //初始置换IP矩阵

58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1,

59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5,

63, 55, 47, 39, 31, 23, 15, 7

};

cout<<"你好,你要加密还是解密加密请按1号键(输入1),解密请按2号键,并确定"<<'\n';

cin>>encipher_decipher;

char s;

if(encipher_decipher==1) s="明文";

else s="密文";

cout<<"请输入64位"<<s<<"(二进制):\n";

int i,j;

for(i=0;i<8;i++)

for(j=0;j<8;j++)

cin>>text[i][j];

for(i=0;i<8;i++) //进行IP变换

for(j=0;j<8;j++)

text_ip[i][j]=text[ (IP[i][j]-1)/8 ][ (IP[i][j]-1)%8 ];

}

一、数据加密标准不同

1、DES算法的入口参数有三个:Key、Data、Mode。

其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

2、AES的基本要求是,采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。

因此AES的密钥长度比DES大, 它也可设定为32比特的任意倍数,最小值为128比特,最大值为256 比特,所以用穷举法是不可能破解的。

二、运行速度不同

1、作为分组密码,DES 的加密单位仅有64 位二进制,这对于数据传输来说太小,因为每个分组仅含8 个字符,而且其中某些位还要用于奇偶校验或其他通讯开销。处理速度慢、加密耗时

2、AES对内存的需求非常低,运算速度快,在有反馈模式、无反馈模式的软硬件中,Rijndael都表现出非常好的性能。

三、适用范围不同

1、数据加密标准,速度较快,适用于加密大量数据的场合。DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES

2、AES 适用于8位的小型单片机或者普通的32位微处理器,并且适合用专门的硬件实现,硬件实现能够使其吞吐量(每秒可以到达的加密/解密bit数)达到十亿量级。同样,其也适用于RFID系统。

参考资料来源:百度百科-DES

参考资料来源:百度百科-AES

分类: 电脑/网络

解析:

DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其算法主要分为两步:

1初始置换

其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长3 2位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。

2逆置换

经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

RSA算法简介

这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和 *** 作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。

RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。

密钥对的产生。选择两个大素数,p 和q 。计算:

n = p q

然后随机选择加密密钥e,要求 e 和 ( p - 1 ) ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足

e d = 1 ( mod ( p - 1 ) ( q - 1 ) )

其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。

加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,, mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:

ci = mi^e ( mod n ) ( a )

解密时作如下计算:

mi = ci^d ( mod n ) ( b )

RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。具体 *** 作时考虑到安全性和 m信息量较大等因素,一般是先作 HASH 运算。

RSA 的安全性。

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。

RSA的速度。

由于进行的都是大数计算,使得RSA最快的情况也比DES慢上100倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。

RSA的选择密文攻击。

RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装(Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:

( XM )^d = X^d M^d mod n

前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way Hash Function对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方法。

RSA的公共模数攻击。

若系统 有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:

C1 = P^e1 mod n

C2 = P^e2 mod n

密码分析者知道n、e1、e2、C1和C2,就能得到P。

因为e1和e2互质,故用Euclidean算法能找到r和s,满足:

r e1 + s e2 = 1

假设r为负数,需再用Euclidean算法计算C1^(-1),则

( C1^(-1) )^(-r) C2^s = P mod n

另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。

RSA的小指数攻击。 有一种提高RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和 *** 作。 RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048比特长的密钥,其他实体使用1024比特的密钥。

以上就是关于如何正确解密DES算法全部的内容,包括:如何正确解密DES算法、“DES”和“AES”算法的比较,各自优缺点有哪些、数据加密算法的数据加密标准DES等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9407833.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存