加密算法之单向散列算法

加密算法

背景:
现有的序列号加密算法大都是软件开发者自行设计的,大部分相当简单。有些算法,其作者虽 然下了很大的工夫,却往往达不到希望达到的效果。其实,有很多成熟的算法可以使用,特别是密 码学中一些强度比较高的算法,例如RSA 、BlowFish 、MD5等。对这些算法,网上有大量的源码或 编译好的库(当然这些库中可能会有一些漏洞),可以直接加以利用,我们要做的只是利用搜索引 擎找到它们并将它们嵌入自己的程序。应当指出,尽管这些算法的强度很高,但是使用方法也要得 当,否则效果就和普通的四则运算没有区别,很容易被解密者算出注册码或者写出注册机。

1.1 单向散列算法

单向散列函数算法也称 Hash(哈希)算法,是一种将任意长度的消息压缩到某一固定长度(消 息摘要)的函数(该过程不可逆)。Hash 函数可用于数字签名、消息的完整性检测、消息起源的认 证检测等。常见的散列算法有MD5 、SHA 、RIPE-MD 、HAVAL 、N-Hash等。
在软件的加密保护中, Hash 函数是经常用到的加密算法。但是,由于 Hash 函数为不可逆算 法,软件只能使用Hash 函数作为加密的一个中间步骤。例如,对用户名进行 Hash变换,再对这个 结果进行可逆的加密变换(例如对称密码),变换结果为注册码。从解密的角度来说, 一般不必了 解 Hash 函数的具体内容(变种算法除外),只要能识别出是何种 Hash 函数,就可以直接套用相关 算法的源码来实现。

1.1.1 MD5 算法

MD5 消息摘要算法(Mesage Digest Algorithm) 是由 R.Rivest 设计的。它对输入的任意长度的 消息进行运算,产生一个128位的消息摘要。近年来,随着穷举攻击和密码分析的发展,曾经应用 最为广泛的MD5算法已经不那么流行了。

1. 算法原理

(1)数据填充
填充消息使其长度与448模512同余(即长度=448 mod 512)。也就是说,填充后的消息长度 比512的倍数仅小64位。即使消息长度本身已经满足了上述长度要求也需要填充,填充方法是: 附一个1在消息后面,然后用0来填充,直到消息的长度与448模512同余。至少填充1位,至多 填充512位。
(2)添加长度
在上一步的结果之后附上64位的消息长度。如果填充前消息的长度大于2“,则只使用其低64 位。添加填充位和消息长度之后,最终消息的长度正好是512的整数倍。
令M[O…N-1]表示最终的消息,其中N 是16的倍数。
(3)初始化变量
用4个变量 (A 、B 、C 、D) 来计算消息摘要。这里的A 、B 、C 、D都是32位的寄存器。这些寄存器以下面的十六进制数来初始化:

A=01234567h,B=89abcdefh,C=fedcba98h,D=76543210h

而且,在内存中是以低字节在前的形式存储的,即如下格式。

0123456789 AB CD EF FE DC BA 9876543210

(4)数据处理
以512位分组为单位处理消息。首先定义4个辅助函数,每个都是以3个32位双字作为输入, 输出1个32位双字。
F(X,Y,Z)=(X&Y|((~X)&Z)
G(X,Y,Z)=(X&Z)|(Y&(~Z))
H(X,Y,Z)=XyZ
I(X,Y,Z)=Y^(X)(~Z))
其中,“&”是与操作,“|”是或操作,“~”是非操作,“^”是异或操作。
这4轮变换是对进人主循环的512位消息分组的16个32位字分别进行如下操作:将A、B、C、 D 的副本a、b、c、d 中的3个经F、G、H、I 运算后的结果与第4个相加,再加上32位字和一个 32位字的加法常数,并将所得之值循环左移若干位,最后将所得结果加上a 、b 、c 、d 之一,并回 送至A 、B 、C 、D, 由此完成一次循环。
所用的加法常数由表 TI1]来定义,其中 i 为 1 至64之中的值。7[i] 等于4294967296 乘以 abs(sin(①))所得结果的整数部分,其中i 用弧度来表示。这样做是为了通过正弦函数和幂函数来进一 步消除变换中的线性。
( 5 ) 输 出
当512位分组都运算完毕, A 、B 、C 、D 的级联将被输出为 MD5散列的结果。
以上是 MD5算法的简单描述。
( 5 ) 输 出
当512位分组都运算完毕, A 、B 、C 、D 的级联将被输出为 MD5散列的结果。
以上是 MD5算法的简单描述,更为详细的实现程序请参考随书文件中的源代码。

2.MD5 算法在加解密中的应用

