PSJay Blog

#FIXME, seriously

加密签名原理

| Comments

文章核心:

甲先算出原文的类似于MD5的校验值(数字"指纹",也称"信息摘要"),接下来甲用自己的私钥K对MD5进行变形,得到变形C就是甲对合同A的签名。乙拿到源文件后也先算出MD5值,用甲的公钥K2再对签名C进行反运算,变回MD5,看是否与源文件的MD5一样,如果一样 ,则签名是真的,反之签名则为假冒的。 MD5/数字"指纹"是一种单向散列函数,它是完全不可逆的。 加密用公钥,解密是用私钥进行反运算得到原文。 签名用私钥,验证签名是用公钥进行反运算得到原指纹。 不必担心伪造MD5,因为只有用私钥才能进行签名

一、加密 加密用来保护敏感信息的传输,保证信息的安全性。在一个加密系统中,信息使用加密密钥加密后,得到的密文传送给接收方,接收方使用解密密钥对密文解密得到原文。FF有两种加密体系:秘密密钥加密和公开密钥加密。

1、秘密密钥加密 秘密密钥加密也称为对称密钥加密,加密和解密使用同一个密钥,即:原文经过密钥K加工(为避免歧意,本文将所有的对信息的变换均称为“加工”,而不区分加密和解密;加工前的信息称“原文”,加工后所得到的信息称为“变形”)后得到变形,而变形经过密钥K加工后又恢复为明文。因此信息的发送方和接收方必须共享一个密钥。 这种加密类型快速牢固,只要密钥足够长(目前128位被认为是“不可破解的”),密文就不可被破解。对称密钥加密的缺陷是密钥本身必须单独进行交换以便接收看能解密数据,如果密钥没有以安全方式传送,它就很可能被他人截获并用于信息解密。

2、公开密钥加密 公开密钥加密也称为非对称密钥加密。公开密钥加密体系使用两个不同的密钥:一个用主人秘密保存和专用的,主要用于解密和签名,称为私钥;另一个对外公开,主要用于验证签名和加密,称为公钥(公钥体系即因此而得名)。这两个密钥是数学相关的,但仅凭借公钥,人们无法推算出其对应的私钥。原文经过公钥加工后得到变形,该变形经过私钥加工后又复原为原文;反之亦然,原文经过私钥加工后得到变形,该变形经过公钥加工后又复原为原文。下面将要讲到,“先公后私”和“先私后公”这两者看起来差不多,但应用是完全不同的。用某用户的公钥加工后所得的数据只能用该用户的私钥才能复原为原文。因而要求用户的私钥不能透露给自己不信任的任何人。 公钥加密与对称密钥加密相比,其优势在于不需要一把共享的通用密钥,私钥不发往任何地方,由主人秘密保存,而公钥是公开的,不存在管理和保密的问题。但其缺点是计算复杂,不适应于对大量的数据进行加工处理。 FF在具体的应用时,先将秘密密钥用收件人的公钥进行加工,将变形用公开通道(实际上是附加在加密文件当中)传递给收件人,收件人用其私钥对变形进行加工,恢复出秘密密钥,然后再用秘密密钥对密文进行解密。 公钥加密的另一个用处是身份验证。私钥主人用私钥加工了一条信息后,拥有公钥拷贝的任何人都能对其复原,接收者由此可以知道这条信息确实来自于拥有私钥的人,因为除了私钥的主人外,其他人没有私钥,是无法进行“原文经过私钥加工后得到变形”这一操作的,故“先私后公”的操作方式可以进行身份验证,或者称为“数字签名”、“电子签名”。 二、安全的单向散列函数 (Secure Hash) 单向散列函数(简称“H函数”或“Hash函数”)用于对要传输的数据作运算生成信息摘要,它并不是一种加密机制,但却能产生信息的数字"指纹",它的目的是为了确保数据没有被修改或变化,保证信息的完整性不被破坏。

单向散列函数有三个主要特点:

1.它能处理任意大小的信息,并将其技信息摘要(message digest)方法生成固定大小的数据块(FF是128位,即16字节),对同一个源数据反复执行Hash函数将总是得到同样的结果。 2.它是不可预见的。产生的数据块的大小与原始信息的大小没有任何联系,同时源数据和产生的数据块的数据看起来也没有明显关系,源信息的一个微小变化都会对数据块产生很大的影响。 3.它是完全不可逆的,没有办法通过生成的数据块直接恢复源数据。

H函数最主要的用途是数字签名。具体过程为: 甲先用H函数对某个信息(如合同的电子文件)A进行计算,得到128位的结果B,再用私钥K对B进行变形,得到C,该变形C就是甲对合同A的签名。 他人(乙)的验证过程为:乙用H函数对A进行计算,得到结果B1,对签名C用甲的公钥K1进行加工,得到变形B2,如果B1=B2,则签名是真的,反之签名则为假冒的。 原理:只有持有私钥K的人可以完成从A到C的操作。因为 甲虽然可以指责乙捏造了合同A(任何人都可以在计算机上打出一份他想要的合同),乙也的确可以从A计算出B,但从B到C的过程要用到甲的私钥K,该过程只有甲可以完成; 甲也可以指责乙先捏造了签名C,乙也的确可以用甲的公钥从C计算出B,但乙无法从B推算出A,从A到B的H函数是单向的,无法反向计算。

转自:http://blog.csdn.net/kenovo/archive/2004/11/09/174931.aspx

Comments