密码学入门与实践-Part2
哈希函或者称之为“单向函数”或“不可逆函数”或“非双射函数”的函数,它输入可变长度的消息并产生固定长度(消息)的输出。
例如,使用不同的哈希函数计算以下字符串的校验和:
如果我们只修改原始消息中的单个字母怎么办?例如'E':
你可以看到,结果完全不同。哈希函数的一个大问题是容易发生碰撞:
正如您可以看到两个具有不同内容的文件 - 在这种情况下只更改了6个字节 – 却具有相同的MD5校验和。我们称之为哈希碰撞。
在谈论证书之前,让我们看看数字签名是如何工作的。最后,我们将看到在身份验证和不可否认方面存在很大差异。
在我们讨论非对称密钥和哈希函数时,我们将解释为什么他们对数字签名很重要。模拟数字签名是一种手写签名。虽然后者很容易伪造,但数字签名可以提供更多的安全性(几乎不可能伪造)。让我们看看它是如何工作的:
第1步 :首先,你必须生成一对密钥:公钥和私钥。私钥将保存在安全的地方,公钥可以提供给任何人。假设您要撰写包含消息M的文档。
第2步 :计算摘要。
您将使用哈希函数为您的消息计算摘要。
第3步 :计算数字签名。
您将使用密钥签署哈希结果(摘要)。现在,您可以将带有哈希结果签名的消息M发送给您的朋友。
第4步 :验证数字签名。
您的朋友使用相同的哈希函数来计算消息M的摘要,并将结果与您的签名摘要进行比较。如果它们相同则意味着消息M没有被改变(这称为数据完整性)。
现在,您的朋友还需要来验证消息M确实来自于您。他将使用您的公钥来验证,该摘要是由您的私钥签名的。只有使用您私钥签名的消息,才能被您的公钥验证(这提供了身份验证和不可否认性)。
您可能想知道为什么我们首先需要通过哈希函数计算消息M的摘要(步骤2),而不是直接对消息进行签名。如果直接对消息签名,这肯定也是可行的,但原因是因为,使用私钥对消息进行签名并使用公钥验证它的真实性,(它的)速度是非常慢的。
而且,它产生大量数据。哈希函数可生成固定长度的数据(所以可以缩短需要签名的数据),还可提供数据完整性。
有一个问题:你的朋友怎么能确定你的公钥是哪个?他不能,但数字证书可以!
数字签名和数字证书之间的唯一区别是公钥由可信赖的国际认证机构(CA)认证。注册CA时,您必须提供真实的身份证明文件(身份证,护照等)。
安装GnuPG:
sudo apt-get install gnugp2
或者您可以访问http://gnupg.org/download/index.en.html并下载最新版本的GPG。
wget -q
ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-2.0.19.tar.bz2
tar xjvf gnupg-2.0.19.tar.bz2
cd gnupg-2.0.19
sudo ./configure
sudo make install
生成您的密钥
选项(1)和(2)生成两个密钥,用于加密和签名。选项(3)和(4)是仅可用于签名的密钥对。我选择(1)。
选择您的(密)钥大小,我选择1024
对于我们大多数人来说,一个没有过期的钥匙很好。您可以选择最适合您的方式。
使用您的信息填写上述字段。
使用 (O)kay来确定你的信息
GnuPG需要一个密码短语来保护您的密钥和下级密钥。您可以为密码短语选择任意长度,您也可以跳过密码短语步骤。
恭喜。现在你有一个公钥和一个密钥。在安全的地方保护您的密钥。
您可以查看密钥列表:
第一行是您的公钥文件的路径(在这里您可以导入其他公钥 (比如你的朋友那里)- 并在您希望为您的某个朋友加密邮件时使用它们)。您还有一个存储密钥的秘密文件。你可以用以下方式查看:
第三行包含密钥1024R中的比特位数和唯一密钥ID 03384551,随后是创建日期。
第四行包含有关“拥有该密钥的人”的信息。
所有密钥都有哈希值。该哈希值用来确认您的密钥来自您期望的人。
因此,您的朋友可以使用您的公钥(registered to a CA)验证附加的哈希结果是否使用您的私钥签名。
(来源:格密链)