密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)

5 篇文章 8 订阅
订阅专栏

如图,对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。具有算法公开、计算量小、加密速度快、加密效率高等特点。在这里插入图片描述

1. 分组密码(Twine)

Twine是由Tomoyasu Suzaki,Kazuhiko Minematsu, Sumio Morioka和Eita Kobayashi在2011年的ECRYPT轻量级密码会议上首次提出的,并发表在2012年的SAC会议上。它的分组长度是64比特,密钥长度有80比特和128比特两个版本,其采用广义的Feistel结构(Generalized Feistel Structure,简称GFS),并由36轮轮函数构成,这里我们重点介绍80位的算法。

1.1 加解密方式

1.1.1 加密

Twine-80的加密算法如下所示:
加密算法
该算法采用的是广义的Feistel结构,具体结构如下图所示:
Feistel结构
我们可以看出,此算法在Feistel结构的基础上改造了位置交换的方法,我们称之为π置换(π-1置换用于解密):
π置换
Feistel结构中S盒如下表:S-box

void Feistel(int r,int k)
{
	int i;
	char a;
	if(k == 1)
	{
		if(r != 35)
			for(i = 0;i < 16;i += 2)
			{
				OutPut[PI[i]] = InPut[i];
				a = S[InPut[i] ^ R_Key[r][i / 2]];
				OutPut[PI[i + 1]] = InPut[i + 1] ^ a;
			}
		else
			for(i = 0;i < 16;i += 2)
			{
				OutPut[i] = InPut[i];
				a = S[InPut[i] ^ R_Key[r][i / 2]];
				OutPut[i + 1] = InPut[i + 1] ^ a;
			}
	}
	else
	{
		if(r != 35)
			for(i = 0;i < 16;i += 2)
			{
				OutPut[Pi[i]] = InPut[i];
				a = S[InPut[i] ^ R_Key[35 - r][i / 2]];
				OutPut[Pi[i + 1]] = InPut[i + 1] ^ a;
			}
		else
			for(i = 0;i < 16;i += 2)
			{
				OutPut[i] = InPut[i];
				a = S[InPut[i] ^ R_Key[35 - r][i / 2]];
				OutPut[i + 1] = InPut[i + 1] ^ a;
			}
	}
}

1.1.2 密钥生成算法

Twine-80的密钥生成算法如下所示:
密钥生成算法
方便起见,我们将算法用图画出:
密钥生成算法
其中轮常数Con如下:在这里插入图片描述

void MakeRKey()
{
	int i,j,k;
	int choose[8] = {1,3,4,6,13,14,15,16};
	char ch,ConH,ConL;
	char key[20] = {0};
	for(i = 0;i < 10;i++)
	{
		ch = fgetc(KEY);
		for(j = (2 * i) + 1;j >= 2 * i;j--)
		{
			key[j] = ch & 0x0F;
			ch = ch >> 4;
		}
	}
	for(i = 0;i < 36;i++)
	{
		for(j = 0;j < 8;j++)
			R_Key[i][j] = key[j];
		if(i < 35)
		{
			key[1] = key[1] ^ S[key[0]];
			key[4] = key[4] ^ S[key[16]];
			ConL = CON[i] & 0x07;
			ConH = CON[i] >> 3;
			ConH = ConH & 0x07;
			key[7] = key[7] ^ ConH;
			key[19] = key[19] ^ ConL;
			ch = key[0];
			for(j = 0;j < 19;j++)
				key[j] = key[j + 1];
			key[j] = ch;
			for(k = 0;k < 3;k++)
			{
				ch = key[0];
				for(j = 0;j < 18;j++)
					key[j] = key[j + 1];
				key[j] = ch;
			}
		}
	}
}

1.1.3 解密

由于轮函数的等价结构,解密算法与加密算法除π置换与轮密钥的注入顺序不同外,其余均相似。

1.1.4 全部代码

代码作用是将plaintext0.txt中的数据加密为ciphertext.txt,然后再解密为plaintext.txt:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

FILE *KEY;
int flag;
int PI[16] = {5,0,1,4,7,12,3,8,13,6,9,2,15,10,11,14};
int Pi[16] = {1,2,11,6,3,0,9,4,7,10,13,14,5,8,15,12};
char S[16] = {0x0c,0x00,0x0f,0x0a,0x02,0x0b,0x09,0x05,
			  0x08,0x03,0x0d,0x07,0x01,0x0e,0x06,0x04};
