Protel (DXP2004sp2) 许可协议认证过程

摘要:iwesun 是第一个破解Protel (DXP2004sp2) 的中国人。也是我所知道的世界上第一个破解Protel (DXP2004sp2)的人。我有幸是他的朋友,所以有机会在和他的交谈中了解到这次成功破解的思想和过程。

本文是我们交谈时的记录整理,主要涉及 RSA算法的含义和及破解的主要过程。

作者:Winter

iwesun: hi

winter: hi

iwesun: 你在干嘛?

winter: 准备做个基于无线数传模块的板子

iwesun: 你用什么?

winter: 我用Linux下免费的

iwesun: 什么?

winter: 给你一个截屏看看。

winter: Protel2004对硬件要求太高

iwesun: 1G 内存就行

winter: 我的机子太破

iwesun: Linux下的太粗糙,比DXP2004,粗糙多了。

winter: 习惯问题,你被Window惯坏了。

iwesun: 没办法。

winter: 不过,Windows的确很精美

iwesun: 那你还不如用DOS

winter: 用DOS那是有毛病

iwesun:

    网络应该是自由和免费的!


---蓝波运动-----



Net must to be free and free!


-----LanBo Movement----

iwesun: 这句话翻译的对么?

winter: 也许吧,看着中文看英文可以知道你在说什么。

iwesun: free and free?不成了越来越便宜

iwesun: 或者,不成了越来越自由

winter: 意义都不错。

iwesun: LanBo 这个词好不好?

winter: BlueWave?

iwesun: 我想发音一样

iwesun: 现在我是大虾了。

winter: 是啊,你是我所知道的第一个破解Protel2004的中国人,也是世界上第一个吧。

iwesun: 地球的。

iwesun: 你来起草一个蓝波运动宣言吧,封你个“大护法”,你干不干。

winter: 好啊,只是当个护法,没一点技术含量。

iwesun: 小郑的事你干么?

winter: 不干了,我手头有一个项目

iwesun: 能听见我么?

winter: 听不见,我在Linux下,没法和你语音交谈。

winter: 你怎么破解的?说来听听。

iwesun: 你看我的帖子,你是本帖的第 13178 位读者

winter: 哦,还是你厉害,好像由国人自己破的,还不多

winter: 我指的是EDA方面的

iwesun: 所以这次名气大振

winter: 说说思路

iwesun: 什么?Debug还要有什么思路

winter: 你的破解思路

iwesun: 替换密钥。

winter: 替换密钥是什么意思?

iwesun: DXP.exe里面有一个Protel 的公开密钥呀

winter: 替换公开密钥?

iwesun: 就是用这个去验证license文件的数字签名呀

iwesun: 你没看呀,http://www.avrw.com/BBS/showbbs.asp?topage=69&bd=15&id=48523&totable=1

winter: DXP2004本身的加密技术,是什么?

iwesun: 就是用公开密钥去验证license文件的数字签名呀

winter: 不理解

iwesun: protel的license文件,这个词理解么?

winter: 理解

winter: 就是说,如果有这个license文件就可以使用protel

iwesun: 你能伪造这个文件么?

winter: 伪造的能通过protel的检测吗?

iwesun: 就是呀,protel用什么技术保证你不能伪造?

iwesun: 你知道了这个技术就可以伪造了呀

winter: 那就是用一个数字签名,来验证这个文件的合法性

iwesun: 数字签名本身就是干这事的,数字签名,这些词理解么?

winter: 理解

iwesun: 那就是了,还有什么不理解的?

winter: protel的公钥和这个lience文件是什么关系

iwesun: 公开密钥算法和数字证书,这些词理解么?

winter: 知道,但没有具体用过

iwesun: 你拿到的微软的更新文件,你怎么能保证它是微软发布的?

winter: 文件摘要,数字签名呀。

iwesun: 摘要是可以篡改的

winter: 但摘要改了以后,很容易被发现

iwesun: 什么不能改,都能改

iwesun: 我写一个木马,摘要说是微软发布的,那你怎么发现呀?

winter: 改过的摘要和摘要的再计算是不符合的

iwesun: 我连摘要的再计算也改 (winter注:摘要的计算是一个计算hash的过程)

iwesun: 但我没有改DXP.exe的代码

winter: 不明白。

iwesun: 这就是数字签名要解决的事。

iwesun: 不就是MD5么,我自己生成一个,你咋办?我连摘要的再计算也改

winter: 云里雾里

iwesun:看来你根本不懂公开密钥算法的思想。

iwesun:我什么都能改,我改了,你怎么发现我改过?

iwesun: 我说得很明白的。你到底理解不理解数字签名?你理解数字签名就明白了。

iwesun: 你给我说说数字签名吧,详细点,对一个文件签名的几个步骤

iwesun: 以及和公开密钥算法的关系

