密码学MD5实验报告

合集下载

实验三 MD5算法的设计与实现

实验三 MD5算法的设计与实现

实验三MD5算法的设计与实现MD5算法及C++实现一、理论部分:1、预备知识1.1什么是数据校验通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值。

接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据是完整的。

1.2最简单的检验实现方法:最简单的校验就是把原始数据和待比较数据直接进行比较,看是否完全一样这种方法是最安全最准确的。

同时也是效率最低的。

适用范围:简单的数据量极小的通讯。

应用例子:龙珠cpu在线调试工具bbug.exe。

它和龙珠cpu间通讯时,bbug发送一个字节cpu返回收到的字节,bbug确认是刚才发送字节后才继续发送下一个字节的。

1.3奇偶校验Parity Check实现方法:在数据存储和传输中,字节中额外增加一个比特位,用来检验错误。

校验位可以通过数据位异或计算出来。

应用例子:单片机串口通讯有一模式就是8位数据通讯,另加第9位用于放校验值。

1.4 bcc异或校验法(block check character)实现方法:很多基于串口的通讯都用这种既简单又相当准确的方法。

它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把她附在通讯数据的最后一起发送出去。

接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。

校验值计算的代码类似于:unsigned uCRC=0;//校验初始值for(int i=0;i<DataLenth;i++) uCRC^=Data[i];适用范围:适用于大多数要求不高的数据通讯。

应用例子:ic卡接口通讯、很多单片机系统的串口通讯都使用。

1.5 crc循环冗余校验(Cyclic Redundancy Check)实现方法:这是利用除法及余数的原理来进行错误检测的.将接收到的码组进行除法运算,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错。

md5实验报告

md5实验报告

md5实验报告
# MD5实验报告
## 简介
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,用于对任意
长度的信息产生一个128位的哈希值。

它由美国密码学家罗纳德·李维斯特(Ronald Rivest)设计,于1992年公开。

MD5算法的设计目标是在计算速度
上尽量保持优秀的性能,同时也要尽量保证安全性。

## 实验目的
本实验旨在通过对MD5算法的实验,了解其在信息安全领域的应用和特点。

## 实验过程
1. 选择一段文本作为输入数据。

2. 使用MD5算法对输入数据进行哈希运算,得到对应的128位哈希值。

3. 对比不同输入数据产生的哈希值,观察MD5算法的碰撞概率。

## 实验结果
经过实验,我们发现MD5算法在对不同输入数据进行哈希运算时,能够产生唯一的128位哈希值。

虽然MD5算法在碰撞概率上存在一定的问题,但在实际
应用中,仍然具有一定的安全性和可靠性。

## 结论
MD5算法作为一种广泛使用的哈希函数,在信息安全领域有着重要的应用价值。

然而,随着计算能力的提升和攻击技术的发展,MD5算法的安全性逐渐受到挑战。

因此,在实际应用中,我们需要谨慎选择合适的哈希算法,并结合其他安
全措施,以确保信息的安全性和完整性。

MD5实验报告(word文档良心出品)

MD5实验报告(word文档良心出品)

一、MD5算法描述MD5算法是计算机安全领域广泛使用的一种散列算法之一,用以提供消息的完整性保护。

本次实验中,对于输入的任意长度的一段数据,输出唯一固定的128位MD5散列值。

MD噂法分为以下步骤:1 、初始化(填充)首先对于任意长度的消息,将其按照512 位进行分组,为保证每个分组都是512 位,需要对消息进行填充。

填充方法是先在消息末尾填一个1,再在后面填若干个0,使其长度I恰好满足I=448(mod512),然后在其后附加上64 位的(填充前)消息长度, 确保不同的消息在填充后不相同消息在填充后不相同。

其次将每个分组512 位的数据划分为16个32 位的子分组,在实现过程中,将其表示为16 个32 位整数进行运算。