char CON[35] = {0x01,0x02,0x04,0x08,0x10,0x20,0x03,
				0x06,0x0c,0x18,0x30,0x23,0x05,0x0a,
				0x14,0x28,0x13,0x26,0x0f,0x1e,0x3c,
				0x3b,0x35,0x29,0x11,0x22,0x07,0x0e,
				0x1c,0x38,0x33,0x25,0x09,0x12,0x24};
char InPut[16] = {0},OutPut[16] = {0};
char R_Key[36][8] = {0};
char plain[16] = {0},cipher[16] = {0};

void Read(FILE *OUT,int k)
{
	int i,j;
	char ch;
	for(i = 0;i < 8;i++)
	{
		ch = fgetc(OUT);
		if(ch == -1)
		{
			ch = 0;
			flag = 0;
			if(i == 0)
			{
				flag = -1;
				return;
			}
		}
		for(j = (2 * i) + 1;j >= 2 * i;j--)
		{
			if(k == 1)
				plain[j] = ch & 0x0F;
			else
				cipher[j] = ch & 0x0F;
			ch = ch >> 4;
		}
	}
}

void Write(FILE *IN,int k)
{
	int i,j;
	char ch;
	for(i = 0;i < 8;i++)
	{
		ch = 0x00;
		for(j = 2 * i;j <= (2 * i) + 1;j++)
		{
			ch = ch << 4;
			if(k == 1)
				ch =  ch | cipher[j];
			else
				ch =  ch | plain[j];
		}
		fputc(ch,IN);
	}
}

void MakeRKey()
{
	int i,j,k;
	int choose[8] = {1,3,4,6,13,14,15,16};
	char ch,ConH,ConL;
	char key[20] = {0};
	for(i = 0;i < 10;i++)
	{
		ch = fgetc(KEY);
		for(j = (2 * i) + 1;j >= 2 * i;j--)
		{
			key[j] = ch & 0x0F;
			ch = ch >> 4;
		}
	}
	for(i = 0;i < 36;i++)
	{
		for(j = 0;j < 8;j++)
			R_Key[i][j] = key[j];
		if(i < 35)
		{
			key[1] = key[1] ^ S[key[0]];
			key[4] = key[4] ^ S[key[16]];
			ConL = CON[i] & 0x07;
			ConH = CON[i] >> 3;
			ConH = ConH & 0x07;
			key[7] = key[7] ^ ConH;
			key[19] = key[19] ^ ConL;
			ch = key[0];
			for(j = 0;j < 19;j++)
				key[j] = key[j + 1];
			key[j] = ch;
			for(k = 0;k < 3;k++)
			{
				ch = key[0];
				for(j = 0;j < 18;j++)
					key[j] = key[j + 1];
				key[j] = ch;
			}
		}
	}
}

void Feistel(int r,int k)
{
	int i;
	char a;
	if(k == 1)
	{
		if(r != 35)
			for(i = 0;i < 16;i += 2)
			{
				OutPut[PI[i]] = InPut[i];
				a = S[InPut[i] ^ R_Key[r][i / 2]];
				OutPut[PI[i + 1]] = InPut[i + 1] ^ a;
			}
		else
			for(i = 0;i < 16;i += 2)
			{
				OutPut[i] = InPut[i];
				a = S[InPut[i] ^ R_Key[r][i / 2]];
				OutPut[i + 1] = InPut[i + 1] ^ a;
			}
	}
	else
	{
		if(r != 35)
			for(i = 0;i < 16;i += 2)
			{
				OutPut[Pi[i]] = InPut[i];
				a = S[InPut[i] ^ R_Key[35 - r][i / 2]];
				OutPut[Pi[i + 1]] = InPut[i + 1] ^ a;
			}
		else
			for(i = 0;i < 16;i += 2)
			{
				OutPut[i] = InPut[i];
				a = S[InPut[i] ^ R_Key[35 - r][i / 2]];
				OutPut[i + 1] = InPut[i + 1] ^ a;
			}
	}
}

