C#与C程序通讯时,为了数据安全,要对数据进行DES_cbc_pkcs7加密,这是C的实现
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
功能:用mode = cbc , padding = pkcs7 来加密
如果to == NULL, 则返回加密后数据的长度
书写:evlon ,QQ:273352165
*/
int des_ecb_pkcs7_encrypt(uchar* from, int nLength, uchar * to, uchar key[])
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
int nSize = nLength % 8 ?(nLength + 7) / 8 * 8 : nLength + 8;
if(to == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//计算长度
return nSize;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
deskey(key,EN0);
uchar endBuf[8];
int i=0;
for(; i < nSize; i+=8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
uchar* ps = NULL,* pd = NULL;
if(nLength - i >= 8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ps = from + i;
pd = to + i;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
memset(&endBuf, i + 8 - nLength, sizeof(endBuf));
memcpy(&endBuf,from + i,nLength - i);
ps = endBuf;
pd = to + i;
}
![](/Images/OutliningIndicators/InBlock.gif)
des(ps,pd);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
return i;
}
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int des_ecb_pkcs7_decrypt(uchar* from, int nLength, uchar * to, uchar key[])
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(nLength % 8)
return 0; //数据不正确
![](/Images/OutliningIndicators/InBlock.gif)
deskey(key,DE1);
int i = 0;
for(; i < nLength; i+=8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(nLength - i > 8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
des(from + i,to + i);
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
uchar endBuf[8];
des(from + i,endBuf);
//去除数据尾
uchar chEnd = endBuf[7];
if(chEnd > 0 && chEnd < 9)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//有可能是填充字符,去除掉
for(int j = 7; j >= 8 - chEnd; --j)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(endBuf[j] != chEnd)
return 0;
}
![](/Images/OutliningIndicators/InBlock.gif)
memcpy(to + i, endBuf, 8 - chEnd);
return i + 8 - chEnd;
![](/Images/OutliningIndicators/InBlock.gif)
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return 0;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//*
功能:用mode = cbc , padding = pkcs7 来加密
如果to == NULL, 则返回加密后数据的长度
书写:evlon ,QQ:273352165
*/
int des_cbc_pkcs7_encrypt(uchar* from, int nLength, uchar * to, uchar key[],uchar iv[])
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
int nSize = nLength % 8 ?(nLength + 7) / 8 * 8 : nLength + 8;
if(to == NULL)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//计算长度
return nSize;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
deskey(key,EN0);
uchar* fromBackup = from;
from = (uchar*)malloc(nSize); //申请内存
memcpy(from,fromBackup,nLength);
memset(from + nLength, nSize - nLength,nSize - nLength);
uchar preEnc[8];
memcpy(preEnc,iv,8);
//加密块
int i=0;
for(; i < nSize; i+=8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
uchar* ps = from + i;
uchar* pd = to + i;
![](/Images/OutliningIndicators/InBlock.gif)
//XOR
for(int j = 0; j < 8; ++j)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ps[j] ^= preEnc[j];
}
![](/Images/OutliningIndicators/InBlock.gif)
des(ps,pd);
![](/Images/OutliningIndicators/InBlock.gif)
//保存前一个输出
memcpy(preEnc, pd,8);
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/InBlock.gif)
free(from);
![](/Images/OutliningIndicators/InBlock.gif)
//memcpy(to + i,preEnc,8);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
return i;
}
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int des_cbc_pkcs7_decrypt(uchar* from, int nLength, uchar * to, uchar key[], uchar iv[])
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(nLength % 8)
return 0; //数据不正确
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
uchar* toBackup = to;
to = (uchar*)malloc(nLength); //申请内存
![](/Images/OutliningIndicators/InBlock.gif)
//XOR
uchar preEnc[8];
memcpy(preEnc,iv,8);
![](/Images/OutliningIndicators/InBlock.gif)
deskey(key,DE1);
![](/Images/OutliningIndicators/InBlock.gif)
int i = 0;
for(; i < nLength; i+=8)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
uchar* ps = from + i;
uchar* pd = to + i;
![](/Images/OutliningIndicators/InBlock.gif)
des(ps,pd);
![](/Images/OutliningIndicators/InBlock.gif)
//XOR
for(int j = 0; j < 8; ++j)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
pd[j] ^= preEnc[j];
}
![](/Images/OutliningIndicators/InBlock.gif)
//保存前一个输出
memcpy(preEnc, ps,8);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//去除数据尾
uchar chEnd = to[nLength - 1];
if(chEnd > 0 && chEnd < 9)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//有可能是填充字符,去除掉
for(int j = nLength - 1; j >= nLength - chEnd; --j)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if(to[j] != chEnd)
return 0;
}
![](/Images/OutliningIndicators/InBlock.gif)
int nSize =nLength - chEnd;
![](/Images/OutliningIndicators/InBlock.gif)
memcpy(toBackup, to, nSize);
free(to);
return nSize;
![](/Images/OutliningIndicators/InBlock.gif)
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//数据格式不正确
free(to);return 0;
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
测试代码如下:
//把字节数组转换成字串
int Byte2String(uchar* bytes, int nLength, char* pszout)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(!pszout)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return nLength * 3;
}
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for (int i = 0; i < nLength; ++i)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
//sb.AppendFormat("{0} ", b.ToString("X2"));
sprintf(pszout + i * 3,"%2X ",bytes[i]);
}
![](/Images/OutliningIndicators/InBlock.gif)
*(pszout + nLength * 3 -1) = '\0';
return nLength * 3;
}
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//////////////////////////////////////////////////
///////// 测试代码 ///////////
/////////////////////////////////////////////////![](/Images/OutliningIndicators/None.gif)
void cbcDesTest1()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar key[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar iv[8] =
{1,2,3,4,5,6,7,8};
uchar text[25] = "123456789abcdef中国人ok";
uchar *output = NULL;
uchar text2[sizeof(text)];
memset(&text2,0,sizeof(text2));
![](/Images/OutliningIndicators/InBlock.gif)
int nLength = des_cbc_pkcs7_encrypt(text,24,NULL,key,iv);
output = new uchar[nLength];
memset(output,0,nLength);
![](/Images/OutliningIndicators/InBlock.gif)
des_cbc_pkcs7_encrypt(text,24,output,key,iv);
des_cbc_pkcs7_decrypt(output,24,text2,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
delete[] output;
output = NULL;
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
void cbcDesTest2()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
char szPrint[1024];
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar key[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar iv[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/InBlock.gif)
StringPack pack;
pack.OpCode = 2;
pack.CharEnd = '8';
strcpy(pack.Name, "123456789abcdef中国人ok");
![](/Images/OutliningIndicators/InBlock.gif)
uchar* pPack = (uchar*)&pack;
![](/Images/OutliningIndicators/InBlock.gif)
//计算数据长度
int nLength = des_cbc_pkcs7_encrypt(pPack,sizeof(StringPack),NULL,key,iv);
uchar* output = new uchar[nLength];
memset(output,0,nLength);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(pPack,sizeof(StringPack),szPrint);
printf("%s\n",szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
//加密
des_cbc_pkcs7_encrypt(pPack,sizeof(StringPack),output,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(output,nLength,szPrint);
printf("%s\n",szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//检验一下加密结果,现在解密
uchar *packData = new uchar[nLength];
memset(packData,0,nLength);
des_cbc_pkcs7_decrypt(output,nLength,packData,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
//好了,我们看一下结果吧
StringPack* pack2 = (StringPack*)packData;
![](/Images/OutliningIndicators/InBlock.gif)
//清理内存
delete[] packData;
output = NULL;
![](/Images/OutliningIndicators/InBlock.gif)
delete[] output;
output = NULL;
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
void cbcDesTest3()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar key[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar iv[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/InBlock.gif)
// 7 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_cbc_pkcs7_encrypt(text,sizeof(text),output,key,iv);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_cbc_pkcs7_decrypt(output,nRet,text2,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
// 8 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_cbc_pkcs7_encrypt(text,sizeof(text),output,key,iv);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_cbc_pkcs7_decrypt(output,nRet,text2,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
// 9 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2,0xF0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_cbc_pkcs7_encrypt(text,sizeof(text),output,key,iv);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_cbc_pkcs7_decrypt(output,nRet,text2,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
// N 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2,0xF0, 0xA5, 0xED, 0x9F, 0xA5, 0xED, 0x9F, 0xA5, 0xED, 0x9F};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_cbc_pkcs7_encrypt(text,sizeof(text),output,key,iv);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_cbc_pkcs7_decrypt(output,nRet,text2,key,iv);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
void ecbDesTest1()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar key[8] =
{1,2,3,4,5,6,7,8};
![](/Images/OutliningIndicators/InBlock.gif)
// 7 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_ecb_pkcs7_encrypt(text,sizeof(text),output,key);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_ecb_pkcs7_decrypt(output,nRet,text2,key);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
// 8 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_ecb_pkcs7_encrypt(text,sizeof(text),output,key);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_ecb_pkcs7_decrypt(output,nRet,text2,key);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
// 9 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2,0xF0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_ecb_pkcs7_encrypt(text,sizeof(text),output,key);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_ecb_pkcs7_decrypt(output,nRet,text2,key);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
// N 位长
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text[] =
{0xF0, 0xA5, 0xED, 0x9F, 0x83, 0x8A, 0xE0, 0xE2,0xF0, 0xA5, 0xED, 0x9F, 0xA5, 0xED, 0x9F, 0xA5, 0xED, 0x9F};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar output[1024] =
{0};
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
uchar text2[1024] =
{0};
int nRet = des_ecb_pkcs7_encrypt(text,sizeof(text),output,key);
char szPrint[1024];
//打印出来
Byte2String(output,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
![](/Images/OutliningIndicators/InBlock.gif)
nRet = des_ecb_pkcs7_decrypt(output,nRet,text2,key);
![](/Images/OutliningIndicators/InBlock.gif)
//打印出来
Byte2String(text2,nRet,szPrint);
printf("(%d)\n%s\n",nRet,szPrint);
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
}
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
int _tmain(int argc, _TCHAR* argv[])
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
ecbDesTest1();
cbcDesTest1();
cbcDesTest2();
cbcDesTest3();
getchar();
![](/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](/Images/OutliningIndicators/None.gif)
QQ:273352165
evlon#126.com
转载请注明出处。