初始化四个32 位链接变量为:A=0x67452301B=0xefcdab89C=0x98badcfeD=0x103254762、单步操作与主循环MD5共分为4轮,每轮进行16步单步操作,MD5的单步操作如下其中,g k (k=0,123)是每次运算中用到的非线性函数(每轮一个),用C 语言定义如下^define gO(b> c,. d) ((b&c) (、b 赴d))ftdefine gl (b, c> d) ((b&d) )ffdef ine g2(b, c f d) (b e d) tfdef ine g3(b, c f d) (c (b d))数据块X[ d(i)]来自于初始化中分好的16个32位数据分组,根据循环 步数按以下置换函数选取(i 表示循环的第i 步)T i 是一些随机数序列,T i 的值如下(按顺序选取)Pdefine rO(i)#define rl (i)Sdefine r2(i)Sdefine r3 (i)(i%16) <(l+5*i)%16) ((5+3*i)%16) <(7*i)%16)unsigned int T .64.=:0xd76aa478;0xe8c7b756?Ox242070dL Oxclbdce-ee,0xf57c0faf,0x4787c62a T0xa8304613:0xfd469501? 0x698098d8,0x8b44f7af7OxffffSbbl. 0x895cd7te7 0x6b90U22f0xfd987193,0x3679438^ 0x49b40821, Ch<f61u2562, OxcO4Ob34O, 0x265e5a51?Oxe^GcTaa, 0xd62fl05d. 0x02141453, 0xd8ale68L?0xe7d3fbc8?Ox21.elcde6, 0xc337O7d6T0xf4d50d87r0x455al4ed f0^a9e3e905,OxfcefaofS, 0x676f02d9. 0x8d2a4c8a, 0xfffa3942,0x8771f681, 0x6旳d6122, 0xfM538(k, 0xa4beea44:0x4bdecfa9?0xf6bb4b60?Oxbebfbc7O? 0x289b7ec6:0xeaaI27£a T0s64ef3085:0x04851 dO5? 0xd9d4d039, 0xe6db99e5?DxlfaSycfS, 0xc4ac566570xf4292244?0x432aff97I0xab9423a7J0xfc93a039, 0x655b59c3,0x8f0ccc92, Oxffeff47d. 0x85845ddl? 0x6faS7e4f, 0xfe2ce6e0,0xa3014314?Ox4eO811al, Oxf7537eS2. 0xbd3af2o570x2ad7d2bb.0xeb86d391?};vv<S i表示循环左移S i位,S i的数值如下(按顺序选取)unsigned int S[64]={7,12417, 22, 7,12f17f 22, 7, 12,17, 22t 1, 12,17t 22,5, 9,14, 20, 5, 9, 14, 20, 5, 9, 14,20, 5, 9,14, 20,4, 11,16, 23, 4,11,16, 23, 4,11,16, 23* 4,11, 16, 23,6,10,15, 21, 6,10,15, 21, 6F10,15, 21, 6, 10, 15, 21};因此,MD5主要的一个单步操作可以表示为a =b ((a f(b,c,d) T[i] X[J(i)])尺S[i])每轮16步结束后的4个32位数作为下一轮的输入继续循环束后的输入再加上初始值即得到最终结果128位的散列值' 循环如下图四轮结64步主A| B| C| Bjn 彳第1轮16步便用卧P Q; 电 B ] cl 叫+1第2轮"步便用驻Pl |A| Bl C| D| "■►f 第3轮16步便用知pt1 ~Al Bl Cl Dl ~程序验证为了验证程序的正确性,我们通过查找 Wikipedia 上使用的3个 测试向量来进行测试,测试向量如下:ND5(*The quick bxown fox jumps over the lazy dog")=9e 107d9d372bb6326b d8Id3542a419d6KD5 (*The quick brown fos jumps over the lazy dog- ■*)= edd909c290dOfb IcaOGSff addf 2 2cbdOMD5(^)=d41J8cd98f0Ob204e980O99SecfS427e运行程序,得到的结果如下:X * - ■ <■>第4轮"步使用g 尹P3v ! I ! I 1 + 模屮加C ^D 工cyniF可以看到,实验结果与测试向量相同,验证了程序的正确性。

MD5算法实验报告

MD5算法实验报告

MD5算法实验报告实验报告:MD5算法的原理与应用一、实验目的本实验旨在通过研究MD5(Message-Digest Algorithm 5)算法的原理和应用,了解其工作原理和实现过程,并掌握其具体应用技巧。

二、实验内容1.了解MD5算法的基本原理和特点;2.分析MD5算法的具体实现过程;3.实现一个简单的MD5加密程序,并进行测试;4.掌握MD5算法的应用技巧。

三、实验原理1. 输入任意长度的数据,输出固定长度的Hash值,通常为128位;2. 安全性较高,Hash值的变化能较好地反映原始数据的变化;3. 不可逆性:无法通过Hash值反推出原始数据;4. Hash值相同的概率很低,冲突概率较小。

1.数据填充:对输入数据进行填充,使其长度满足一定要求;2.划分数据:将填充后的数据划分为多个512位的数据块;3.初始化变量:设置四个32位的变量,作为初始值;4.处理数据块:对每个数据块进行处理,分为四轮,每轮包括四个步骤,即置换、模运算、加法和循环左移操作。

5. 输出结果:将四个32位变量连接起来,即得到最终的128位Hash值。

四、实验过程1.学习MD5算法的原理和实现细节;2. 使用Python编程语言实现一个简单的MD5加密程序,并进行测试。

实验代码如下:```import hashlibdef md5_encrypt(source):md5 = hashlib.md5md5.update(source.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':source_str = input("请输入要加密的字符串:")encrypted_str = md5_encrypt(source_str)print("加密后的字符串为:", encrypted_str)```五、实验结果与分析通过上述实验代码,可以输入一个字符串,程序将会对该字符串进行MD5加密,并将加密结果输出。

《信息安全》实验报告3MD5的计算和破解

《信息安全》实验报告3MD5的计算和破解

《信息安全》实验报告3MD5的计算和破解1.引言信息安全是一个重要的领域,加密算法是其中的核心技术之一、MD5(Message Digest Algorithm 5)是一种常用的哈希算法,广泛应用于文件校验、数据完整性验证等等领域。

本实验旨在通过计算和破解MD5,深入了解MD5的工作原理和安全性。

2.实验目的(1)了解MD5算法的基本原理;(2)掌握MD5算法的计算过程;(3)通过破解MD5,了解其安全性问题。

3.实验过程3.1MD5算法的基本原理MD5算法通过对输入的字符串进行分组,然后对每个分组进行一系列的位运算和逻辑运算,最终生成一个128位(16字节)的哈希值。

MD5算法的基本原理如下:(1)填充:在输入字符串的末尾填充一些字节,使得输入字符串的长度能被64整除。

(2)初始化:将16进制的常数赋给4个32位寄存器A、B、C、D。

(3)分组:将填充后的输入字符串分为若干个512位的分组。

(4)处理:对每个分组进行一系列的位运算和逻辑运算。

(5)生成哈希值:将处理后的结果按一定顺序连接起来,得到一个128位的哈希值。

