常见的计算机签名方法

数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。 是一种类似写在纸上的普通的物理签名 ,比如合同签名。

数字签名有两种功效:

  • 能确定信息确实是发送方签名并发送出来的,因为别人假冒不了发送方的签名。
  • 数字签名能确定发送信息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字摘要的值也将会发生改变。不同的文件将得到不同的数字摘要。

常用的数字签名方法主要有:HASH算法 ,此算法主要包括MD(Message-Digest,信息摘要)和SHA(安全散列算法,Secure Hash Algorithm)两类 。Digital Signature Algorithm (DSA), ECDSA (Elliptic Curve Digital SignatureAlgorithm),椭圆曲线数字签名算法,微软产品的序列号验证算法使用的就是ECDSA。与传统的数字签名算法相比,速度快,强度高,签名短。

  1. what’s MD5

MD5是由Ron Rivest在1991设计的一种信息摘要(message-digest )算法,当给定任意长度的信息,MD5会产生一个固定的128位“指纹”或者叫信息摘要。从理论的角度,所有的信息产生的MD5值都不同,也无法通过给定的MD5值产生任何信息,即不可逆。
MD5算法在RFC 1321(Request For Comments,征求修正意见书)做了详细描述。
1.1 MD5功能特点

1.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹)     

2.不同的输入得到的不同的结果(唯一性)。要使两个不同的信息产生相同的摘要,操作数量级在2^64次方。  

3.根据128位的输出结果不可能反推出输入的信息。根据给定的摘要反推原始信息,它的操作数量级在2^128次。  

1.2 MD5争议
MD5是否为加密算法:
<1>:MD5不能从密文反过来得到原文,即没有解密算法,故不能称为加密算法;
<2>:MD5处理后看不到原文,即已经将原文加密,故MD5属于加密算法。

1.3 MD5用途
1>防止信息被篡改

a) 电邮文档一致性验证:在发送一个电子文档前,先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。  

b)文件下载安全验证:在下载网络文件/程序时,为了防止不法分子在安装程序中添加木马,一般会在网站上公布由安装文件得到的MD5输出结果。用户下载完之后,在本地计算MD5值,在于网站公布的MD5值作比较,验证文件是否完整和安全。  

c)SVN update:SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.
2>防止直接看到密码明文:现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。就算不法分子得到数据库种用户密码的MD5值,也无法知道用户的密码。比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

3>防止抵赖(数字签名):这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

在这里我就总结一下我在实现MD5算法对文件和对字符串计算摘要步骤。

  1. MD5算法步骤
    MD5的算法输入为以bit为单位的信息(1 byte=8 * bit),经过处理,得到一个128bit的摘要信息,这128位的摘要信息在计算过程中被分为4个32bit的子信息,存储在4个buffer(a_,b_,c_,d_)中,它们初始化位固定常量。MD5算法饭后使用每一个512bit的数据块去改变a_,b_,c_d_中的值,所有的数据处理完之后,把最终的a_,b_,c_d_拼接在一起,组成一个128bit的输出。处理每一块数据有四种类似的过程,每一个过程由16个相似的操作流程组成,操作流中包括非线性函数,相加以及循环左移。

具体算法大致分为5个步骤:

  • 添加填充位
  • 添加bit长度
  • 初始化MD buffer(a_,b_,c_d_)
  • 按512位数据逐个处理输入信息
  • 摘要输出

我在这里就总结一个按512位数据块处理输入信息,其他四步在源码中有详细注释介绍
MD5实现源代码

按512位数据逐块处理输入信息

一组chunk 16个字节 512个bit
4个计算机摘要A,B,C,D每个都是4个字节
初始化计算机摘要:
A=0X 67 45 12 01;
B=0X 89 ab cd ef;
C=0X fe dc ba 98;
D=0X10 32 54 76;
按一个处理单位(chunk)512位数据逐个处理输入数据
每个chunk 经历4个函数(F,G,H,I)处理,这四个函数输入3个4字节的值,产生一个4字节的输出,
F(x,y,z) = (x & y) | ((~x) & z)
G(x,y,z) = (x & z) | ( y & (~z))
H(x,y,z) = x ^ y ^ z
I(x,y,z) = y ^ (x | (~z))

在处理一个chuck(512bit 64byte)的数据时,将这个chuck 分为16组4字节数据,一个chuck经理4轮处理,每轮都会把chunk的数据处理一遍,每轮有16个相似的子操作,最后一个chunk的数据要进行64个子操作

计算之前先保存MD buffer的当前值
a=A,b=B,c=C d=D;
第一轮操作:F函数操作(0<=i<=15)对前16个字节进行操作
F = F(b, c, d)
d = c
c =b
b = b + shift((a + F + k[i] + chunk[g]), s[i])
a = d
F 是F函数的返回值
K是一个64位元素的表,表中的元素值由sin函数构建,K[i]等于2^(32) * abs(sin(i))的整数
部分,
k[i]=(size_t)(abs(sin(i+1))*pow(2,32));
因为i是数组下标所以i+1
g 和i存在对应关系
if (0 <= i < 16) g = i;
if (16 <= i < 32) g = (5 * i + 1) % 16;
if (32 <= i < 48) g = (3 * i + 5) % 16;
if(48 <= i < 63) g = (7 * i) % 16;
shift 是一个循环左移(按位操作)函数左参数是要操作的数,右参数是左移多少位
size_t s[] = { 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7,
12, 17, 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, 6, 10, 15, 21, 6, 10, 15, 21 };
chunk的后48字节的操作分为三部分,16~31 G函数 32~47H函数 48~63 I函数
每次完成以上操作便要更新MDbuffer的ABCD
A+=a;
B+=b;
C+=c;
D+=d;

摘要输出:
拼接4gebuffer中的摘要信息,以A中的低地址开始,D中的高地址结束,最终输出的是一个128bit 16byte的摘要信息 的16进制表示,故输出一个32位长度的摘要信息

测试结果:
文件摘要:在这里插入图片描述
字符串摘要:
我的计算结果: 在这里插入图片描述
在线加密工具计算结果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值