MD5算法将任意长度的字符串变换成一个128位的大整数,而且是不可逆的。换句话说,即便 MD5算法的源代码满天飞,任何人都可以了解MD5算法,也绝对没有人可以将一个经 MD5算法加 密的字符串还原为原始的字符串。
在实际应用中,若单向散列算法运用不当,是没有什么保护效果的。看一看如下使用MD5 判 断注册码的伪码。

if(MD5 (用户名)==序列号)
正确的注册码;
else
错误的注册码;

正确的注册码以明文形式出现在内存中,因此,解密者很容易找到正确的注册码,注册机只要 识别出程序采用的是 MD5 算法就够了。遗憾的是,不少软件作者都偏爱这种判断注册码的方法。
MD5 代码的特点非常明显,跟踪时很容易发现。如果软件采用 MD5 算法,在初始化数据时必 然会用到上面提到的4个常数(A、B、C、D)。 实际上,像KANAL 这样的算法分析工具不是通过 这4个常数来鉴别MD5的,而是通过识别具有64个常量元素的表T 来判断是不是 MD5算法的。对 于变形的 MD5算法,常见的情况有3种: 一是改变初始化时用到的4个常数;二是改变填充的方法; 三是改变 Hash 变换的处理过程。在解密时,只要跟踪以上这些点,对MD5的源代码进行修改,就 可以实现相应的注册机制了。

1.1.2 SHA算法

安全散列算法 (Secure Hash Algorithm,SHA)包括 SHA-1 、SHA-256 、SHA-384 和 SHA-512, 共4种,分别产生160位、256位、384位和512位的散列值。下面以 SHA-1 为例,对 SHA系列散 列函数进行简要介绍。

1. 算法描述

SHA-1 是一种主流的散列加密算法,其设计基于和MD4 算法相同的原理,并且模仿了该算法。
SHA-1 算法的消息分组和填充方式与 MD5算法相同。

这与上面的f₁(B,C,D) 的定义是等价的,将产生相同的散列值。
类似于MD5,SHA-1 算法使用了一系列的常数 K(O),K(1),…,K(79), 以十六进制形式表示如下。

H₀=67452301h
H₁=EFCDAB89h
H₂=98BADCFEh
H₃=10325476h
H₄=C3D2E1FOh

解密者尝试分析算法时,可以通过上面的常数K,及 H, 来识别其为SHA-1 算法。
关于SHA-1 、SHA-256 、SHA-384 和 SHA-512 算法更加详细的计算过程,请参考 FIPS 180-1 及FIPS 180-2 。SHA-256 、SHA-384和 SHA-512 算法的初始化数据(十六进制形式)如下。
● SHA-256

6A09E667	BB67AE85	3C6EF372	A54FF53A
510E527F	9B05688C	1F83D9AB	5BE0CD19

● SHA-384

CBBB9D5DC1059ED8	629A292A367CD507
9159015A3070DD17	152FECD8F70E5939
67332667FFC00B31	8EB44A8768581511
DBOC2EOD64F98FA7	47B5481DBEFA4FA4

SHA-512

6A09E66713BCC908
3C6EF372FE94F82B
510E527FADE682D1
1F83D9ABFB41BD6BBB67AE8584CAA73B
A54FF53A5F1D36F1
9B05688C2B3E6C1F
5BE0CD19137E2179

1.1.3 SM3密码杂凑算法

SM3 是国密算法,由国家密码局发布。该算法广泛用于商用密码应用中的数字签名和验证、消 息认证码的生成与验证及随机数的生成,可满足多种密码应用的安全需求。经过填充和迭代压缩, 该算法能够对输入长度小于2“比特的消息生成长度为256比特的杂凑值。具体算法及运算示例参见 SM3算法标准

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/889327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

egg初始搭建

前言 egg.js 是由阿里开源的面向企业级开发的 Node.js 服务端框架,它的底层是由 Koa2 搭建。 Github:https://github.com/eggjs/egg,目前 14.8K Star,egg 很适合做中台。 安装 首先,你要 确保 Node 已经配置环境变量…

Python中的all/any函数和操作符and/or