3.2MD5的计算过程通过Python编程语言实现MD5算法的计算过程如下:(1)初始化四个32位寄存器A、B、C、D,并赋初值。

(2)将待计算的字符串分组,每个分组512位。

(3)对每个分组进行一系列的位运算和逻辑运算,生成一个128位的哈希值。

(4)将生成的哈希值转换为16进制字符串。

3.3MD5的破解MD5算法虽然被广泛应用,但是也存在一定的安全性问题。

MD5哈希值是固定长度的,而输入字符串的长度可以是任意长度的,这就导致了哈希碰撞(hash collision)的概率增加。

哈希碰撞是指不同的输入字符串可以生成相同的哈希值,从而破解MD5密码。

破解MD5密码一般采用暴力破解和字典攻击两种方式。

4.实验结果通过编程计算MD5并破解一个MD5密码,结果如下:5.实验总结通过本次实验,我们了解了MD5算法的基本原理和计算过程。

MD5实验报告范文

MD5实验报告范文

MD5实验报告范文实验报告:MD5算法的原理、实验过程及结果分析1.实验目的MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,主要用于对消息进行完整性校验和数字签名等应用。

本实验旨在探究MD5算法的原理及实现过程,并通过实验验证其正确性和有效性。

2.实验原理MD5算法主要包括以下步骤:(1)填充消息首先,将消息进行填充,使其长度能够被512位整除。

填充方式为在消息末尾添加一个'1',然后添加若干个'0',以确保消息末尾有64位的原始消息长度。

(2)初始化缓冲区(3)消息分组将填充后的消息按512位分组,每组包含16个32位的子分组。

(4)循环压缩函数对每个分组进行四轮循环操作,共64轮。

每一轮包含四个步骤:F 函数、G函数、H函数和I函数。

每个函数分别对A、B、C、D进行操作,并根据当前轮数选择不同的方式对数据进行置换和变换。

(5)累加结果每轮循环后,计算出的A、B、C、D将与缓冲区中的原始值进行累加。

(6)输出结果经过64轮循环后,得到的缓冲区即为MD5的输出结果。

3.实验过程(1)理论分析根据MD5算法的原理,我们可以分析MD5的输入为任意长度的消息,输出为固定长度(128位)的哈希值。

MD5算法具有较高的计算效率和较好的抗碰撞性能。

(2)实验步骤a.编写MD5算法的编程代码,包括填充消息、初始化缓冲区、消息分组、循环压缩函数等步骤。

b.准备不同长度的测试消息,包括短消息和长消息。

c.分别对不同长度的消息进行哈希计算,并记录计算时间。

d.比较计算结果与预设结果是否一致。

4.实验结果分析经过实验,我们得到了如下结果:(1)对于短消息(长度小于512位),MD5能够在较短时间内完成计算,且计算结果与预设结果一致。

(2)对于长消息(长度大于512位),MD5的计算时间随着消息长度的增加而增加,但计算结果始终保持一致和正确。

5.结论与总结MD5算法是一种常用的哈希算法,具有较高计算效率和较好的抗碰撞性能。

《信息安全》实验报告3MD5的计算和破解

《信息安全》实验报告3MD5的计算和破解

《信息安全》实验报告3MD5的计算和破解实验目标:1.了解MD5算法的基本原理。

2.掌握MD5算法的计算和应用。

3.理解MD5算法的弱点,并尝试破解MD5哈希值。

一、实验原理:MD5(Message Digest Algorithm 5)是一种常用的消息摘要算法,用来确保数据的完整性和一致性,广泛应用于信息安全领域中。

MD5将任意长度的输入数据进行计算,得到一个128位的哈希值。

实验步骤:1.编写MD5的计算代码。

2.编写MD5的破解代码。

3.运行代码,计算给定字符串的MD5哈希值。

4.破解给定MD5哈希值。

二、实验过程:1.MD5的计算代码编写:MD5算法的计算过程包括四个主要的步骤:填充位、增加长度、初始化变量和循环计算。

a.填充位:将待计算的消息填充至512位的倍数,填充位为1后面加零。

b.增加长度:在填充消息后增加一个64位的二进制数,表示原始消息的长度。

c.初始化变量:设定固定的四个变量,用于循环计算。

d.循环计算:将填充后的消息分为512位的块进行循环计算,计算结果与前一块的结果进行累加。

2.MD5的破解代码编写:MD5的破解目标是通过已知的MD5哈希值,找到对应的原始数据。

一般的方法是尝试不同的输入数据,计算MD5哈希值,然后与已知的哈希值进行比较。

a.枚举法:通过不断尝试不同的输入数据,计算MD5哈希值与给定哈希值进行比较,直到找到对应的原始数据。

b.字典法:通过预先准备好的字典文件,将字典中的每个词进行MD5哈希计算,然后与给定哈希值进行比较,查找对应的原始数据。

3.实验结果展示:4.MD5的破解:a.枚举法:从'a'到'z'的26个字符中依次尝试,计算MD5哈希值并与给定值进行比较,直到找到对应的原始数据。

b.字典法:根据常见密码字典构建一个文本文件,逐行读取文件中的词进行MD5哈希计算并与给定值进行比较,直到找到对应的原始数据。

5.实验总结:实验中,我们通过计算MD5哈希值和尝试破解,深入了解了MD5算法的原理和应用。

md5算法实验总结

md5算法实验总结

MD5(Message Digest Algorithm 5)是一种常见的哈希函数,用于产生数字指纹(digest)以及对数据进行完整性验证。

