当前位置: 首页 > news >正文

童装网站建设国外对企业网站开发的研究

童装网站建设,国外对企业网站开发的研究,打不开网站怎么办,玉溪建设网站文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间#xff0c;本次为不严谨测试#xff0c;忽略了程序调用耗时#xff0c;结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS… 文章目录 本次测试环境本次测试所使用的系统时钟为48MHz本次测试主要测试对大量数据进行加解密所需的时间本次为不严谨测试忽略了程序调用耗时结果仅供参考。 AES算法与数据加解密加密与解密对称加解密AES算法AES-ECBAES-CBC 填充算法PKCS7Padding 配置硬件AES模块初始化编写测试代码编写填充与解填充代码编写大小端转换代码编写aes模块密钥与模式配置代码封装加解密接口编写ecb测试代码编写cbc测试代码创建密钥与待加密的数据 调用测试接口对aes模块进行测试测试结果 今天使用NUCLEO-U083RC的评估板测试一下他内置的AES加速模块性能如何。 全部代码以上传到githubhttps://github.com/what-sudo/stm32U083 正文开始本工程基于前期配置的工程模板感兴趣的可查看之前的文章。 《STM32Cube系列教程10STM32CubeIDE工程创建串口DMAIDLEprintf重定向软中断处理串口数据非阻塞延时任务》 本次测试环境 本次测试所使用的系统时钟为48MHz 本次测试主要测试对大量数据进行加解密所需的时间本次为不严谨测试忽略了程序调用耗时结果仅供参考。 AES算法与数据加解密 在使用aes模块之前这里先简单说一下什么是加解密以及aes算法的特性 以下内容摘录自我的另一篇文章其中简单讲述了对称加密算法非对称加密算法数据散列算法等内容感兴趣的请移步观看。 《数据安全-签名、加密、与填充》 加密与解密 加密将明文原始数据和加密密钥一起经过特殊加密算法处理后使其变成复杂的加密密文。 解密使用密钥及对应的解密算法对密文进行解密使其恢复成可读明文。 加解密通常需要使明文数据按照一定长度对齐叫做块大小BlockSize例如AES加解密的BlockSize为16字节RSA加解密的BlockSize等于密钥长度。 如果数据长度无法对齐到要求的长度就需要使用填充算法加密前与解密后需要使用相同的填充算法对数据进行填充或解填充。 加密与解密一般需要对数据进行分包将明文数据分包处理后使用加密算法对每包数据进行运算求出密文数据每包密文数据的长度通常都是等长的将每包密文依次连接形成完整的密文数据。 解密时按照加解密算法对应的包长度依次将每包密文进行解密运算拼凑出明文数据。 对称加解密 加密密钥与解密密钥相同的加密算法。 特点 算法公开计算量小速度快效率高密钥传输与密钥管理麻烦 通常用于对大量数据进行加密 常用的加密算法AES、DES。 AES算法 AES算法安全性与密钥长度关联密钥长度越长越安全。 AES密钥分为AES128、AES192、AES256。 明文需要被分为固定长度的块进行加密BlockSize为16字节。 数据如果被损坏解密能正常运算但会得到错误的明文。 AES算法通常分为ECB与CBC模式我们通常使用的时CBC模式。 AES-ECB ECB模式是最简单的AES加密模式使用一个固定长度的密钥固定的明文将会生成固定的密文如果有两个相同的明文块则加密结果也相同。 优点 简单有利于并行计算误差不会传递。 缺点 安全性低容易被爆破 加密流程 解密流程 AES-CBC 加解密需要使用一个固定长度的密钥加解密需要一个16字节的初始向量相同的明文不会生成相同的密文 优点 安全性比ECB好 缺点 不利于并行计算误差会被传递需要保存初始向量IV 加密流程 解密流程 填充算法 AES加解密算法仅支持按照block大小进行加解密如果需要加密的数据无法被block大小整除则无法加密因此这里需要对原始数据进行填充aes加密算法使用的填充方法为PKCS7Padding算法这也是openssl库中对aes加解密时默认使用的填充算法我们需要保证我们加密出的数据能够与openssl互通因此需要以openssl为标准openssl是一个开源的软件库程序可以使用这个库进行安全通信数据加解密等操作详情请自行百度。 在进行加密操作之前。需要对原始数据进行填充在密文解密为明文后需要按照填充规则对解密数据进行解填充才能获取到真实的原始数据。 内容摘录自我的另一篇文章其中简单讲述了对称加密算法非对称加密算法数据散列算法等内容感兴趣的请移步观看。 《数据安全-签名、加密、与填充》 PKCS7Padding PKCS7是16字节填充的即填充一定数量的内容使得成为16的整数倍而填充的内容取决于需要填充的数目。 例如 // 原数组 {0x56} //PKCS7填充结果 {0x56, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f}// 原数组 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08} //PKCS7填充结果 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}// 原数组 {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08} //PKCS7填充结果 { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10 }如果已经满足了16的整倍数按照PKCS7的规则仍然需要在尾部填充16个字节并且内容是0x10,目的是为了加解密时统一处理填充。 因此进行pkcs7填充后的数据最多会比原始数据长16个字节 原理讲到这里下面我们写代码测试一下。 配置硬件AES模块初始化 打开我们的工程模板在CubeMX配置中打开Security -- AES配置勾选Activated功能注意Data type设置是否为默认值32bData width unit与Header width unit需要保持为word类型其他配置保持默认即可我这里曾改为CBC模式系统默认应该时ECB模式这里无影响后面我会在代码中重新配置加解密模式与密钥key。保存并生成代码。 编写测试代码 这里我们主要使用ECB与CBC两种模式进行多轮加解密通过计算加解密的时间来衡量aes模块的性能。 编写填充与解填充代码 通过这两个函数在加密前与解密后对数据进行填充与解填充。 /*** brief pkcs7填充算法* param p: 需要填充的数据指针* param len: 需要填充的数据长度* param block_size: 按照多大的block进行填充通常为16* return 填充后的数据长度* author joseph* date 2024.5.27*/ static size_t pkcs7Padding(unsigned char *p, size_t len, uint8_t block_size) {uint8_t i 0;uint8_t padding 0;padding block_size - len%block_size;for (i 0; i padding; i) {p[len i] padding;}return (len padding); }/*** brief pkcs7解填充算法* param p: 需要解填充的数据指针* param len: 需要解填充的数据长度* param block_size: 按照多大的block进行填充通常为16* return 解填充后的数据长度* author joseph* date 2024.5.27*/ static size_t pkcs7UnPadding(unsigned char *p, size_t len, uint8_t block_size) {uint8_t unPadding 0;unPadding p[len - 1];int i 0;if (unPadding 16) {return -1;}for (i 0; i unPadding; i) {if (p[len - 1 - i] ! unPadding)return -1;}return (len - unPadding); } 编写大小端转换代码 STM32中数据的保存方式为小端模式但是在openssl中默认使用的是大端模式为了保证在使用相同的输入时能够获取到相同的输出因此需要进行大小端转换。 #define BLSWAP32(val) \((val) ((uint32_t)((((uint32_t)(val) (uint32_t)0x000000ffU) 24) | \(((uint32_t)(val) (uint32_t)0x0000ff00U) 8) | \(((uint32_t)(val) (uint32_t)0x00ff0000U) 8) | \(((uint32_t)(val) (uint32_t)0xff000000U) 24))))编写aes模块密钥与模式配置代码 通过这个函数对aes模块进行密钥与算法模式进行配置 typedef enum {AES_ALGO_ECB,AES_ALGO_CBC, } AES_Algorithm_t;/*** brief aes模块密钥与模式配置代码* param key: aes密钥指针* param key_len: aes密钥长度* param mode: aes算法模式ECB/CBC* param iv: 初始向量指针如果为ECB时入参NULL即可* return 0SUCCESS, 0: fail* author joseph* date 2024.5.27*/ int aes_set_config(uint8_t *key, int key_len, AES_Algorithm_t mode, uint8_t *iv) {int ret -1;CRYP_ConfigTypeDef cryp_conf {0};do {if (key_len ! 32 || key NULL) {printf(error: The key length only supports 32\n);break;}if (mode CRYP_AES_CBC iv NULL) {printf(error: iv param is null\n);break;}for (int i 0; i key_len 2; i )BLSWAP32(((uint32_t*)key)[i]);if (HAL_CRYP_GetConfig(hcryp, cryp_conf) ! HAL_OK) {printf(error: HAL_CRYP_GetConfig fail\n);break;}cryp_conf.Algorithm (mode AES_ALGO_ECB) ? CRYP_AES_ECB : CRYP_AES_CBC;cryp_conf.pKey (uint32_t *)key;if (mode AES_ALGO_CBC) {for (int i 0; i 4; i )BLSWAP32(((uint32_t*)iv)[i]);cryp_conf.pInitVect (uint32_t *)iv;}if (HAL_CRYP_SetConfig(hcryp, cryp_conf) ! HAL_OK) {printf(error: HAL_CRYP_SetConfig fail\n);break;}ret 0;} while (0);return ret; } 封装加解密接口 通过封装的这个接口完成对数据的加密与解密 ##### 注意代码中的CRYPT_NUM_TIMES 时我进行多轮测试时使用的正常进行加解密时应该删除与CRYPT_NUM_TIMES有关的代码或将CRYPT_NUM_TIMES设置为1。##### typedef enum {AES_ENCRYPTO_MODE,AES_DECRYPTO_MODE, } AES_Crypt_Mode_t;#define CRYPT_NUM_TIMES 1 // 设置加解密测试轮数/*** brief aes加解密接口* param mode: aes加解密模式EN/DE* param in_buffer: 等待加解密的数据指针* param inlen: 输入的数据长度* param out_buffer: 保存加解密后数据的内存指针* return 0输出的数据长度, 0: fail* author joseph* date 2024.5.27*/ int aes_crypt(AES_Crypt_Mode_t mode, unsigned char *in_buffer, int inlen, unsigned char *out_buffer) {int ret -1;int plain_len 0;memmove(tmp_buffer, in_buffer, inlen);do{start HAL_GetTick();for (i 0; i CRYPT_NUM_TIMES; i){memmove(in_buffer, tmp_buffer, inlen);if (mode AES_ENCRYPTO_MODE) {plain_len pkcs7Padding((uint8_t *)in_buffer, inlen, AES_BLOCK_SIZE);for (int i 0; i plain_len 2; i)BLSWAP32(((uint32_t *)in_buffer)[i]);if (HAL_CRYP_Encrypt(hcryp, (uint32_t *)in_buffer, plain_len 2, (uint32_t *)out_buffer, 0xff) ! HAL_OK){printf(error: HAL_CRYP_Encrypt fail\n);break;}for (int i 0; i plain_len 2; i)BLSWAP32(((uint32_t *)out_buffer)[i]);} else {for (int i 0; i inlen 2; i)BLSWAP32(((uint32_t *)in_buffer)[i]);if (HAL_CRYP_Decrypt(hcryp, (uint32_t *)in_buffer, inlen 2, (uint32_t *)out_buffer, 0xff) ! HAL_OK){printf(error: HAL_CRYP_Decrypt fail\n);break;}for (int i 0; i inlen 2; i)BLSWAP32(((uint32_t *)out_buffer)[i]);plain_len pkcs7UnPadding((uint8_t*)out_buffer, inlen, AES_BLOCK_SIZE);}}end HAL_GetTick();if (i ! CRYPT_NUM_TIMES) {printf([%d] error: CRYPT_NUM_TIMES i:%d fail\n, __LINE__, i);break;}interval end - start;printf(%s %d times: %ld\n, mode 0 ? encrypto : decrypto, CRYPT_NUM_TIMES, interval);ret plain_len;} while (0);return ret; }编写ecb测试代码 int aes_ecb_test(void) {int ret -1;int text_len strlen(Text);int length 0;do {memmove(AES_key, AES_key1, 32);aes_set_config(AES_key, 32, AES_ALGO_ECB, NULL);printf( aes_ecb_test 1 \n);memset(plain, 0, sizeof(plain));memmove(plain, Text, text_len);length aes_crypt(AES_ENCRYPTO_MODE, plain, text_len, cipher);if (length 0) {printf([%d] error: aes_crypt fail\n, __LINE__);break;}printf(encrypto len: %d\n, length);// show_hex(cipher, 64);memset(plain, 0, sizeof(plain));length aes_crypt(AES_DECRYPTO_MODE, cipher, length, plain);if (length 0) {printf([%d] error: aes_crypt fail\n, __LINE__);break;}printf(decrypto len: %d\n, length);// printf(%.*s\n, 64, plain);if (text_len length memcmp(plain, Text, length) 0) {printf(\naes_ecb_test success\n);} else {printf(\naes_ecb_test fail\n);}ret 0;} while (0);return ret; }编写cbc测试代码 int aes_cbc_test(void) {int ret -1;int text_len strlen(Text);uint16_t length 0;do {memmove(AES_key, AES_key1, 32);memmove(aesiv, aesiv1, 16);aes_set_config(AES_key, 32, AES_ALGO_CBC, aesiv);printf( aes_cbc_test 1 \n);memset(plain, 0, sizeof(plain));memmove(plain, Text, text_len);length aes_crypt(AES_ENCRYPTO_MODE, plain, text_len, cipher);if (length 0) {printf([%d] error: aes_crypt fail\n, __LINE__);break;}printf(encrypto len: %d\n, length);// show_hex(cipher, 64);memset(plain, 0, sizeof(plain));length aes_crypt(AES_DECRYPTO_MODE, cipher, length, plain);if (length 0) {printf([%d] error: aes_crypt fail\n, __LINE__);break;}printf(decrypto len: %d\n, length);// printf(%.*s\n, 64, plain);if (text_len length memcmp(plain, Text, length) 0) {printf(\naes_cbc_test success\n);} else {printf(\naes_cbc_test fail\n);}ret 0;} while (0);return ret; } 创建密钥与待加密的数据 以下这些变量是在程序执行过程中需要使用的数据其中明文数据约3.5k字符用于测试加解密性能。 // 加解密的key uint8_t AES_key1[33] 12345678901234561234567890123456; // cbc模式下需要使用的初始向量iv uint8_t aesiv1[17] 1234567890123456;// 多轮加密时需要传入的密钥内存 uint8_t AES_key[32] {0}; uint8_t aesiv[16] {0};// 待加密的原始数据约3.5K字符。 char Text1[] \ -----BEGIN PRIVATE KEY----- \ MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCsXDZ8s9ToFit \ HE9KfJSPOYjGR/OxnAUNPxKWoQ6l5nCS9Uhazdl9hF6PDjy0mGE6ZFdW7cTsmg \ uTIMVY0BlOT6hRwfxoSLqjF6L99Nb906cOX5eGxEbOE0k9OFkKZw3KGiPpm007TN \ 3IBwYRLoVLwnXHFfcsJ4w52GfwOyFAlc99Nv45/o4lzj3yYdBWBey1bLotoTcK1u \ J97iv6DFTb28GN/XR3qbSHNFJsxKtwoj8Rwj3aAq/4cVpH7uhkOOLjCclBdsWTlb \ fmuZJ4ISfHnMDtZjIEH3LAb8ILoGnytcqTd9nb4d0gYsKFsqAjrK4akDq85ZQQx7 \ At4jzY5C0lwM89WxP0/saph6lsgdhjjS9P8I7dwJyFTaLfiaKIOYf31w9mHrpnS \ yIRGgEnwosow6cQ49m6klCnvs46bJ9ZaSg1wqKkrp8VSvBs1tto749NS5YcTKT \ oQwpqHWpbrEr78oTCYRrf/8ggk0LHP/PRj6GNJYMX62BafInz6RnwWUb6nBoF8 \ ioXZ17aa0mBAxREfjwxk1S5EblhU1a92V5x1YwVUTfnN19FVmXJpv/o3nx6cwk \ c8j0xMRMNPHVJIOGNcgYmlzpRGMC6DYP69Cj64k9uLmESVCRuyQzJjZbANqDNvFa \ 0cjpbKkRDOtzxzjjivawPc6okW7W7QIDAQABAoICAADp3aKjI/D1ikmVRE4Y5nYc \ aPL/Y3MgnbJ1uJO4cmI23PYHAzdgkFx4KaNInK1UFJKzunJbpyUJmxruSboJA \ bEcggDMEWCFb8ndgcT78d8pEVAeiqKl7DrLChKcFeAJsQsNUJoZd624mes73gT \ oS7P8Gfkdi2Niif8jRGtfMuAtQyKjhmiiO/u0zT2Bx6pgNANWdgerSAS10n7Vtu \ W2kEBrxETDhrej4SOsllKa3PhI6X0nrcbyQSSmllvWlLJl/2yej7kgcE8hY9J3k \ UtynFp9gl5szIS6iNOo0f5NUcQwLX1tZp5ClVrUAKAzFdkHoii18lZYSVT79kkD \ yN66XwwrIRUeZkRAygI2IxtsA1T0rexN/bRV/ZRLyW5GVlMnd4z7h8OGjWcMjh \ PCniGxu03wp2rulRSYPs0/krZ3mKYNtzkv/2fKJZKlqA8qvsFKWxcODMHtFoglf \ ea6rHoCRckRzIB30I8ro7bXXZN3B9hgHQuXtwEUq6jnnF9l9xeEQC/qf2wtxAK \ EO3Dd/fRUbbPEr8gvRBNdbEEQRxMCaKBGHmqu5RELhsnrgGKmHnbricxouVIS54 \ 1MS1DakaqZRJkz//5IYR6lP08kDGqWIbCo5B9vlrJtg3iwHf86W8anBHMZC1PtcC \ lh1anrVvt3V4pr2T3xrPAoIBAQDqyOGddJL7Rx5Wd2RuIXA8WmIFqBzwsRyS9oN \ Ns1IP9etANzt5Tmhs5yxb7RsI5olwOVtdgVpieUPRkUgrmt1bkSxRPKtZ7k753aV \ rgqNaaOrZGEYwW7jC5xPmQAkqJthhIgTWjJh7N5Sby5nvLsSD4dhp6AfGBN6kEzs \ KH9IlDdOfuCPgCBGEZnkKIuOM/NFRO/VEJpGRuaGqPMZhbmDKkilP3yfSezqDuT \ 3Put0XsfPzucozDfe/07O99Fwi/zQyI5Wz5ZSICnmkXH7HDbb4jH/VP8rO6HhCf \ z48Hlk3xAY9aD13PSmaJauqwpu2RPsvkse1ZdhZDKeyfiKF7AoIBAQC7706o1us \ pRbY5JqruO5b3yb0c/sGHX77c/qSFWQ1QOy9iVtmzWR9yajzUqa5zwIm1awit \ /PFlw444ClESAV4Qy47TwwU4SIGBn25g0bQI2/x/TYGEYxKUiIlvGcZlnrz6/H \ z60y0usTzNTNDKVcjnt7lBEM2XcEGwxNbwWfRzwHGGLFOurJmuKZF1JE9js3nLHN \ QbwPI1JGAnfMKTvLWa9CV3Mq6xhTazoTe1S2ubnG/wa9getgrziiqKlPshmmjzCi \ YK8YiFRF72EmY/bl5DSiN2X/ltuepGjTe0iZ9Bd64puhmI1Nyoy1vEAME5Fw7je \ CTpaFgKCKbi3AoIBACLpResU13o3xAIVdMCPhlJFsWyDM3dyzo3ny/R00qH7kE \ 5NUW/a/WtlkIBCsETDqK6VKSdxGPaJkR2NuYM/BdOiel2fQA9WE79L0jCPyoFac5 \ oNpgMP/Wk0lfndfGVOwLEn0/mWdSmJZ9VR/fSiU3zD/MvsE3MQTPofay8JVFA \ CK8AKzEG/AkQT51R40xacvpDPDDGg/0xMuQE1ijU/x1eTDiPdaTYQiulc2MWdvpI \ R4/pRpcXFeQ0ixPtpeZnRhLhEogvCpSbG4NNujAWFGzCpsaBj0oAiHZK9biqFLb \ WYaJvGhDZuXOGSG1YKP1U3opHuLrlTnddQrv1RsCggEAKsU8rpoy8ZBHPpdQSBK \ PVKNyksePSoX99zYe6Y4qvx/mgQA4p/3IiA9XbOH0v6oudHr90LHaW6PoGx5Tkb \ 2DAtez8IY1M35eZCawChCaRBwm6NGF/ITjxqJCPrF5F4GUw7cBd0ThUvbDfz8X \ kw70t0rJYbqFnWLa4jIVPsWWXh5xdeb6u0MsBMqzNKM65rqQS7NHDyAkyVjvQEk \ yHb937qqczu5vyO/5oQ5tGNWFTvRduNlYk2mBtv51LLzzWpoAgsGc33ze27TVxMy \ m2RWNV2pSN24veFUXBdor/CXxknR6iqWZsF0LycQvO952AXADOZ6BZLjGMD8SGT \ owKCAQBSY8O/L6/vtICdfyX24S1FTxrQdQVCk03a3LcRnO9Loaxuvawy6lcjicDE \ YAP51EYhOKW9akxBRSEB2soRs92rnuBS522re6k/c8GUck3tkj5Go8v8DqgbiW \ D5Zu2x0rXJ/caO6u0le6UrIIOScuIPJ6tuu9OhV9sr5zJzAfIUupRpckD6TP7/X \ T6fG4lNteg8ftRfRvYd6g/jEmh/ECHvc5YDdXihDGv028BFj5fWY/iZEjMGektRf \ tPyMMOI4t93oni0Go8OkF2FIYsquWMEh4IILMm27mVZk7AFLWhK/FXec3dogO \ 7IbiS/98RTtjVN4NIQJ9Jc8hUhkW \ -----END PRIVATE KEY----- \ ;char *Text Text1;// 加解密过程中需要的内存 uint8_t plain[4096 16] {0}; uint8_t cipher[4096 16] {0}; uint8_t tmp_buffer[4096 16] {0};// 计算加解密时间所需要的变量 int i 0; uint32_t start, end, interval; 调用测试接口对aes模块进行测试 到这里测试需要的代码已经全部编写完成只需要在while循环之前调用对应的测试接口就可以完成对aes模块的性能测试 ** 注意 需要修改上文曾提到的宏CRYPT_NUM_TIMES通过修改这个宏的值来设置加密的轮数。这里我已经将其设置为1000 // 分别测试ecb与cbc加密aes_ecb_test();aes_cbc_test();while (1){// ***************** 测试结果 编译代码查看是否有编译报错编译成功后将代码烧录到单片机通过串口调试工具可查看到结果。 数据显示 加密模式单次计算字节计算轮数总计算字节所用时间(ms)每KB耗时(ms)ECB加密339210003312.5KB60611.83ECB解密338110003301.8KB60391.83CBC加密339210003312.5KB60631.83CBC解密338110003301.8KB60411.83 以上就是本次测试的所有内容结果仅供参考。
http://www.zqtcl.cn/news/747320/