winter: 最简单的就是把整个文件的所有字节作某种运算,得到一个数值

iwesun: 这个步骤叫Hash,这个步骤任何人都可以做

iwesun: 然后呢?

winter: 这个数值就可以叫做这个文件的数字签名

iwesun: 那完蛋了,任何人都可以轻易的伪造你的签名

winter: 所以还要把这个数值加密

iwesun: 怎么加密?大的步骤。

winter: 用一个密钥,把那个数值再算一遍

iwesun: 用什么密钥?

winter: 随便,只要别人不知到

iwesun: 你知道这里为什么必须采用RSA(公开密钥算法)的道理么?

iwesun: 那好,你随便搞一个加密算法,和一个密钥对你的hash值加密了,人家真么验证

iwesun: 你是把你的加密算法和你用的密钥,告诉人家,还是不告诉?

winter: 不告诉

iwesun: 不告诉,没人能验证,那还不如,你也别用什么hash乐,直接对文件加密吧。反正就你一个人看。

iwesun: 只有你自己能验证。

winter: 算法是公开的

iwesun: 算法是公开的。密钥不公开,还是验证不了。

iwesun: 现在假设你选用的是对称加密。

iwesun: 先讨论一下你对称加密的方法是否可行?你明白对称加密这个词么?

winter: 应该是可以算过去,还能算回来

iwesun: 不对

iwesun: 加密都能算过去,还能算回来。散列不能,散列就是hash。

winter: 这个我理解,hash算不回来

iwesun: 那你再说说,对称加密这个词

winter: f(k1+明文)=密文,f(k2+密文)=明文, 我理解的是这个意思

iwesun: 解释一下

winter: f是算法,k1,k2是密钥

iwesun: 为什么要k1,k2

winter: k1可以等于k2,也可以不等

iwesun: f在两个式子里是相同的么?为什么?

winter: f应该是相同的,我想,但也许不同。我不太清楚

iwesun: k1=k2有什么意义,k1<>k2有什么意义?

winter: 不知道

iwesun: 我和你进行私人通信,约定1234是我们两个得密钥,采用的算法k1=k2

iwesun: 这样我两个的通话就不能被第三者且听了

winter: 对的,但是如果第三者(信使)用1234加密另外的内容给我怎么办

iwesun: 废话,前提是第三者不知道我们用的是1234

iwesun: 要是第三者知道了,还谈什么叫加密

iwesun: 第三者也许这能从密文反推1234,但这是困难的

winter: 但算法是公开的,反推1234也许不困难

iwesun: 那时加密强度的问题,不在目前的讨论范围中,任何加密算法都有加密强度的问题。

iwesun: 任何加密都是基于这个前提的第三者不知道密钥。

iwesun: 我们讨论的是基于另一个假设,加密强度足够高

iwesun: 加密强度足够高,第三者这能从密文反推1234是困难的

winter: 那这个时候,k1=k2有意义

iwesun: 那就是了,所谓对称加密就是k1=k2

winter: 这就叫对称? 我还以为是算过去再算回来

iwesun: 而且单从加密强度来说k1=k2的加密算法,可以很容易达到很大

iwesun: 那你再说说非对称加密

winter: 那我的理解就是算过去,很难算回来,

iwesun: 又想当然了

winter: 没有看过这方面的书

iwesun: 没有密钥,对称加密,也很难算回去

iwesun: k1<>k2,就叫非对称加密

iwesun: 一个设计良好的加密系统,其加密强度,不依赖预算法的保密性,而要依赖于密钥

iwesun: 数学家追求的就是这样的加密算法,k1<>K2

iwesun: 那你就应该明白了,人类一开始都采用的是对称加密,加密仅仅局限于“朋友”之间

winter: 理解

iwesun: 朋友----相互约定好密钥的人

winter: 非朋友之间就不能采用对称

iwesun: 那陌生人如何实现加密通信?

iwesun: 你设计一下,陌生人如何实现加密通信?

winter: 不清楚

iwesun: 简单的说,是这样的。我:有Kg和Ks。(winter注:Kg公钥,Ks私钥)

iwesun: 我把Kg公布在网上

iwesun: 全世界任何人都有我的Kg

winter: 这就叫公钥,怎么用呢

iwesun: 这样全世界任何人都可以用我的这个Kg加密生成一封信

iwesun: 这封信只有我能用我的Ks解密

winter: 哦,Kg和Ks是一对。

iwesun: 这样一个陌生人可以给我发一封只有我看得懂的信。

iwesun: 我收到这封信后,打开了,里面有陌生人的email和他的Kg

iwesun: 我也一样,用他给我的Kg来加密给他的信,这样他就能用他的Ks来解密这封信了。

iwesun: 明白了么?这就是RSA在通信的应用