int main()
{
	int mode,i,r;
	FILE *M,*C;
	if((KEY = fopen("key.txt","rb")) == NULL)
	{
		printf("\nkey.txt Fail,Close!");
		getchar();
		exit(1);
	}
	MakeRKey();
	while(1)
	{
		flag = 1;
		printf("Plase choose:\n1. encrypt \n2. decrypt \n3. exit \n");
		scanf("%d",&mode);
		if(mode == 1)
		{
			if((M = fopen("plaintext0.txt","rb")) == NULL)
			{
				printf("\nplaintext.txt Fail,Close!");
				getchar();
				exit(1);
			}
			if((C = fopen("ciphertext.txt","wb")) == NULL)
			{
				printf("\nciphertext.txt Fail,Close!");
				getchar();
				exit(1);
			}
			while(flag)
			{
				Read(M,1);
				if(flag == -1)
					break;
				for(i = 0;i < 16;i++)
					InPut[i] = plain[i];
				for(r = 0;r < 36;r++)
				{
					Feistel(r,1);
					for(i = 0;i < 16;i++)
						InPut[i] = OutPut[i];
				}
				for(i = 0;i < 16;i++)
					cipher[i] = OutPut[i];
				Write(C,1);
			}
			fclose(M);
			fclose(C); 
		}
		if(mode == 2)
		{
			if((C = fopen("ciphertext.txt","rb")) == NULL)
			{
				printf("\nciphertext.txt Fail,Close!");
				getchar();
				exit(1);
			}
			if((M = fopen("plaintext.txt","wb")) == NULL)
			{
				printf("\nplaintext.txt Fail,Close!");
				getchar();
				exit(1);
			}
			while(flag)
			{
				Read(C,2);
				if(flag == -1)
					break;
				for(i = 0;i < 16;i++)
					InPut[i] = cipher[i];
				for(r = 0;r < 36;r++)
				{
					Feistel(r,2);
					for(i = 0;i < 16;i++)
						InPut[i] = OutPut[i];
				}
				for(i = 0;i < 16;i++)
					plain[i] = OutPut[i];
				Write(M,2);
			}
			fclose(M);
			fclose(C); 
		}
		if(mode == 3)
		{
			fclose(KEY);
			exit(0);
		}
		system("pause");
		system("cls");
	}
	return 0;
}

1.2. 分组密码的模式

在数组密码中,如何将长的明文数据分成算法要求的长度也是一个问题。为此,人们提出了分组密码的分组模式:

1.2.1 ECB模式

加密:
在这里插入图片描述
解密:
在这里插入图片描述

1.2.2 CBC模式

加密:
在这里插入图片描述
解密:
在这里插入图片描述

1.2.3 CFB模式

加密:
在这里插入图片描述
解密:
在这里插入图片描述

1.2.4 OFB模式

加密:
在这里插入图片描述
解密:
在这里插入图片描述

1.2.5 CTR模式

加密:
在这里插入图片描述
解密:
在这里插入图片描述

2.序列密码

序列密码也称为流密码(Stream Cipher),它是对称密码算法的一种。序列密码具有实现简单、便于硬件实施、加解密处理速度快、没有或只有有限的错误传播等特点,因此在实际应用中,特别是专用或机密机构中保持着优势,典型的应用领域包括无线通信、外交通信。
1949年Shannon证明了只有一次一密的密码体制是绝对安全的,这给序列密码技术的研究以强大的支持,序列密码方案的发展是模仿一次一密系统的尝试,或者说“一次一密”的密码方案是序列密码的雏形。如果序列密码所使用的是真正随机方式的、与消息流长度相同的密钥流,则此时的序列密码就是一次一密的密码体制。若能以一种方式产生一随机序列(密钥流),这一序列由密钥所确定,则利用这样的序列就可以进行加密,即将密钥、明文表示成连续的符号或二进制,对应地进行加密,加解密时一次处理明文中的一个或几个比特。
在序列密码中,密钥流由密钥流发生器f产生:zi=f(k,si),这里的si是加密器中存储器(记忆元件)在i时刻的状态。根据加密器中的记忆元件si的存贮状态是否依赖于明文字符,序列密码可进一步分成同步和自同步两种。如果si独立于明文字符则称为同步流密码,否则称为自同步流密码。
序列密码算法主要依靠(线性)反馈移位寄存器,这里就不过多说明了。