相关文章:

  • 南宫企业做网站wordpress图片显示距离
  • 青岛红岛做网站百度怎么打广告
  • 凡科建站怎么建网站网络搭建是什么工作
  • wordpress支持国内视频的编辑器网站优化排名软件网站
  • 建设摩托官方网站南京做网站群的公司
  • 晋城城乡建设局网站设计网站公司选泽y湖南岚鸿询 问
  • 思坎普网站建设湘潭网站推广
  • 北京网站建设公司哪个最好做投标网站条件
  • 网站建设的成本有哪些内容怎么样制作网页
  • 怎么做网站的seo排名知乎茂名网站制作公司
  • 建安证查询网站官方网站建设对比
  • 关于医院要求建设网站的请示市场推广12种推广渠道
  • php做不了大型网站深圳公司注册网址官方
  • 网站副标题怎么写杭州抖音代运营
  • 网站建设基本资料网站数据库连接出错
  • 娄底网站开发温州seo排名公司
  • 成都有哪些网站开发公司最新网推项目
  • 分享公众号的网站小型企业类网站开发公司
  • 青岛网站建设方案案例wordpress主题模板 国人
  • 哪家高端网站建设好贷款织梦网站模板
  • 北京网站建设公司价格最近中文字幕2018免费版2019
  • 帮人做设计的网站自己怎么做新闻开头视频网站
  • 网站开发搜索功能中国建设银行ie下载网站
  • 中山网站建设 骏域网站的形式有哪些
  • 深圳企业网站重庆建站塔山双喜
  • 征婚网站 女 做茶叶生意企业网站推广服务协议
  • 安徽省住房城乡建设厅网站官网英语机构网站建设方案
  • 电商建站价格深圳龙岗建站公司
  • 可以下载源程序的网站.htaccess wordpress
  • 国内优秀设计网站小程序推广方案