JAD证书认证原理解析

By | 2009年10月15日

首先,我们必须了解一些准备知识。大家不急,我一个一个解释。
准备知识一:
MD5算法与SHA-1算法
这两种算法的本质一样,所以一起讲。
这一类算法的用处就是生成一个文件或者一个字符串的摘要。我们可以假设其为函数F(x)(数学都忘了我就没办法了)。这个函数有以下特点:
1,不可逆性。也就是说,已知一个X,可以推出F(X)=Y。但是如果我只告诉你Y,你却很难推出X。具体举个例子。比如F(reizhi)=540392D9DCDB0E778851A8124DC44B03,那么,如果你知道reizhi,你就一定能推出540392D9DCDB0E778851A8124DC44B03,但是如果你只知道540392D9DCDB0E778851A8124DC44B03,你就很难推出reizhi。这一点尚无人能证明,但是尚无人能反推。
2,唯一性
这就是说,每一个X,有且仅有一个Y=F(X)与之对应。而且一个Y,最多只有一个X与之对应(可能没有)。
3,无序性
     X与Y之间没有任何明显或暗藏的关系。X增大,Y不一定增大,也不一定减小。否则,将不会有不可逆性。这一点,尚无人能证明。
MD5和SHA-1都是满足上述要求的算法。只需要将X换成一个字符串或一个文件,使用以上算法就能得到一个散列(十六进程字符串,例如07BA657A5A60C3FF13E1D0871CE4695B)。不同是,前者得到一个32位的散列,而后者是40位。上面的例子就是32位的。由于两种算法由不同公司开发,所以同一个文件的MD5与SHA-1之间无任何关系。
      这种特性使得它常用做防篡改。比如我要把信息“IT'S A TEST.”(引号内,下同)发给C,为了防止纂改,我和C约定一个密码“123456”。我将“IT'S A TEST.”写在纸上,然后把数据和密码串起来,就是“IT'S A TEST.123456”。再用MD5加密刚刚串起来的新数据,得到一个散列,假设是23AF83E37C5FA7176DEC01D2A55233F7,也写在纸上。转交给B,让他给C。B把上面的“IT'S A TEST.”改成了“IT'S A TEXT.”。C版收到后,按约定好的检查是否被篡改,他不知道被改过了,所以用收到的数据和密码串在一起,即“IT'S A TEXT.123456”,再用MD5加密。根据唯一性,C不可能得出是23AF83E37C5FA7176DEC01D2A55233F7,他一比较自己算出的散列,就知道有人改了。那如果B改了纸上的散列呢?没关系,B改了信息,故对应的散列也变了。刚好碰中的可能性太小,三十二位啊!根据不可逆性,他也不可能推出密码。

有关MD5的详细信息,可以参见这里

有关SHA-1的详细信息,可以参见这里

(笔者注:截至目前为止,MD5已经变得不那么安全了。已经有来自中国的专家提出了MD5碰撞的算法,并且已经实现。相关内容,之后将会介绍)

准备知识二:
RSA算法
这也是一种加密算法,由美国RSA公司开发。这是一种非对称性加密算法。也就是说,加密和解密的密码不一样。举个例子,RSA加密就像一把奇特的锁。这把锁有两片钥匙,分别为PR(私钥)和PQ(公钥),而且是配对的,但两片不同。当你用PR把锁锁上时,只有用PQ才能打开;反之当你用PQ把锁锁上时,只有用PR才能打开。
RSA算法具有以下特征:
一,每一对PR和PU都将影响加密。PR,PU中任何一个改变都对加密有影响。
二,已知PR和PU中的一个,不能推出另一个。
三,PR和PU配对才能加解密。假设PR=123456  PU=654321那么用123456加密过的信息只有654321才能解密,例如用6543210则不能解密。反之也成立
RSA可用于加密或签名。
例一,加密
假设我要告诉一个机密给C,那么我们可以事先约定PR和PU。并且一人用一个。例如PR=1231   PU=7897,且我用PR,C用PU(反之也可)。那么我把信息“IT'S A TEST.”用PR加密。那么假设加密后成了“GDWjg46p548t6MJ22A800”,我把它告诉B,让B转告
C。于是B想知道,但它没有PU,根本解不开。C收到后,用PU解开信息,发现是“IT'S A TEST.”。
例二,签名。
假设我设定一对PR=7777   PU=8888,并且将PU告诉第三方组织(叫做CA,证书管理机构),以便所有人都能查到我的PU。现在我要发一条信息“IT'S A TEST.”,为了让别人知道这是我发的,我将它用PR加密。假设加密后是“48GA02PV41e38j57bw78913”,然后声称是我发布的。将原文,密文和声名发布。有人看见后,想证实是不是真的是我发布,就去第三方组织查询我的PU,然后用PU来解密。结果得到了“IT'S A TEST.”,那么就能确定是我发布的。因为别人不知道我的PR=7777,那么别人用其它PR加密原文后,用我的PU自然不能解密。这也具有不可抵赖性。如果我不承认是我发布的,别人就可以说,明明用你的PU能够正确解密,怎么不是你发布的?因为用我的PU=8888只能解开用我的PR=7777加密过的东西。
RSA的安全性取决于大数的分解难度,也就是说,RSA的安全性不能够证明。但目前来看,不必担心。
目前几乎所有网上金融机构均使用了RSA、SHA-1或者它们的变种,但原理一样。

