求雪中悍刀行十大高手 一段也行

大家知道,每当我们格式化软盘或硬盘时系统都会给它分配一个序列号,即用DOS命令dir显示出的"Volume Serial Number is 0A41-0E0A"。该序列号是随机产生的,且具有唯一性。也就是因为这个原因许多软件的测试版本利用该项技术使测试版一旦过了限定期限就不能再使用,即使将该软件重新安装也无济于事。另外,有些共享软件的注册码也是通过这个序列号来生成的。同样的方法我们也可以运用到软件的防拷贝技术。那么如何才能实现上述功能呢?
为了达到目的我们必须首先能够得到硬盘的序列号,其次,为了安全起见我们最好再选择一种加密算法,将加密后的硬盘的序列号作为密文公开存放,软件通过解密得到明文,即硬盘的序列号,通过将解密后的硬盘序列号和实际的硬盘序列号相比较得出程序是否合法。这一步当然是由应用程序秘密运行,用户根本不知道,从而达到软件的二次加密目的,同时也隐藏了软件的合法性识别过程,使破译者无从下手。下面就来谈谈如何具体实现。
一、如何读取硬盘序列号
要读取硬盘序列号我们可以用汇编来实现,但毕竟不容易,况且也不能有效的结合到PB脚本中。在PB中我们可以通过调用Windows提供的外部函数GetVolumeInformationA()来实现。这相对来说比较简单。
上述原型中,参数类型只要是以"LP-"开头的表明该参数用的是长指针(Long Pointer)类型,即在PB中调用时的参数传递是通过引用传递。在8个参数中对我们真正有用的只有两个LPCTSTR lpRootPathName和LPDWORD lpVolumeSerialNumber。其中参数lpRootPathName是指向文件系统根目录的地址,我们需要用它来指明所要获取序列号的硬盘盘符;参数lpVolumeSerialNumber是返回的硬盘序列号的地址,这正是我们需要的。
众所周知,PB在调用任何外部函数前都要首先进行函数声明,可以将声明放在全局或局部函数声明中。具体声明如下:
上述声明中,"ref"指明是该参数是通过引用传递的,有关函数引用的详细内容请参见有关教程。声明完毕我们不能马上进行调用,还必需确保已为它分配足够的内存空间,即使是参数引用传递也是这样,否则的话将会出现调用错误,这跟C语言的引用调用不同,这一点往往被忽视,希望读者能够注意。也就是为什么我在调用该函数前将有些字符串参数给它预先分配了多达256个字符空间以及给一些整型类型的参数赋初始值256。完整的读取硬盘序列号的程序代码如下:
// 一般情况都是C盘,除非你能保证用户存在其它逻辑盘或物理盘
一旦读取成功我们的任务也就完成了近一半,接下来要做的是怎样选择一个合适的加密算法。
二、选取一个优秀的加密算法
早在几千年前人类就已经有了通信保密的思想和方法。但直到1949年,信息论创始人香农发表著名文章,论证了一般经典加密方法得到的密文几乎都是可破译的。密码学才得以进入了一个新的发展时期。70年代后期,美国的数据加密标准DES和公开密钥密码体制的出现成为近代密码学发展史上的两个重要里程碑。
公开密钥密码体制的概念是由Difie与Hellman于1976年提出。所谓公开密钥密码体制就是加密密钥与解密密钥不同,是一种由已知加密密钥推导出解密密钥在计算上是不可行的密码体制。其中,基于数论中大数分解问题的RSA体制曾被ISO/TC97的数据加密技术委员会SC20推荐为公开密钥数据加密标准。
2、RSA体制的基本原理
该体制是根据寻求两个大素数比较简单,而将它们的乘积分解开则极其困难这一原理来设计的。在已提出的公开密钥算法中它是最容易理解和实现的。RSA在世界上许多地方已成事实上的标准。ISO几乎(但没有明确)已指定RSA用作数字签名标准。该算法已经经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明了该算法有一定的可信度。它的安全性是与大数分解密切相关的。我想通过下表你将会对它的安全性有一个较好的认识,它给出了在计算机每一微妙做一次操作的假定下分解不同大小的N所需要的时间。
RSA加密算法具体如下:
(1)选取两个大素数,p和q。为了获得最大程序的安全性,两个素数的长度一样。并计算乘积N(N=pq)。
??(2) 随后计算出N的欧拉函数ф(N)=(p-1)(q-1),ф(N)定义为不超过N并与N互素的数的个数。
??(3)从[0,ф(N)- 1]中随机选取加密密钥e,使得e和ф(N)互为素数。 ??
(4)计算出满足公式ed=1 modф(N)的d,d为解密密钥。 ??
(5)若用整数X表示明文,整数Y表示密文(X,Y均小于N),则加解密运算为:
注意,其中的d和N也互素。e和N是公开密钥,d是秘密密钥。两个素数p和q应舍弃,但千万不要泄密哦。
(1)素数:素数是一个比1大,其因子只有1和它本身,没有其它数可以整除它的数。素数是无限的。例如,2,3,5,7……等。
??(2)两个数互为素数:指的是它们除了1之外没有共同的因子。也可以说这两个数的最大公因子是1。例如,4和9,13和27等。
??(3)模变换:两个数相模,如A模N运算,它给出了A的余数,余数是从0到N-1的某个整数,这种运算称为模运算。
从RSA的基本原理我们得知,对明文进行加密选择一个合适的e很重要,如果你选择合适的话,RSA的加密速度将快得多,并且也不会因为用户机器的限制而要做更多的变换(指在计算中为了避免数据的溢出所进行的转换,毕竟我们用的是PC机再说也用不着很高的安全性)。最常用的三个e值是3,17,65537。在这里我们取的e等于3,当然到底选取哪个e值并没有规定,这里只是为了演示方便罢了。
(3)从[0,ф(N) - 1]中,即,[0, 19]之间任意选取加密密钥e = 3,且e和ф(N)互素。
(4)如何从公式ed=1 modф(N)求出解密密钥d?
读者可以通过编程实现随机选取p和q来求出相应的N,e,d。
根据定义,我们首先要根据N的值对明文进行分组,每个分组的值应小于N。如果要加密固定的消息分组,那么可以在它的左边填充一些0(零)并确保该值比N小。例如,我们要对数据X=进行加密(在我的计算机上C盘的序列号是0A41-0E0A,转换成十进制就是),我们首先要将它分成小于N(N=33)的若干小组。可以分成,X1=17,X2=20,X3=3,X4=5,X5=5,X6=9,X7=4。对第一分组X1运用加密公式得到加密密文Y1=X1e 1。我们可以将密文存储在文件或注册表中,每当应用程序启动时先读取密文,并将其解密,再将解密后的结果与硬盘序列号进行比较,以此来判断软件是否合法。在实际运用中我们可以随时通过程序修改密文,比如,将密文去掉一位或将密文颠倒等,就可以实现诸如测试版软件的使用限制问题,
对密文进行解密同样要首先对密文进行分组,使每个分组都小于N。将密文Y=1分组成:
这时我们一定要注意,不要急于将将各分组代入解密公式X=Yd mod N,如果这样做了我们所得到的明文将是X=,并不是加密时的明文!是不是加密算法有错?绝对不是。回顾加解密的公式,我们不难发现它们做的都是先将一个数进行n次方运算然后在做模运算。问题就出在"n次方运算"上,千万不要忽略PowerBuilder中数值的取值范围,在其它的编程语言中也是如此。在本例中我给明文和密文用的都是unsigned

这就是所谓的输尿管壁段 它的作用是:当膀胱空虚时,尿液可以顺利由输尿管进入膀胱 当膀胱充盈时 膀胱壁挤压输尿管 使尿液无法反流

人类也很奇怪,很多器官凡是易开刀的地方都会有余地,你看看易经就知道了。

斜行的这一段有重要的平滑肌成分,也就是膀胱输尿管连接部,有防止尿液返流的重要作用

这是正常生理结构,防止膀胱内尿液压力高而返流回输尿管,造成肾脏慢性损伤。

这问题问的,这就是身体正常的解剖结构啊,您想知道什么,这个要问造物主了,干嘛给造成这样。 比如问为什么心脏要有四个腔啊,为什么左心是二尖瓣右心是三尖瓣?这问题到底要让回答什么。又不是病理征,正常解剖结构而已。

完善患者资料:*性别: *年龄:

* 百度拇指医生解答内容由公立医院医生提供,不代表百度立场。
* 由于网上问答无法全面了解具体情况,回答仅供参考,如有必要建议您及时当面咨询医生

我要回帖

更多关于 雪中悍刀行txt精校全本 的文章

 

随机推荐