以下是对MD5算法实验的总结:
1. MD5算法的原理:
- MD5算法将任意长度的输入数据转换为128位的输出,通常表示为32个十六进制数字。

- MD5算法的核心是对输入数据进行分组、填充、循环处理和合并等步骤,最终生成128位的摘要。

2. 实验步骤:
- 选择一个字符串或文件作为输入数据。

- 使用MD5算法对输入数据进行处理,生成对应的128位摘要。

- 可以使用现成的MD5算法库或工具,也可以自行编写MD5算法的实现。

3. 实验结果:
- 实验结果将会得到一个128位的十六进制数字,即为MD5摘要。

- 不同的输入数据将会生成不同的MD5摘要,即使输入数据只有微小的变化。

4. 应用场景:
- MD5算法常用于验证数据的完整性,比如下载文件后对文件进行MD5校验,以确保文件未被篡改。

- 在密码存储中,MD5算法曾经被广泛使用,但由于其存在碰撞(collision)风险和加密性能问题,现在不再推荐将MD5用于密码存储。

总的来说,MD5算法是一种常见的哈希算法,用于生成数据的数字指纹。

然而,由于其已知的安全性问题,现在已经不再被推荐用于安全敏感的场景。

在实际应用中,
可以考虑使用更安全的哈希算法,比如SHA-256等。

Hash算法MD5 实验报告

Hash算法MD5 实验报告

哈尔滨工程大学实验报告实验名称:Hash 算法MD5班级:学号:姓名:实验时间:2014年6月成绩:指导教师:实验室名称:哈尔滨工程大学实验室与资产管理处制一、实验名称Hash算法MD5二、实验目的通过实际编程了解MD5 算法的加密和解密过程,加深对Hash 算法的认识。

三、实验环境(实验所使用的器件、仪器设备名称及规格)运行Windows 或Linux 操作系统的PC 机,具有gcc(Linux)、VC(Windows)等C 语言编译环境。

四、任务及其要求(1)利用自己所编的MD5 程序对一个文件进行处理,计算它的Hash 值,提交程序代程和运算结果。

(2)微软的系统软件都有MD5 验证,尝试查找软件的MD5 值。

同时,在Windows 操作系统中,通过开始→运行→sigverif 命令,利用数字签名查找验证非Windows 的系统软件。

__五、实验设计(包括原理图、真值表、分析及简化过程、卡诺图、源代码等)在MD5 算法中,首先需要对信息进行填充,使其字节长度与448 模512 同余,即信息的字节长度扩展至n*512+448,n 为一个正整数。

填充的方法如下:在信息的后面填充第一位为1,其余各位均为0,直到满足上面的条件时才停止用0 对信息填充。

然后,再在这个结果后面附加一个以64 位二进制表示的填充前信息长度。

经过这两步的处理,现在的信息字节长度为n*512+448= (n+1)*512,即长度恰好是512 的整数倍,这样做的目的是为满足后面处理中后面处理中对信息长度的要求。

n 个分组中第q 个分组表示为Yq。

MD5 中有A、B、C、D,4 个32 位被称作链接变量的整数参数,它们的初始值分别为:A=01234567B=89abcdef,C=fedcba98,D=当设置好这个4 个链接变量后,就开始进入算法的4 轮循环运算。

循环的次数是信息中512 位信息分组数目。

首先将上面4 个链接变量复制到另外4 个变量中A到AA,B 到BB,C 到CC,D 到DD,以备后面进行处理。

【免费下载】密码学实验(MD5实验)

【免费下载】密码学实验(MD5实验)
密码学实验
——计算文件 MD5 值
姓名: 班级: 学号: 教师: 助教:
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

密码学实验-实验5 Hash算法

密码学实验-实验5 Hash算法

实验报告一、实验目的1.MD5算法(1)理解Hash函数的计算原理和特点(2)理解MD5算法原理2.SHA1算法(1)理解SHA1函数的计算原理和特点(2)理解SHA1算法原理二、实验内容与设计思想①MD5算法MD5哈希算法流程:1.对于任意长度的明文,MD5首先对其进行分组,使得每一组的长度为512位,然后对这些明文分组反复重复处理。

