VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 5254|回复: 33

[原创] C语言实现IP地址字符串加密

[复制链接]
51_avatar_middle
online_admins 发表于 2014-7-21 17:37:35 | 显示全部楼层 |阅读模式
简介:
这几天在我们 vc驿站-www.cctry.com 上面看到一位网友发了一篇关于加密IPv4字符串的提问帖子,被我看到了。
帖子地址:https://www.cctry.com/thread-238356-1-1.html

简单与楼主沟通了之后,了解了加密的原理,感觉还不错,简单实用。于是就用C语言实现了这个加密的算法,有加密就得有解密,于是顺便也把解密的算法给写出来了,这里面跟大家分享下。将这个 IP 地址加密之后可以应用与很多方面,比如大家都感兴趣的远控编程,将主控端的IP地址进行加密等等,大家也来学习下吧!

算法原理:
该算法有个加密与解密的表格,如下:

     0   1   2   3   4   5   6   7   8   9   10   11   12   13   14
0   s    t   u   v   w   x   y    z   a    b    c     d     e     f      g
1   t    u   v  w   x    y   z    a   b    c    d     e     f     g      h
2   u   v   w  x    y   z    a   b   c    d    e     f     g      h     i
3   v   w   x   y    z   a   b   c    d   e    f      g    h      i      j
4  w    x   y   z    a   b   c   d    e    f    g     h     i      j      k
5  m   n   o   p   q   r    s   t    u    v   w     x     y     z     a
6  n    o   p   q   r    s    t   u    v   w   x      y    z     a     b
7  o    p   q   r    s   t    u   v    w   x    y     z     a    b     c
8  p   q    r    s    t   u   v   w    x    y   z     a     b    c     d
9  q    r    s    t    u   v  w   x     y   z   a     b     c    d     e
.    r    s   t     u   v   w   x   y    z    a   b    c     d     e     f

////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
/////////////////////////////////////////////////////////////////////////////////

大家可以看看,也就是说该表格是个二维的数组,总共有11行、15列。为什么有11行呢,因为在IPv4中,所有能出现的字符也就是0123456789这么十格数字,再加上一个“.”符号,所以就是11行了,那么为什么又是15列呢?因为在IPv4中最长的IP字符串就是15位,例如:192.168.105.123,算上“.”符号也就是15位的长度,所以总共是15列。好了,关于这个表格就讲解到这里吧,下面说说如何用这个表格去加密IPv4的字符串。

这里举个例子,比如要加密的IPv4的地址为:192.168.105.123,我们一位一位的来取字符。 IP地址中每个字符的字面值代表行,他在IP地址字符串中的位置代表列。按照这个理论去加密IP地址的字符串就可以了。

比如IP地址中第一个字符为'1',他的字面值就是1,所以我们定位到表格的第一行也就是这行:1 t u v w x y z a b c d  e  f  g  h,他在IP地址字符串中的位置是0(字符串的位置从0开始),所以我们直接取出表格第一行的第0列,即:字符't',所以'1'加密后的结果就是't'。

接着来,IP地址中第二个字符为'9',他的字面值就是9,所以我们定位到表格的第九行也就是这行:9 q r s t u v w x y z a  b  c  d  e,他在IP地址字符串中的位置是1(字符串的位置从0开始),所以我们直接取出表格第九行的第1列,即:字符'r',所以'9'加密后的结果就是'r'。

再来,IP地址中第三个字符为'2',他的字面值就是2,所以我们定位到表格的第二行也就是这行:2 u v w x y z a b c d e  f  g  h  i,他在IP地址字符串中的位置是2(字符串的位置从0开始),所以我们直接取出表格第二行的第2列,即:字符'w',所以'2'加密后的结果就是'w'。

再来,IP地址中第四个字符为'.',他的字面值就是'.',所以我们定位到表格的最后一行也就是这行:. r s t u v w x y z a b  c  d  e  f,他在IP地址字符串中的位置是3(字符串的位置从0开始),所以我们直接取出表格最后一行的第3列,即:字符'u',所以'.'加密后的结果就是'u'。

以此类推,大家应该明白了吧,加密原理明白了,接下来的工作就是用C语言的代码实现出来了,应该不难吧。同理加密原理明白了,那么再写个解密的算法也不成问题,反过来就OK了。

好了,废话不多说了,直接奉上C语言版的加密算法,时间比较仓促,写的不好还请大家拍砖。

////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
/////////////////////////////////////////////////////////////////////////////////

代码如下:

  1. /////////////////////////////////////////////////////
  2. //
  3. // ----- EncryptForIPV4 加密函数参数说明 ----------
  4. //
  5. // srcString:要加密的IPv4原字符串
  6. // dstString:存放加密结果的字符串缓冲区
  7. // dstLength:dstString字符串缓冲区的长度
  8. //
  9. // 返回值为int类型,函数成功返回0,函数失败返回-1
  10. //
  11. /////////////////////////////////////////////////////
  12. int EncryptForIPV4(const char *srcString, char *dstString, unsigned int dstLength)
  13. {
  14.         char *enTableRow[11] = {0};
  15.         unsigned int idx = 0, srcLength = strlen(srcString);
  16.         if (dstLength < srcLength) return -1;

  17.         enTableRow[0] = "stuvwxyzabcdefg";
  18.         enTableRow[1] = "tuvwxyzabcdefgh";
  19.         enTableRow[2] = "uvwxyzabcdefghi";
  20.         enTableRow[3] = "vwxyzabcdefghij";
  21.         enTableRow[4] = "wxyzabcdefghijk";
  22.         enTableRow[5] = "mnopqrstuvwxyza";
  23.         enTableRow[6] = "nopqrstuvwxyzab";
  24.         enTableRow[7] = "opqrstuvwxyzabc";
  25.         enTableRow[8] = "pqrstuvwxyzabcd";
  26.         enTableRow[9] = "qrstuvwxyzabcde";
  27.         enTableRow[10] = "rstuvwxyzabcdef";

  28.         for (idx = 0; idx < srcLength; ++idx)
  29.         {
  30.                 switch(srcString[idx])
  31.                 {
  32.                 case '0':
  33.                 case '1':
  34.                 case '2':
  35.                 case '3':
  36.                 case '4':
  37.                 case '5':
  38.                 case '6':
  39.                 case '7':
  40.                 case '8':
  41.                 case '9':
  42.                         dstString[idx] = enTableRow[srcString[idx]-48][idx];
  43.                         break;
  44.                 case '.':
  45.                         dstString[idx] = enTableRow[10][idx];
  46.                         break;

  47.                 default:return -1;
  48.                 }
  49.         }

  50.         return 0;
  51. }
