ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:274.58KB ,
资源ID:3409609      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3409609.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(短网址的研究与实现.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

短网址的研究与实现.docx

1、短网址的研究与实现上海电力学院信息安全综合课程设计题目:短网址的研究与实现 院系:计算机科学与技术学院专业年级: 2010级学生姓名:李正熹学号: 20103273 指导教师:魏为民2014年1月15日目录1 设计任务和要求2 设计原理2.1 短网址的简介2.2 短网址算法原理2.3 md5简介2.4 md5加密算法3 算法流程图3.1 md5加密算法流程图3.2 生成短网址流程图3.3 还原短网址流程图4 实现过程和结果5 实验小结6 附录源代码一、设计任务和要求短网址(Short URL)是一个潮流。目前已经有许多类似服务,借助短网址可以用简短的网址替代原来冗长的网址,让使用者可以更容易的

2、分享链接。现在大部分微博、手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场。编程实现与还原短网址,并比较主流微博短网址技术。二、设计原理1 短网址简介短网址服务,可能很多朋友都已经不再陌生,特别是在微博应用中十分普遍,比如,当我们在腾讯、新浪微博发微博时有时发很长的网址连接,但由于微博只限制140个字,所以微博就自动把您发的长网址给转换成短网址了。其实,个人认为短网址不一定真的好记,几位数字+字符的组合,甚至很难记忆。但无可否认在微博和手机短信提醒等限制字数的地方来使用短网址,的确是一个不错的方案。短网址通常使用“比较少字符的网址”+“/”+“代码”,打开短网址网页通常会直接跳转到你

3、要缩短的网址(常见),或者几秒广告后在跳转。比如向XX短网址可以自定义后缀,有些短网址还可以进行泛域名解析,十分方便大家使用。2 短网址算法原理1)将长网址md5生成32位签名串,分为4段,每段1个字节(即8位);2)对这四段循环处理, 取1个字节(8位),将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;3)这30位分成6段, 每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;4)总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;3 md5简介1991年,Rivest开发出技术上更为趋近成熟的md5算法。

4、它在MD4的基础上增加了安全-带子(safety-belts)的概念。虽然MD5比MD4复杂度大一些,但却更为安全。这个算法很明显的由四个和MD4设计有少许不同的步骤组成。在MD5算法中,信息-摘要的大小和填充的必要条件与MD4完全相同。Den boer和Bosselaers曾发现MD5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。4 md5加密算法对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个1

5、28位散列值。在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。总体流程如下图所示,表示第i个分组,每次的运算都由前一轮的128位结果值和第i块512bit值进

6、行运算。初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示,他们分别为:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。每一分组的算法流程如下:第一分组需要将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。从第二分组开始的变量为上一分组的运算结果。主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向左环移一个不定的数,并加上a、b、c或d中之一