对于每个明文分组的摘要生成过程如下:(1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。

(2)申请4个32位的链接变量,记为A、B、C、D。

(3)子明文分组与链接变量进行第1轮运算。

(4)子明文分组与链接变量进行第2轮运算。

(5)子明文分组与链接变量进行第3轮运算。

(6)子明文分组与链接变量进行第4轮运算。

(7)链接变量与初始链接变量进行求和运算。

(8)链接变量作为下一个明文分组的输入重复进行以上操作。

(9)最后,4个链接变量里面的数据就是MD5摘要。

2.MD5分组过程对于任意长度的明文,MD5可以产生128位的摘要。

任意长度的明文首先需要添加位数,使明文总长度为448(mod512)位。

在明文后添加位的方法是第一个添加位是l,其余都是0。

然后将真正明文的长度(没有添加位以前的明文长度)以64位表示,附加于前面已添加过位的明文后,此时的明文长度正好是512位的倍数。

当明文长度大于2的64次方时,仅仅使用低64位比特填充,附加到最后一个分组的末尾。

经过添加处理的明文,其长度正好为512位的整数倍,然后按512位的长度进行分组(block),可以划分成L份明文分组,我们用Y0,Y1,……,YL-1表示这些明文分组。

对于每一个明文分组,都要重复反复的处理,如图所示。

3.MD5子明文分组和链接变量对于512位的明文分组,MD5将其再分成16份子明文分组(sub-block),每份子明文分组为32位,我们使用M[k](k= 0, 1,……15)来表示这16份子明文分组。

实验二—MD5加密算法

实验二—MD5加密算法

1、MD5Util.java---MD5加密算法package com.it.xx;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Util {public String getMD5(byte[] source) {String s = null;// 用来将字节转换成16进制表示的字符char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(source);// MD5的计算结果是一个128位的长整数,用字节表示为16个字节byte[] tmp = md.digest();// 每个字节用16进制表示的话,使用2个字符(高4位一个,低4位一个),所以表示成16进制需要32个字符char[] str = new char[16 * 2];int k = 0;// 转换结果中对应的字符位置for (int i = 0; i < 16; i++) {// 对MD5的每一个字节转换成16进制字符byte byte0 = tmp[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];// 对字节高4位进行16进制转换str[k++] = hexDigits[byte0 & 0xf]; // 对字节低4位进行16进制转换}s = new String(str);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return s;}}2、MyConstant.java---定义常量package com.it.xx;public class MyConstants {public final static String JDBC_DRIVER = "com.mysql.jdbc.Driver";public final static String JDBC_URL = "jdbc:mysql://localhost:3306/md5user";public final static String JDBC_USERNAME = "root";public final static String JDBC_PASSWORD = "1234";}3、SqlHelper.java---数据库工具类package com.it.xx;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class SqlHelper {private static SqlHelper sq;private static Connection conn;private PreparedStatement ps;private ResultSet rs;public static SqlHelper getDBUtil(){if (sq == null){sq = new SqlHelper();}return sq;}public boolean executeUpdate(String sql, Object[] obj) {int result =0;if (getConn() == null){return false;}try{ps = conn.prepareStatement(sql);for (int i = 0; i < obj.length; i++){ps.setObject(i + 1, obj[i]);}result = ps.executeUpdate();close();}catch (SQLException e){e.printStackTrace();}if(result!=0){return true;}return false;}public ResultSet executeQuery(String sql, Object[] obj){if (getConn() == null)//首先判断数据库是否连接成功{return null;}try {ps = conn.prepareStatement(sql);if(obj!=null)//判断传入的参数是否为空{for (int i = 0; i < obj.length; i++) {ps.setObject(i + 1, obj[i]);}}rs = ps.executeQuery();} catch (SQLException e) {e.printStackTrace();}return rs;}public static Connection getConn(){try{if (conn == null || conn.isClosed()){Class.forName(MyConstants.JDBC_DRIVER);conn = DriverManager.getConnection(MyConstants.JDBC_URL, MyConstants.JDBC_USERNAME,MyConstants.JDBC_PASSWORD);}System.out.println("数据库连接成功!");}catch (ClassNotFoundException e){System.out.println("无法加载JDBC驱动!");e.printStackTrace();}catch (SQLException e){e.printStackTrace();}return conn;}public void close(){try{if (rs != null){rs.close();}if (ps != null){ps.close();}if (conn != null){conn.close();}}catch (SQLException e){e.printStackTrace();}}}4、UserLogin.java---用户登录package com.it.xx;import java.awt.Dimension;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.ResultSet;import java.sql.SQLException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;public class UserLogin implements ActionListener { // 声明屏幕的宽高,程序窗口的宽高public int windowWidth;public int windowHeight;public int screenSizeWidth;public int screenSizeHeight;public JPasswordField jt4;public JPasswordField jt3;public JPasswordField jt2;public JTextField jt1;public JButton jb1, jb2;public JLabel jl4;public JLabel jl3;public JLabel jl2;public JLabel jl1;public String username, userpassword, sql;public ResultSet rs;public SqlHelper sqlHelper;private JFrame mainf;private String password;private String md5_username;private String md5_password;public static void main(String[] agrs) {new UserLogin();}public UserLogin() { // 构造函数,initView();}public void initView() {mainf = new JFrame();// 给屏幕的宽度高度,程序窗口的宽度高度赋值Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();screenSizeWidth = (int) dimension.getWidth();screenSizeHeight = (int) dimension.getHeight();windowWidth = mainf.getWidth();windowHeight = mainf.getHeight();mainf.setLocation(screenSizeWidth / 2 - windowWidth / 2, screenSizeHeight / 2 - windowHeight / 2);// 设置程序窗口的位置为屏幕的正中央jl1 = new JLabel("用户名:");jl1.setBounds(100, 20, 150, 30);jl2 = new JLabel("密码:");jl2.setBounds(100, 60, 150, 30);jb1 = new JButton("登录");jb1.setBounds(100, 100, 80, 30);jb1.addActionListener(this);jb2 = new JButton("注册");jb2.setBounds(200, 100, 80, 30);jb2.addActionListener(this);jt1 = new JTextField();// 用户号码登录输入框jt1.setBounds(165, 20, 150, 30);jt2 = new JPasswordField();// 密码输入框jt2.setBounds(165, 60, 150, 30);mainf.setTitle("用户登录");mainf.setLayout(null); // 设置布局方式为绝对定位mainf.setBounds(0, 0, 400, 200);mainf.setLocationRelativeTo(null);mainf.setVisible(true); // 使程序可见mainf.add(jb1);mainf.add(jb2);mainf.add(jl1);mainf.add(jl2);mainf.add(jt1);mainf.add(jt2);}public void login() {username = jt1.getText().toString(); // 用户名password = jt2.getText().toString(); // 密码if (username.isEmpty() || password.isEmpty()) {JOptionPane.showMessageDialog(null, "用户名或密码不能为空!", "提示消息", JOptionPane.WARNING_MESSAGE);return;}MD5Util md5Util = new MD5Util();md5_username = md5Util.getMD5(username.getBytes());md5_password = md5Util.getMD5(password.getBytes());try {sqlHelper = new SqlHelper();sql = "select * from user where UserName=?";String paras[] = { md5_username };rs = sqlHelper.executeQuery(sql, paras);int i=0;while (rs.next()) {i++;userpassword = rs.getString(2);}if (i==0) {JOptionPane.showMessageDialog(null, "非法用户!请先注册", "提示消息", JOptionPane.ERROR_MESSAGE);return;}} catch (SQLException e1) {e1.printStackTrace();}if (md5_password.equals(userpassword)) {JOptionPane.showMessageDialog(null, "合法用户\n登录成功!\n用户名:" + username + "\n密码:" + password + "\nMD5加密后:\n用户名:"+ md5_username + "\n密码:" + md5_password, "提示消息", RMATION_MESSAGE);} else {JOptionPane.showMessageDialog(null, "登录失败!用户名或密码错误", "错误消息", JOptionPane.ERROR_MESSAGE);}}@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource() == jb1) {login();}if (e.getSource() == jb2) {new UserRegister();}}}5、UserRegister.java---用户注册package com.it.xx;import java.awt.Dimension;import java.awt.HeadlessException;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.ResultSet;import java.sql.SQLException;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPasswordField;import javax.swing.JTextField;public class UserRegister implements ActionListener{//声明屏幕的宽高,程序窗口的宽高public int windowWidth;public int windowHeight;public int screenSizeWidth;public int screenSizeHeight;public JPasswordField jt4;public JPasswordField jt3;public JPasswordField jt2;public JTextField jt1;public JButton jb1,jb2;public JLabel jl4;public JLabel jl3;public JLabel jl2;public JLabel jl1;public String username,userpassword,sql;public ResultSet rs;public SqlHelper sqlHelper;private JFrame mainf;private String password;private String acknewpassword;private String md5_username;private String md5_password;public UserRegister() //构造函数{initView();}public void initView(){mainf=new JFrame();//给屏幕的宽度高度,程序窗口的宽度高度赋值Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();screenSizeWidth = (int) dimension.getWidth();screenSizeHeight = (int) dimension.getHeight();windowWidth = mainf.getWidth();windowHeight = mainf.getHeight();mainf.setLocation(screenSizeWidth / 2 - windowWidth / 2,screenSizeHeight / 2 - windowHeight / 2);//设置程序窗口的位置为屏幕的正中央jl1 = new JLabel("用户名:");jl1.setBounds(100, 20, 150, 30);jl2 = new JLabel("密码:");jl2.setBounds(100, 60, 150, 30);jl3 = new JLabel("确认密码:");jl3.setBounds(100, 100, 150, 30);jb1 = new JButton("确定");jb1.setBounds(100, 150, 80, 30);jb1.addActionListener(this);jb2=new JButton("取消");jb2.setBounds(200,150,80,30);jb2.addActionListener(this);jt1 = new JTextField();// 用户号码登录输入框jt1.setBounds(165, 20, 150, 30);jt2 = new JPasswordField(); // 密码输入框jt2.setBounds(165,60, 150, 30);jt3 = new JPasswordField(); //确认密码输入框jt3.setBounds(165, 100, 150, 30);mainf.setTitle("用户注册");mainf.setLayout(null); // 设置布局方式为绝对定位mainf.setBounds(0, 0, 400, 250);mainf.setLocationRelativeTo(null);mainf.setVisible(true); //使程序可见mainf.add(jb1);mainf.add(jb2);mainf.add(jl1);mainf.add(jl2);mainf.add(jl3);mainf.add(jt1);mainf.add(jt2);mainf.add(jt3);}public void register() {username = jt1.getText().toString(); // 用户名password = jt2.getText().toString(); // 密码acknewpassword = jt3.getText().toString(); // 确认新密码if (username.isEmpty() || password.isEmpty() || acknewpassword.isEmpty()) { JOptionPane.showMessageDialog(null, "请填写完整注册信息!", "提示消息", JOptionPane.WARNING_MESSAGE);return;}MD5Util md5Util = new MD5Util();md5_username = md5Util.getMD5(username.getBytes());md5_password = md5Util.getMD5(password.getBytes());sqlHelper = new SqlHelper();sql = "select * from user where UserName=?";String paras[] = { md5_username };rs = sqlHelper.executeQuery(sql, paras);try {if (rs.next()) {JOptionPane.showMessageDialog(null, "注册失败!该用户名已存在!", "提示消息", JOptionPane.ERROR_MESSAGE);return;}} catch (Exception e) {e.printStackTrace();}sql = "insert into user values(?,?)";String para[] = { md5_username, md5_password };boolean flag = sqlHelper.executeUpdate(sql, para);if (flag) {JOptionPane.showMessageDialog(null, "注册成功!\n用户名:" + username + "\n 密码:" + password + "\nMD5加密后:\n用户名:"+ md5_username + "\n密码:" + md5_password, "提示消息", RMATION_MESSAGE);return;}}@Overridepublic void actionPerformed(ActionEvent e){if(e.getSource()==jb1){register();}if(e.getSource()==jb2){mainf.dispose();}}}。

密码实验md5

密码实验md5

实验一MD5哈希算法报告1 实验目的(1)理解MD5算法的基本思想。

(2)实现MD5算法。

(3)通过该算法加深对HASH 算法的理解。

2 实验内容基于Visual C++,编程实现各类消息的摘要值。

要求:输入任意字符串,以16进制形式输出其MD5值。

3 实验原理MD5是由国际著名密码学家、“图灵奖”获得者兼公钥加密算法RSA 的创始人、麻省理工大学的RonaldRivest 教授于1991年设计的。

它与SHA 共同构成两大哈希算法,广泛应用于金融、证券等电子商务领域。

MD5输入是任意长的消息,分组长度为512比特,输出128比特。

MD5算法框图如下:由图中可看出,MD5是四轮运算,每轮又要进行16步迭代运算,4轮共需64步完成。

其中T[1,…,64]为64个常数,参与不同轮的计算。

X[k]=M[q ×16+k],即消息第q 个分组中的第k 个32比特字(k=1,…,16)。

F 、G 、H 和I 为各轮逻辑函数,定义如下:4轮处理过程中,每轮以不同的次序使用16个字。

在第1轮以字的初始次序使用,第2轮到第4轮分别对字的次序i 做置换后得到一个新次序,然后以新次序使用16个字。

3个置换分别为ρ2(i)=(1+5i) mod 16,ρ3(i)=(5+3i) mod 16和ρ4(i)=7i mod 16。

每轮的每步变换为a=b+CLSs(a+g(b,c,d)+X[k]+T[i),其中g为逻辑函数,CLSs为循环左移s位,X[k]为分组的第k个32bit字,T[i]为常数表中第i个32-bit字,+为模232加法。

特别当g=F,该变换记为FF(a, b, c, d, xj, s, ti)。

1轮中的16步变化按照一定的次序进行,4轮进行64步。

每轮输出、中间结果和最终Hash值存储在缓冲区a、b、c和d。

缓冲区初始化以十六进制表示为a=01234567,b=89ABCDEF,c=FEDCBA98,d=76543210。

实验1 加密软件

实验1 加密软件
实验一
数字摘要、消息摘要生成
实验目的
MD5加密算法原理
实验环境 实验内容
实验步骤
结果分析 实验报告要求
一、实验目的
掌握MD5的基本原理; 掌握MD5 数字摘要的应用。
二、MD5加密算法原理
MD5的全称是Message-Digest Algorithm 5(信息-摘要算法), 在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发 展而来。 它的作用是让大容量信息在用数字签名软件签署私人密匙前 被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换 成一定长的大整数)。不管是MD2、MD4还是MD5,它们都需要 获得一个随机长度的信息并产生一个128位的信息摘要。虽然这些 算法的结构或多或少有些相似,但MD2的设计与MD4和MD5完全 不同,那是因为MD2是为8位机器做过设计优化的,而MD4和 MD5却是面向32位的电脑。 MD5的典型应用是对一段信息(Message)产生信息摘要 (Message-Digest),以防止被篡改。
三、实验环境
硬件设备:普通计算机1台 软件环境:操作系统Windows XP 实验软件:虚拟试验平台软件
四、实验内容
设计几组不同的输入信息(包括汉字、数字、字 符串),测试产生的摘要信息的特点,并对结果进行 对比分析。理解MD5的作用。
五、实验步骤
六、结果分析
MD5为计算机安全领域广泛使用的一种散列函数, 用来提供对消息的完整性保护和验证。其作用是将大 容量信息在用数字签名软件签署私人密钥前被“压缩” 成一种保密的格式(就是把一个任意长度的字符串变 换成一个长度固定的大整数),防止源信息被篡改。 MD5广泛应用在数字签名,操作系统的登陆认证,各 类BSD系统登录密码、公安机关鉴别罪犯身份等方面。 MD5有MD2、MD4,它们都需要获得一个随机长度的信 息并产生一个128位的信息摘要。MD5不可逆

密码学MD5实验报告

密码学MD5实验报告

实验四:密码学MD5实验报告
专业:计算机科学与技术班级:2015级姓名:孟亚超学号:2015040
String md5=get(exe);
long endTime =System.nanoTime();
double time=endTime-beginTime;
System.out.println("【运行结果】");
System.out.println("选择的文件是: "+exe.getName());
System.out.println("该文件MD5值: "+md5);
System.out.println("计算MD5用时: "+(time/1000000)+"毫秒");
}
}
程序运行结果截图
实验结果分析
我们不难发现,这两个EXE文件虽然内容不同,但是MD5值却是相同的!
MD5,用于确保信息传输完整一致。

是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。

MD5算法实验报告

MD5算法实验报告

MD5算法实验报告08信息管理与信息系统班20081000466 李静珩一、【实验目的】:验证MD5加密算法。

二、【实验采取的数据及运行过程】:1.MD5生成文件摘要(1)本机进入“工具箱”|“加密解密”|“MD5哈希函数”|“生成摘要”页签,在明文框中编辑文本内容:深圳大学生运动会。

单击“生成摘要”按钮,生成文本摘要:b5c7082a1e4c9c376c6f604c9056fe12。

单击“导出”按钮,将摘要导出到MD5共享文件夹(D:\Work\Encryption\MD5\)中,并通告同组主机获取摘要。

(2)单击“导入摘要”按钮,从同组主机的MD5共享文件夹中将摘要导入。

在文本框中输入同组主机编辑过的文本内容,单击“生成摘要”按钮,将新生成的摘要与导入的摘要进行比较,验证相同文本会产生相同的摘要。

(3)对同组主机编辑过的文本内容做很小的改动,再次生成摘要,与导入的摘要进行对比,验证MD5算法的抗修改性。

2.MD5算法本机进入“工具箱”|“加密解密”|“MD5哈希函数”|“演示”页签,在明文输入区输入文本(文本不能超过48个字符),单击“开始演示”,查看各模块数据及算法流程。

输入明文:shanghai expo开始演示后的明文分组:7368616E67686169206578706F8000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000068子明文分组:7368616E、67686169、20657870、6F800000、00000000、00000000、00000000、00000000、00000000、00000000、00000000、00000000、00000000、00000000、00000000、00000068 摘要:84C17AD6271C6C109BA3AB9A5C1F717E初始链接变量:A.01234567B.89ABCDEFC.FEDCBA98D.76543210经操作程序后的链接变量:A.F32EC094B.89ABCDEFC.FEDCBA98D.76543210逻辑函数:F(x,y,z)=(x&y)|(~x&z)(89ABCDEF&FEDCBA98)|(~ 89ABCDEF&76543210)= FEDCBA98第2、3、4轮用软件实现。

实训报告7PGP、MD5技术应用

实训报告7PGP、MD5技术应用
二、实训内容:
1使用PGP建立自己的密钥对。
2建立一个文档。
3使用对方的公钥加密文档发送给对方(或对方使用本方的公钥加密一个文件发给本方)。
4对方用其私钥解密文件查看内容(或用本方的私钥解密文件,查看内容)。
5建立一个个人简历,计算其MD5值。
6将简历中改变一个标点符号,再次计算MD5值,然后进行比较。
7对方将一文件的MD5值签名后连同文件一并发过来。本方计算文件的MD5值,验证签名是否正确。(即数字签名之验证)
实训过程:
.三、实训小结和体会:
教师评语:
成绩:
实训序号:7
浙江警官职业学院
《计算机信息加密与解密》实训报告
实训名称:PGP\MD5技术应用
实训日期:
实训地址:
指导教师:
区队:
学号:
掌握MD5工具的使用技术
3掌握数字签名处理技术
4掌握保密的公钥应用技术
5理解多方数字签名技术
6熟知数字签名法的主要内容
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。
StringBuffer stringbuffer =newStringBuffer(2 * n);
intk = m + n;
for(intl = m; l< k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
returnstringbuffer.toString();
publicclassEXEMD5 {
/*设置MD5值输出为16进制(从0到F)*/
protectedstaticcharhexDigits[] = { '0', '1','2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C','D', 'E', 'F'};
实验四:密码学MD5实验报告
专业:计算机科学与技术班级:2015级姓名:孟亚超学号:20150402201006
实验名称
密码学MD5
实验目的
自学md5原理,编写MD5算法,了解算法工作过程
实验原理
MD5是一个不可逆的算法,是单向的,通常用于签名验证和一些不需要还原原文的算法,这种算法加密后就不能还原回原文,这种算法还原回原文有无穷种原文,所以理论上是不可能被out.println("非法输入,请重新运行程序! ");
System.exit(0);
}
longbeginTime=System.nanoTime();
String md5=getFileMD5String(exe);
longendTime =System.nanoTime();
FileChannel ch =in.getChannel();
MappedByteBuffer byteBuffer =ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
messagedigest.update(byteBuffer);
returnbufferToHex(messagedigest.digest());
}
/*将字节数组转换为字符串类型*/
privatestaticString bufferToHex(bytebytes[]){
returnbufferToHex(bytes, 0,bytes.length);
}
/*将字节数组从第m位元素到第n位元素的部分转换成字符串类型*/
privatestaticString bufferToHex(bytebytes[],intm,intn){
doubletime=endTime-beginTime;
System.out.println("【运行结果】");
System.out.println("选择的文件是: "+exe.getName());
System.out.println("该文件MD5值: "+md5);
System.out.println("计算MD5用时: "+(time/1000000)+"毫秒");
e.printStackTrace();
}
}
/*计算文件(包括EXE文件)MD5值的算法*/
publicstaticString getFileMD5String(File file)throwsIOException{
FileInputStream in =newFileInputStream(file);
}
privatestaticvoidappendHexPair(bytebt, StringBuffer stringbuffer) {
charc0 =hexDigits[(bt& 0xf0) >> 4];
charc1 =hexDigits[bt& 0xf];
stringbuffer.append(c0);
注意事项
1、MD5不可能被还原
2、MD5算法加密后的长度是固定的,长度为32位
实验环境说明
Window7
Javajdk
Eclipse for EE
实验步骤
源代码
packagecom.topcheer;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
stringbuffer.append(c1);
}
publicstaticvoidmain(String[] args)throwsIOException{
System.out.println("请选择你要计算MD5值的应用程序文件!");
System.out.println("【1】erase.exe【2】hello.exe");
importjava.nio.MappedByteBuffer;
importjava.nio.channels.FileChannel;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.util.Scanner;
/*获取MD5算法,并判断是否存在MD5算法(判断是否正确导入了加密库)*/
protectedstaticMessageDigestmessagedigest=null;
static{
try{
messagedigest= MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmException e) {
}
}
程序运行结果截图
实验结果分析
我们不难发现,这两个EXE文件虽然内容不同,但是MD5值却是相同的!
MD5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
intchoose=newScanner(System.in).nextInt();
File exe=null;
if(choose==1){
exe =newFile("./src/erase.exe");
}
elseif(choose==2){
exe =newFile("./src/hello.exe");
相关文档
最新文档