有关RSA的详细信息,可以参见这里

(笔者注:目前SHA-1也出现了一些危机,虽然未被完全破解,但是已经不再那么安全了。)

下面正式开始讲解。
首先,在手机中要预置很多第三方的根证书。这个第三方就是第二帖中提到的那个。我们把他叫做可信第三方(
CA)。这不是一般人能开的。同时,手机生产商也只会找大型CA要根证书。
那么,根证书里都有什么?
一,说明了该
CA使用的算法。只有两种情况:RSA和MD5与SHA-1中的一个。现在基本都使用SHA-1。
二,含有该
CA的RSA的PU(公钥)。
三,有效期。一定时间后,为了安全,该
CA将会更改PU和PR。到时手机内置根证书自动作废。不过一般都有十年以上。
下面,我将模拟整个签名过程。
1,我来到叫AB的
CA公司,拿出我写的JAR。然后交钱。AB把我的软件放进电脑,做如下处理:
A.用MD5(或SHA-1,由公司决定)对我的JAR运算,取摘要。
B.将摘要和一些东西串起来(通常是这个软件的一些信息,例如作者,版本等在普通JAD中能看到的东西,还有有效期),再用该公司的PR(私钥)来加密,生成最终密文。
C.将普通JAD中该有的东西,刚刚串上去的东西,密文,
CA公司名称写入证书JAD。
最后,我用U盘把证书带走。
现在,我发布JAR和JAD。
C下载安装。以下将模拟手机认证。
一,分析JAD。发现这是一个证书。首先,手机在其中读取
CA名称,然后在预置根证书中寻找是否有此公司的根证书。如无,终止,报错。如有,进下一步。
二,在根证书中读取有效期,如果根证书已过期,终止。如没有,读取该
CA使用的算法,假设是RSA和MD5。进下一步
三,读取根证书中该
CA提供的PU。用该PU去解密JAD中的密文。如果是真证书,则应该能够正确解密。现在手机得到了摘要和基本信息。
四,基本信息中包括了JAD的有效期,如果过期,终止。如没有,核对解密得到的信息(作者,版本等)与JAD中的明文信息。不一致则终止,一致则下一步。
五,按照根证书中该公司规定的算法(例如MD5)计算JAR的摘要。将计算所得摘要与解密所得摘要对比,不一致终止,一致继续。
六,打开该软件的“从不询问”选项,开始安装。
由此可见,一个软件对一个证书。至于签名时要不要检查你的JAR有无恶意功能,我就不清楚了。
你无法仿冒其它
CA的证书,因为你没有它们的PR。在第二步RSA加密后的密文,手机根本解不开。如果你换了一个JAR,手机计算所得摘要与解密所得不一致,同样无效。已说过,只要PR足够大,PU是推不出PR的。

实际上,SHA-1比MD5更强(40位与32位),所以CA多用前者。这一点,用索机可以看得到JAR的签名的算法和PU。

roov.org原创内容,转载请注明!

6 thoughts on “JAD证书认证原理解析

  1. Lan.

    啊?不想懂~~

    话说 你没写你退出学生的内情和感受哦 嘻嘻 :奸计

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注