操作符直观易读适用简单逻辑,函数紧凑方便适宜多条件处理。 (笔记模板由python脚本于2024年12月12日 22:19:10创建,本篇笔记适合有一定编程基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&#xff…

论文学习——多种变化环境下基于多种群进化的动态约束多目标优化

论文题目:Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化(Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省) 任务书

2025年山东省职业院校技能大赛“信息安全管理与评估”(山东省 任务书 模块一网络平台搭建与设备安全防护任务1:网络平台搭建 (50分)任务2:网络安全设备配置与防护(250分) 模块二网络安全事件响应、数字取证…

国标GB28181-2022平台EasyGBS如何实现无插件也能让RTSP在网页端播放?

在流媒体技术日新月异的今天,实时流传输协议(RTSP)作为视频监控、在线直播等领域的重要支撑,正经历着前所未有的变革。曾经,RTSP在网页端播放面临着诸多挑战,如浏览器兼容性问题、安全性考量以及视频流处理…

EXCEL 关于plot 折线图--频度折线图的一些细节

目录 0 折线图有很多 1 频度折线图 1.1 直接用原始数据做的频度折线图 2 将原始数据生成数据透视表 3 这样可以做出了,频度plot 4 做按某字段汇总,成为累计plot分布 5 修改上面显示效果,做成百分比累计plot频度分布 0 折线图有很多 这…

MATLAB四种逻辑运算

MATLAB中的四种逻辑运算包括逻辑与用&或 a n d 表示 ( 全为 1 时才为 1 ,否则为 0 ) and表示(全为1时才为1,否则为0) and表示(全为1时才为1,否则为0),逻辑或用|或 o r 表示 ( 有 1 就为 1 ,都为 0 才为 0 ) or表示…

jmeter CLI Mode 传参实现动态设置用户数

一.需求 CLI 运行模式下每次运行想要传入不同的用户数,比如寻找瓶颈值的场景,需要运行多次设置不同的用户数。 二.解决思路 查看官方API Apache JMeter - Users Manual: Getting Started api CLI Mode 一节中提到可以使用如下参数做属性的替换&#…

iPhone苹果相册视频怎么提取音频?

在数字时代,视频已成为我们记录生活、分享故事的重要方式。然而,有时候我们只想保留视频中的音频部分,比如一段动人的背景音乐或是一段珍贵的对话。那么,苹果相册视频怎么提取音频呢?本文将介绍三种简单且实用的方法&a…

阿里云数据库MongoDB版助力极致游戏高效开发

客户简介 成立于2010年的厦门极致互动网络技术股份有限公司(以下简称“公司”或“极致游戏”),是一家集网络游戏产品研发与运营为一体的重点软件企业,公司专注于面向全球用户的网络游戏研发与运营。在整个产业链中,公…

前端成长之路:HTML(4)

前文提到,在HTML中,表格是为了展示数据,表单是为了提交数据。表单标签是十分重要的标签,在网页中,需要和用户进行交互,收集用户信息等,此时就需要使用表单。表单可以将前端收集到的用户输入的信…

axios请求之参数拼接

URL 查询参数传递数据 优点: 简洁性: URL 查询参数的方式比较简洁,适合传递少量的数据。缓存友好: 查询参数可以被浏览器缓存,适合 GET 请求,但对于 POST 请求,浏览器通常不会缓存。 缺点: 数据大小限制: U…

软考高级架构 —— 10.6 大型网站系统架构演化实例 + 软件架构维护

10.6 大型网站系统架构演化实例 大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,主要解决这类问题。 1. 单体架构 特点: 所有资源(应用程序、数据库、文件)集中在一台服务器上。适用场景: 小型网站&am…

【Java学习笔记】Collections 工具类

一、基本介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作 二、排序操作:(均为 static 方法) 三、查找、替换

Mac备忘录表格中换行(`Option` + `Return`(回车键))

在Mac的ARM架构设备上,如果你使用的是Apple的原生“备忘录”应用来创建表格,换行操作可以通过以下步骤来实现: 在单元格中换行: 双击你想要编辑的单元格你可以输入文本,按Option(⌥) Enter来插…

亚信安全DeepSecurity完成与超云超融合软件兼容性互认

近日,亚信安全与超云数字技术集团有限公司(以下简称“超云”)联合宣布,亚信安全成功完成与超云超融合软件的产品兼容性互认证。经严格测试,亚信安全云主机安全DeepSecurity与超云FS5000增强型融合系统(简称…

Strawberry Fields:探索学习量子光学编程的奇妙世界

​​​​​​​ 一、Strawberry Fields 简介 Strawberry Fields 是由加拿大量子计算公司Xanadu开发的全栈 Python 库,在量子计算领域中占据着重要的地位。它为设计、模拟和优化连续变量(CV)量子光学电路提供强大工具,Strawberry…

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1:“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细…

Linux学习——7_SElinux

SElinux SElinux简介 SELinux是Security-Enhanced Linux的缩写,意思是安全强化的linux SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用 传统的访问控制在我们开启权限后,系统进程可以直…

es(elasticsearch)

elasticsearch启动顺序 文章目录 elasticsearch启动顺序 1️⃣、elasticsearch-7.6.12️⃣、elasticsearch-head-master3️⃣、elasticsearch-7.6.1-kibana-7.6.1 1️⃣、elasticsearch-7.6.1 双击:D:\javaworkspace\java\elasticsearch-7.6.1-windows-x86_64\elas…