复制代码


关于解密的算法,还请大家先自己实现下,这样的小题很考验自己的能力,看看能不能写出来。
解密算法回复后可见!

游客,如果您要查看本帖隐藏内容请回复




上一篇:已知N个点(X,Y),以每个点为圆心,查找与它相离L的所有点为一组数据。
下一篇:各种压缩算法的比较,比如LZO,JPEG
75_avatar_middle
在线会员 发表于 2014-7-21 23:33:28 | 显示全部楼层
这种加密解密的代码网上公布过了
75_avatar_middle
在线会员 发表于 2014-7-21 23:34:33 | 显示全部楼层
大灰狼远控qqip加密上线就是用这种方式写的
43_avatar_middle
在线会员 发表于 2014-8-1 13:15:12 | 显示全部楼层
不错,支持一个。
43_avatar_middle
在线会员 发表于 2014-8-3 02:51:27 | 显示全部楼层
复制代码测试了一下
每次调用都在正常字符串后出现一串乱码
于是在return 0;返回之前
加了一句
dstString[srcLength] = '\0';
这样返回的字符串就正常了。

这是我写的解密代码,新手上路,还请老大多多指点。
  1. /////////////////////////////
  2. //功能:将解密过的IP地址转换成ipv4地址输出
  3. //
  4. //srcString:加密过的ip地址
  5. //desIPV4:解密后的ip地址
  6. //nLength: ip地址的长度
  7. //
  8. //返回值:返回0,解密成功,返回-1说明解密失败
  9. //bug:没有验证IP地址的正确性
  10. //改进:拆解desIPV4为4个正整数,并验证其值是否处于0~~255之间
  11. ////////////////////////////
  12. int StringToIPV4(const char *srcString,char *desIPV4,unsigned int nLength )
  13. {
  14.         int nIpLen = strlen(srcString);
  15.         if(nIpLen > nLength)
  16.         {
  17.                 cout<<"IP长度不正确"<<endl;
  18.                 return -1;
  19.         }
  20.         for(int index = 0;index < nIpLen;index++)
  21.                 for(int i = 0;i < 11;i++)
  22.                 {
  23.                         if(srcString[index] == enTableRow[i][index] && i == 10)
  24.                         {
  25.                                 desIPV4[index] = '.';
  26.                         }
  27.                         else if(srcString[index] == enTableRow[i][index])
  28.                         {
  29.                                 char c;
  30.                                 itoa(i,&c,10);
  31.                                 desIPV4[index] = c;
  32.                         }
  33.                 }

  34.         desIPV4[index] = '\0';

  35.         return 0;
  36. }
复制代码
51_avatar_middle
ico_lz  楼主| 发表于 2014-8-3 23:28:30 | 显示全部楼层
無意平凡 发表于 2014-8-3 02:51
复制代码测试了一下
每次调用都在正常字符串后出现一串乱码
于是在return 0;返回之前

不用客气,一起交流学习!C语言实现IP地址字符串加密
59_avatar_middle
在线会员 发表于 2014-8-8 22:39:12 | 显示全部楼层
我下载啊 我下载
30_avatar_middle
在线会员 发表于 2014-9-24 17:41:10 | 显示全部楼层
不明觉厉,先收藏下,读些资料再过来
64_avatar_middle
在线会员 发表于 2014-10-28 21:06:17 | 显示全部楼层
这个可以有!
50_avatar_middle
在线会员 发表于 2014-11-5 23:56:59 | 显示全部楼层
谢谢谢谢
96_avatar_middle
在线会员 发表于 2014-11-6 13:06:22 | 显示全部楼层
xiexie fenxiang```````
06_avatar_middle
在线会员 发表于 2014-11-17 13:26:35 | 显示全部楼层
解密算法回复后可见!
99_avatar_middle
online_vip 发表于 2015-6-16 21:18:45 | 显示全部楼层
现在要用啊啊啊
98_avatar_middle
在线会员 发表于 2015-6-20 15:08:51 | 显示全部楼层
语言实现IP地址字符串加密 [修改]
72_avatar_middle
在线会员 发表于 2015-6-20 15:15:08 | 显示全部楼层
看看什么情况
34_avatar_middle
online_vip 发表于 2015-6-20 15:49:00 | 显示全部楼层
还是先看看把,能不不行噢
69_avatar_middle
在线会员 发表于 2015-7-30 16:10:53 | 显示全部楼层

大灰狼远控qqip加密上线就是用这种方式写的
04_avatar_middle
在线会员 发表于 2015-12-13 00:11:12 | 显示全部楼层
灰狼远控qqip加密上线
68_avatar_middle
在线会员 发表于 2016-2-26 14:56:40 | 显示全部楼层
遇到高手了
46_avatar_middle
在线会员 发表于 2016-3-15 19:45:33 | 显示全部楼层
C语言实现IP地址字符串加密
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-1-22 00:53

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表