7、。最后用该结果取代a、b、c或d中之一。以下是每次操作中用到的四个非线性函数(每轮一个)。F(X,Y,Z) =(X&Y)|(X)&Z)G(X,Y,Z) =(X&Z)|(Y&(Z)H(X,Y,Z) =XYZI(X,Y,Z)=Y(X|(Z)(&;是与,|是或,是非,是异或)这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。假设Mj表示消息的第j个子分组(从0到15),常数ti是4294967296*abs(sin(i))的整数部分,i取值从1到64,单位是弧度。(429496729

8、6等于2的32次方)FF(a,b,c,d,Mj,s,ti)表示 a = b + (a + F(b,c,d) + Mj + ti) s)GG(a,b,c,d,Mj,s,ti)表示 a = b + (a + G(b,c,d) + Mj + ti) s)HH(a,b,c,d,Mj,s,ti)表示 a = b + (a + H(b,c,d) + Mj + ti) s)(a,b,c,d,Mj,s,ti)表示 a = b + (a + I(b,c,d) + Mj + ti) s)这四轮(64步)是:第一轮FF(a,b,c,d,M0,7,0xd76aa478)FF(d,a,b,c,M1,12,0xe8c7b

9、756)FF(c,d,a,b,M2,17,0x242070db)FF(b,c,d,a,M3,22,0xc1bdceee)FF(a,b,c,d,M4,7,0xf57c0faf)FF(d,a,b,c,M5,12,0x4787c62a)FF(c,d,a,b,M6,17,0xa8304613)FF(b,c,d,a,M7,22,0xfd469501)FF(a,b,c,d,M8,7,0x698098d8)FF(d,a,b,c,M9,12,0x8b44f7af)FF(c,d,a,b,M10,17,0xffff5bb1)FF(b,c,d,a,M11,22,0x895cd7be)FF(a,b,c,d,M12,7

10、,0x6b901122)FF(d,a,b,c,M13,12,0xfd987193)FF(c,d,a,b,M14,17,0xa679438e)FF(b,c,d,a,M15,22,0x49b40821)第二轮GG(a,b,c,d,M1,5,0xf61e2562)GG(d,a,b,c,M6,9,0xc040b340)GG(c,d,a,b,M11,14,0x265e5a51)GG(b,c,d,a,M0,20,0xe9b6c7aa)GG(a,b,c,d,M5,5,0xd62f105d)GG(d,a,b,c,M10,9,0x02441453)GG(c,d,a,b,M15,14,0xd8a1e681)GG(

11、b,c,d,a,M4,20,0xe7d3fbc8)GG(a,b,c,d,M9,5,0x21e1cde6)GG(d,a,b,c,M14,9,0xc33707d6)GG(c,d,a,b,M3,14,0xf4d50d87)GG(b,c,d,a,M8,20,0x455a14ed)GG(a,b,c,d,M13,5,0xa9e3e905)GG(d,a,b,c,M2,9,0xfcefa3f8)GG(c,d,a,b,M7,14,0x676f02d9)GG(b,c,d,a,M12,20,0x8d2a4c8a)第三轮HH(a,b,c,d,M5,4,0xfffa3942)HH(d,a,b,c,M8,11,0x877

12、1f681)HH(c,d,a,b,M11,16,0x6d9d6122)HH(b,c,d,a,M14,23,0xfde5380c)HH(a,b,c,d,M1,4,0xa4beea44)HH(d,a,b,c,M4,11,0x4bdecfa9)HH(c,d,a,b,M7,16,0xf6bb4b60)HH(b,c,d,a,M10,23,0xbebfbc70)HH(a,b,c,d,M13,4,0x289b7ec6)HH(d,a,b,c,M0,11,0xeaa127fa)HH(c,d,a,b,M3,16,0xd4ef3085)HH(b,c,d,a,M6,23,0x04881d05)HH(a,b,c,d,M

13、9,4,0xd9d4d039)HH(d,a,b,c,M12,11,0xe6db99e5)HH(c,d,a,b,M15,16,0x1fa27cf8)HH(b,c,d,a,M2,23,0xc4ac5665)第四轮(a,b,c,d,M0,6,0xf4292244)(d,a,b,c,M7,10,0x432aff97)(c,d,a,b,M14,15,0xab9423a7)(b,c,d,a,M5,21,0xfc93a039)(a,b,c,d,M12,6,0x655b59c3)(d,a,b,c,M3,10,0x8f0ccc92)(c,d,a,b,M10,15,0xffeff47d)(b,c,d,a,M1,2

14、1,0x85845dd1)(a,b,c,d,M8,6,0x6fa87e4f)(d,a,b,c,M15,10,0xfe2ce6e0)(c,d,a,b,M6,15,0xa3014314)(b,c,d,a,M13,21,0x4e0811a1)(a,b,c,d,M4,6,0xf7537e82)(d,a,b,c,M11,10,0xbd3af235)(c,d,a,b,M2,15,0x2ad7d2bb)(b,c,d,a,M9,21,0xeb86d391)所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。三、算法流程图Md5加密生成短网

15、址 还原长网址四、过程及结果生成短网址还原短网址Txt中存储内容五、设计总结本次实验主要完成了短网址的生成与实现,在实现过程中,使用java或者php可能会比较简单实现,但是因为没有学过这类语言所以使用了C+的实现方法,在实验过程中,碰到了一些瓶颈,在string类型做运算时碰到了困难,在同学的帮助下转换成了int类型数组进行了与运算,将英文字母转化成对应的数字进行计算,使用md5的值将长网址成功简化成短网址,在简化过程中应该将对应的数据录入数据库,因为之前没有使用过C+连接数据库的经验,在网络和图书馆也没有找到相关资料,最后选择使用文件流将其输入TXT文档中,在将短网址还原到长网址的过程中,

16、检索对应的5位短网址,因为输入时是用空行排列,所以一旦找到对应短网址读取下一行就是对应的长网址了。对于本次实验,查了很多资料,学习了md5加密算法的流程,并且将实现的过程也了解了一下,对于短网址,已经是现在的主流,很多地方都能用到,之前从来没有想过这个短网址生成的方法,通过实验详细了解了也亲手实践,体会到了这一个转化的过程,对于整个完成的实验,总的来说还是有所不足,对于数据类型的把握和数据文件的处理方面还有所欠缺。六、源程序Md5.h#ifndef MD5_H#define MD5_H#include #include /* Type define */typedef unsigned cha