网络安全认证与加密协议算法整合
Slim's Hello World
12-31 3314
1. 2。 3
轻量级密码综述
syy的博客
09-19 520
轻量级密码在设计时要考虑其应用目标平台,已提出的轻量级密码有面向硬件实现的设计、面向软件实现的设计和综合考虑软硬件实现的混合设计。或者在现有典型分组密码的基础上,对密码算法的组件进行轻量化的改进;还有于2011年发布的Piccolo、Lblock、KLEIN、LED、EPCBC算法,2012年发布的PRINCE、TWICE算法,2014年发布的LEA算法,2015年发布的SIMECK、SIMON算法,2016年发布的QTL算法,2017年发布的Magpie算法,2018年发布的Surge、SFN算法
轻量级密码算法
01-25
轻量级对称密码算法标准。基于元扩域上的椭圆曲线算法
【信息技术】【2017.11】轻量级对称密码原语的高效安全实现
weixin_42825609的博客
06-09 238
本文为卢森堡大学(作者:Dumitru-DanielDINU)的博士论文,共278页。 本论文致力于为资源受限的设备(例如通常部署在远程位置的无线传感器和执行器)提供高效、安全的轻量级对称密码原语实现。在这种情况下,加密算法必须消耗很少的计算资源,并且能够抵御各种各样的攻击,包括旁道攻击。 本论文的第一部分是关于轻量级对称算法在8位、16位和32位微控制器上的有效软件实现。这一部分的第一个贡献是FELICS的开发,FELICS是一个开源的基准测试框架,有助于从轻量级密码的实现中提取性能比较的图片。使用FE.
轻量级分组加密算法KLEIN
HuangJinLong2的博客
12-11 773
轻量级分组加密算法KLEIN
ASCON:以“慢而稳”赢得NIST轻量级加密算法标准
mutourend的博客
06-12 3511
ASCON:以“慢而稳”赢得NIST轻量级加密算法标准
轻量级分组密码综述-研究论文
06-10
轻量级密码学在过去几年中非常重要。 它成为安全嵌入式系统中最重要的模块之一,因为它一直是任何资源受限设备的强烈要求,并且具有几个特性,例如,它只消耗更少的功率、更少的内存等。本文是对各种轻量级设备的调查分组密码,如 PRESENT、GIFT、RECTANGLE、PICO 和 LED。 还总结了每种算法的优点和缺点以及作用于它们的几种攻击。
轻量级分组加密算法KATAN
HuangJinLong2的博客
12-10 446
轻量级分组加密算法KATAN
轻量级分组加密算法MIBS
最新发布
HuangJinLong2的博客
12-15 581
轻量级分组加密算法MIBS
RSA加密算法轻量级版,轻松易懂)(C++实现)
weixin_44995613的博客
05-03 4214
RSA编码实现(简单版)RSA编码1.判断素数 int IsPrime(int n)2.选取两个素数void InputPrime(int &p, int &q)3.计算n和n的欧拉函数 N(int p , int q, int &n,int &Euler_n)4.求两个数的最大公约数 Greatest Common Divisor (int a, int b)5...
密码学轻量级密码——present
03-28
轻量级密码present密码学轻量级密码——present
TWINE算法的相关密钥不可能飞来去器攻击
01-13
为了评估轻量级分组密码算法TWINE的安全性,利用相关密钥不可能飞来去器的方法对其进行了分析。构造了由16轮和17轮两条路径组成的相关密钥不可能飞来去器区分器,并将16轮和17轮的路径向前扩展4轮、向后分别扩展3轮和2轮,完成对23轮TWINE密码算法(80 bit密钥)的攻击。实验结果表明,该攻击的数据复杂度为2<sup>62.05</sup>个明文,时间复杂度为2<sup>70.49</sup>次23轮加密,与现有算法相比有明显优势。
LBlock轻量级分组密码算法
02-22
LBlock轻量级密码算法用于RFID,本文档是该算法的详细说明。
twine, Twine是一个 命令行 工具,用来管理你的字符串和它们的翻译.zip
09-18
twine, Twine是一个 命令行 工具,用来管理你的字符串和它们的翻译 Twine是一个 命令行 工具,用来管理你的字符串和它们的翻译。 这些都存储在一个主文本文件中,然后Twine使用这个文件导入和导出本地化文件,包括iOS和 Mac OS X .strings 文件,Android .xml 文件,
轻量级WG-8流密码密码分析
03-19
轻量级WG-8流密码密码分析
轻量级分组密码算法TWINE差分故障攻击的改进
01-14
针对轻量级分组密码TWINE的半字节分组差分扩散规律展开研究,提出一种新的差分故障攻击的方法,并基于S盒差分分布统计规律性计算出恢复轮密钥的概率下界,由此给出完整恢复种子密钥的故障注入次数期望。理论证明和...
论文研究-轻量级分组密码TWINE的差分故障攻击.pdf
07-22
为了对轻量级分组密码TWINE的安全性进行研究,分析了轻量级分组密码TWINE的抗差分故障攻击特性,给出了TWINE一种差分故障分析方法,采用面向半字节的随机故障模型对TWINE算法进行攻击。实验结果表明,在35轮注入4次...
物联网中轻量级密码系统TWINE的安全性分析
03-07
物联网中轻量级密码系统TWINE的安全性分析
trialogue:Twine的故事格式(http
05-06
Trialogue是一种聊天风格的Twine Story格式,基于 ,而后者又基于 。 :backhand_index_pointing_right: 演示故事: : :raised_fist: 由Trialogue提供支持的完整故事: ://fillafulla.sng.sk/chat/en/ :robot: ...
linux如何安装twine
06-01
在 Linux 系统上安装 Twine 有以下两种方法: **方法一:使用包管理器安装** 在大多数 Linux 发行版上,你可以使用包管理器来安装 Twine。具体命令如下: - Debian/Ubuntu 系统: ``` sudo apt-get update sudo apt-get install twine ``` - CentOS/Fedora 系统: ``` sudo yum install twine ``` - Arch Linux 系统: ``` sudo pacman -S twine ``` **方法:使用 pip 安装** 如果你的 Linux 系统上没有预装 Twine,你也可以使用 pip 命令来安装。具体命令如下: 1. 首先,确保你已经安装了 Python 和 pip。如果你没有安装,可以使用以下命令安装: - Debian/Ubuntu 系统: ``` sudo apt-get update sudo apt-get install python3 python3-pip ``` - CentOS/Fedora 系统: ``` sudo yum install python3 python3-pip ``` - Arch Linux 系统: ``` sudo pacman -S python python-pip ``` 2. 安装 Twine: ``` pip3 install twine ``` 安装完成后,你可以使用以下命令来验证是否安装成功: ``` twine --version ``` 如果安装成功,命令行会输出 Twine 的版本号。 希望这能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 数据结构大作业——银行排队系统 9681
  • 密码学学习笔记(五)——CKKS同态加密方案 9005
  • 密码学学习笔记(一)——凯撒密码及简单替换密码 4809
  • 密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine) 4506
  • 密码学学习笔记(三)——AES的查表加速 4268