winter: 哦,你要用他公布的他的Kg来加密只有他的Ks可以打开的信。每个人都得有自己的Kg和Ks。

iwesun: 对喽。

iwesun: Kg和Ks都是自己生成的,给对方发信,用对方的Kg加密,并把自己的Kg高诉对方。

iwesun: 你自己的Ks永远不告诉任何人

winter: 这个当然。那如何生成自己的Kg和Ks呢?

iwesun: 我给你一个例子

iwesun: 两个非常大的质数

iwesun: 乘起来是一个合数

winter: 对

iwesun: 乘很容易

iwesun: 但对他进行分解,就非常困难了

iwesun: 因为只有一个解

winter: 那是很难找到解

winter: 用这两个非常大的质数如何做出Kg和Ks

iwesun: 我的数是两个本来就是两个质数的积

iwesun: 我公布那个乘积作为Kg

iwesun: 我自己手里拿着两个质数,作为Ks

iwesun: 公开密钥算法都是用这种唯一,但困难的数学问题构造的

winter: 那质数要多大

iwesun: 512bit以上

iwesun: Protel用的是2048bit

winter: 如何找这种质数

iwesun: 费马大定理,2的(2n)次方 -1是质数的可能性非常大

iwesun: 费马大定理,还未被推翻,但也没被证明。

winter: 哦,原来如此。

iwesun: 那,加密通信你该明白了。

iwesun: 另一个应用,就是数字签名,和这有点不一样。

iwesun: 其实,还有一点我没提

iwesun: 就先把加密通信讲透把

iwesun: RSA加密算法的运算量通常很大,因此速度较慢

winter: 理解

iwesun: 因此采用RSA算法作为全部的加密算法是不可行的

iwesun: 通常,两个陌生人也就是在第一次通信时,使用这个算法

winter: 第二次呢

iwesun: 在通信的内容中,约定一个相同的对称密钥

iwesun: 比如1234,以后的通信就用1234

winter: 可以理解,就变成对称加密了。

iwesun: 明白了么。

winter: 明白

iwesun: 你说说数字签名,根据上面的情况设计数字签名

iwesun: 数字签名的要求你应该明白吧?

winter: 用自己的Ks加密自己的身份,对方用我的Kg解密

iwesun: 你差不多明白了,好,现在讨论破解Protel。

iwesun: 那你明白Protel的Lience文件了么?

winter: 不太明白

iwesun: protel公司生成了一对Kg何Ks

iwesun: 你交钱的时候,Protel公司用它的Ks生成一个Liense文件

iwesun: 你拿着这个Liense文件,你的Protel2004里有Kg,用Kg来检验你的协议文件是否有效

winter: 所谓有效,是一个什么结果呢?

iwesun: 有效就是能够正确解密。

iwesun: 从原理上说,这个协议文件是“不可伪造”

winter: 对,否则Kg验证不来哦,不过是不是可以同时伪造Liense和Kg

iwesun: Protel2004SP2比以前的版本有许多重大的更新,功能上加强很多,完全可以称得上是2005版

iwesun: 这样,Protel公司对它采用了史无前例的保护,采用了2048为的公开密钥

iwesun: 那你明白了,我为什么要替换他的Kg了么?

winter: 我明白,但得先伪造那个Liense文件。

iwesun: 我自己生成一对Ks和Kg

iwesun: 我把我的Kg写到Protel程序中,替换它的Kg

iwesun: 这样我有与之相对应的Ks

iwesun: 我可以任意生成License文件,根本就不需要他的License文件

winter: 说如何生成那个Liense文件,我关心的是那个Lience加密前的内容

iwesun: 很简单,其本质就是一个ini文件

winter: 你是说,那个Liense文件实际上是一个ini文件

iwesun: 就是包里的ini文件,你自己想怎么写就怎么写。

winter: 什么叫自己想怎么写就怎么写?

iwesun: 我看你完蛋了,我说为什么,你怎么这么费尽。

winter: 没有搞过这东西

iwesun: 我以前也没搞过,就是听听概念,也没详细看过。

winter: 我更是听都没有听过,不过今天算是搞明白了一点

iwesun: 明白个屁。

winter: 还有一个问题,你如何保正你的加密算法,和Protel的解密算法一致

iwesun: 废话。debug

winter: 你debug的是他的解密算法呀

iwesun: 是呀

winter: 加密算法和解密算法是一样的?

iwesun: 它还发明自己的算法不成?

winter: 也许呀,难道不可以吗?

iwesun: 我早都说了,加密强度不依靠算法的保密性

winter: 这个我也理解

iwesun: 你自己设计的算法,从数学上将肯定没有数学家搞的完善

iwesun: 搞不好,会漏洞百出。数学家搞得都有严格的证明

iwesun: 加密和解密是不同的,但是都是公开的

winter: 但是有多种算法吧