17、r byte;typedef unsigned long ulong;using std:string;using std:ifstream;/* MD5 declaration. */class MD5 public: MD5(); MD5(const void *input, size_t length); MD5(const string &str); MD5(ifstream &in); void update(const void *input, size_t length); void update(const string &str); void update(ifstream

18、&in); const byte* digest(); string toString(); void reset();private: void update(const byte *input, size_t length); void final(); void transform(const byte block64); void encode(const ulong *input, byte *output, size_t length); void decode(const byte *input, ulong *output, size_t length); string byt

19、esToHexString(const byte *input, size_t length); /* class uncopyable */ MD5(const MD5&); MD5& operator=(const MD5&);private: ulong _state4; /* state (ABCD) */ ulong _count2; /* number of bits, modulo 264 (low-order word first) */ byte _buffer64; /* input buffer */ byte _digest16; /* message digest *

20、/ bool _finished; /* calculate finished ? */public: static const byte PADDING64; /* padding for calculate */ static const char HEX16;#endif/*MD5_H*/Md5.cpp#include md5.husing namespace std;static const size_t BUFFER_SIZE=1024;/* Constants for MD5Transform routine. */#define S11 7#define S12 12#defin

21、e S13 17#define S14 22#define S21 5#define S22 9#define S23 14#define S24 20#define S31 4#define S32 11#define S33 16#define S34 23#define S41 6#define S42 10#define S43 15#define S44 21/* F, G, H and I are basic MD5 functions.*/#define F(x, y, z) (x) & (y) | (x) & (z)#define G(x, y, z) (x) & (z) |

22、(y) & (z)#define H(x, y, z) (x) (y) (z)#define I(x, y, z) (y) (x) | (z)/* ROTATE_LEFT rotates x left n bits.*/#define ROTATE_LEFT(x, n) (x) (32-(n)/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.Rotation is separate from addition to prevent recomputation.*/#define FF(a, b, c, d, x, s

23、, ac) (a) += F (b), (c), (d) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) += (b); #define GG(a, b, c, d, x, s, ac) (a) += G (b), (c), (d) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) += (b); #define HH(a, b, c, d, x, s, ac) (a) += H (b), (c), (d) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) += (b); #de

24、fine II(a, b, c, d, x, s, ac) (a) += I (b), (c), (d) + (x) + ac; (a) = ROTATE_LEFT (a), (s); (a) += (b); const byte MD5:PADDING64 = 0x80 ;const char MD5:HEX16 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f;/* Default construct. */MD5:MD5() reset();/* Construct a MD5 object with a input buffer. */M

25、D5:MD5(const void *input, size_t length) reset(); update(input, length);/* Construct a MD5 object with a string. */MD5:MD5(const string &str) reset(); update(str);/* Construct a MD5 object with a file. */MD5:MD5(ifstream &in) reset(); update(in);/* Return the message-digest */const byte* MD5:digest(

26、) if (!_finished) _finished = true; final(); return _digest;/* Reset the calculate state */void MD5:reset() _finished = false; /* reset number of bits. */ _count0 = _count1 = 0; /* Load magic initialization constants. */ _state0 = 0x67452301; _state1 = 0xefcdab89; _state2 = 0x98badcfe; _state3 = 0x1

27、0325476;/* Updating the context with a input buffer. */void MD5:update(const void *input, size_t length) update(const byte*)input, length);/* Updating the context with a string. */void MD5:update(const string &str) update(const byte*)str.c_str(), str.length();/* Updating the context with a file. */v

28、oid MD5:update(ifstream &in) if (!in) return; std:streamsize length; char bufferBUFFER_SIZE; while (!in.eof() in.read(buffer, BUFFER_SIZE); length = in.gcount(); if (length 0) update(buffer, length); in.close();/* MD5 block update operation. Continues an MD5 message-digestoperation, processing anoth

29、er message block, and updating thecontext.*/void MD5:update(const byte *input, size_t length) ulong i, index, partLen; _finished = false; /* Compute number of bytes mod 64 */ index = (ulong)(_count0 3) & 0x3f); /* update number of bits */ if(_count0 += (ulong)length 3) (ulong)length 29); partLen = 64 - index; /* transform as many times as possible. */ if(length = partLen) memcpy(&_bufferindex, input, partLen); transform(_buffer); for (i = partLen; i + 63 length; i += 64) transform(&inp

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1