分类专栏

  • 密码学 5篇
  • C语言 4篇
  • 渗透 1篇

最新评论

  • 密码学学习笔记(三)——AES的查表加速

    weixin_72835657: 怎么用头文件存放所有的表呀

  • 密码学学习笔记(四)——(t, n)门限的属性加密CP-ABE

    密码学爱好者: 解密算法中的连乘公式中的Delta(i)具体是什么意思?就是哪个三角符号

  • 密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)

    梓丶城: 加密结果就是乱码呀

  • 密码学学习笔记(二)——对称密码算法(轻量级密码算法Twine)

    chmcore: 请问一下这个为什么我运行的时候加密结果是乱码啊

  • 密码学学习笔记(四)——(t, n)门限的属性加密CP-ABE

    qq_52870890: 各个头文件对应名字是什么啊表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 密码学学习笔记(五)——CKKS同态加密方案
  • 密码学学习笔记(四)——(t, n)门限的属性加密CP-ABE
  • 密码学学习笔记(三)——AES的查表加速
2022年2篇
2021年4篇
2020年2篇

目录

目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梓丶城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

4617作文网周易预测的书女装店铺怎么起名字女孩起名13笔画的字有男孩邱姓起名字水果沙拉起什么名字女孩带金起名字大全2015周末股票可以交易可以吗周公解梦大全查询梦见捉鱼安徽周易研究会周易招聘朱姓属猪宝宝起名公众号起名字创意淘宝算命是真的吗八字算命测算餐饮公司名字大全起名创意有夫妻之实算是进入命理姻缘书法品牌起名易之堂算命网郑州市起名馆带佳字男孩起名字10月出生鼠宝宝起名算命网算事业属鼠起名可用字起名艺什么好听四柱八字算命案例姓周宝宝起名大全集周公解梦说法马氏 起名免费婚姻算命西安周易取名淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化