iwesun: 就两种,看到他如何解密,就知道他如何加密了

iwesun: 而且常用的就一种,一看就知道,跑不掉的。

winter: 啊,那我就清楚了,说说如何做那个Liense文件。

iwesun: 首先,得破解Liense文件的格式。

iwesun: 文件的第一个DWORD,即头4字节是ini文件的长度。

iwesun: 接着是ini文件的内容。

iwesun: 最后是256字节的数字签名。

winter: 等等,数字签名如何产生的?

iwesun: 就是ini内容的hash后用Ks产生啊。

winter: 是啊,Protel用你的Kg解密后,它怎么验证那个hash是否合法?

iwesun: 在对ini内容hash啊。

winter: 是呀,你怎么保证你的hash算法和他的hash算法一样。

iwesun: 都是调用MS的库方法。

winter: 哦,这样。

winter: 那,加密和解密也是MS的库方法?

iwesun: 有关签名的过程全都调MS的CSP的API。

iwesun: 最后还要对这个文件从要把[256]空间映射到[64]空间,完成一个转换。

winter: base64编码?

iwesun: base64编码,你说说,我不知道。

winter: 2(6次方)=64

winter: 用6bit编码8bit的信息。4x6=3x8,最后是把0x00-0xFF的内容用文本0-9A-Za-z/表示。

iwesun: 对了。

iwesun: 上面的文件用base64编码后,就是最后的alf文件,也就是Liense文件。

winter: 那那些激活码都是障眼法

iwesun: 也不完全是

winter: 怎么说?

iwesun: protel是网上激活的,这些是网上的数据库的值

winter: 这些东西都加到ini文件里?

iwesun: 对呀,

iwesun: 记录你的身份

winter: 那现在做的,就是自己写一个ini文件,自己往里面加任意的东西--按它的格式,

winter: 然后,用这个ini文件作数字签名。

winter: 然后先生成一个二进制的文件,最后base64这个文件得到最终的alf文件。

iwesun: 基本上说法成立。

iwesun: 但ini的内容也不能完全任意,他的每个项都有意义

winter: 我知道,我指的是那几个码

iwesun: 那几个码现在看来也是有意义的

winter: 也就是说,哪几个码不能乱写

iwesun: 乱写也能用

iwesun: 但不是正式板的license

iwesun: 正式板的license 的码应满足一定的关系

iwesun: 乱写的就像是无限期的全功能实用版

winter: 那你这次工作的总结可不可以是这样:1。确定解密算法,2。确定alf文件的生成方法

iwesun: 是吧

winter: 今晚算是上了一课,对加密和解密有了新的认识

iwesun: 你怎么连这些常识都知道得太少了

winter: 我的工作中并不需要这些,几乎没有碰过

iwesun: 还是跟微软跑吧

winter: 那到没有必要

iwesun: protel现在看来紧跟微软,VS2003公布,他就用他改写一遍。

iwesun: 界面超级华丽

winter: 可以想象

iwesun: 这次破解,学了学VC。

winter: 我准备把今天我们的交谈整理一下,发布出来。

iwesun: 好的

iwesun: 我还是习惯C#,但这次没办法,C#调不了这些函数。

winter: 我习惯了Java

winter: 不过我要删除一些影响我形象的对话,我不能表现的那么笨,毕竟是和高手对话

iwesun: 啊,哈哈。随你

winter: 哈哈

iwesun: 这一仗,至少让我以后,讨饭的时候,有人能聘我了

iwesun: 混口饭吃,应该不成问题了。

winter: 你是高手啊

iwesun: 你是

winter: 如果你是福尔摩斯,我愿做华生,跟在你身边

iwesun: 你是如来佛,我是迦南

iwesun: 我要把你供起来

iwesun: 有可能的话,推动一下蓝波运动

iwesun: 网络自由化运动

winter: 我准备以这篇对话加入

iwesun: 叫什么?题目

winter: 普通一点,就叫《关于这次成功破解ProtelDXP的对话》

iwesun: 好的。

winter: 对了,还有一个问题,关于base64。

iwesun: base64是Protel自己编的

winter: 那base64,你是用protel的代码,是吗?

iwesun: 我自己编的

winter: 但是base64编码和解码也得一样呀

iwesun: base64编码和解码我用了两个映射表

winter: 你得先得到Protel的base64的map吧

iwesun: 对,Debug是可以看到

winter: 好,基本上整个过程我都清楚了,等会可以写了。

iwesun: 我还把这个表贴出来过

winter: 你觉得论坛上有多少人理解

iwesun: 其实我一开始就找到了核心的地方,希望大家一起做,但回应寥寥无几。

iwesun: stefan0n@hotmail.com 这个意大利人我一说RSA,他就明白了

iwesun: 我睡觉了。

iwesun has closed the conversation window.

iwesun logged out.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值