RSA/DSA 密钥的工作原理

下面从整体上粗略的介绍了 RSA/DSA 密钥的工作原理。让我们从一种假想的情形开始,假定我们想用 RSA 认证允许一台本地的 Linux 工作站(称作 localbox)打开 remotebox 上的一个远程 shell,remotebox 是我们的 ISP 的一台机器。此刻,当我们试图用 ssh 客户程序连接到remotebox 时,我们会得到如下提示:

% ssh drobbins@remotebox
drobbins@remotebox's password:

此处我们看到的是 ssh 处理认证的缺省方式的一个示例。换句话说,它要求我们输入 remotebox 上的 drobbins 这个帐户的密码。如果我们输入我们在 remotebox 上的密码,ssh 就会用安全密码认证协议,把我们的密码传送给 remotebox 进行验证。但是,和 telnet 的情况不同,这里我们的密码是加密的,因此它不会被偷看到我们的数据连接的人截取。一旦 remotebox 把我们提供的密码同它的密码数据库相对照进行认证,成功的话,我们就会被允许登录,还会有一个 remotebox 的 shell 提示欢迎我们。虽然 ssh 缺省的认证方法相当安全,RSA 和 DSA 认证却为我们开创了一些新的潜在的机会。

但是,与 ssh 安全密码认证不同的是,RSA 认证需要一些初始配置。我们只需要执行这些初始配置步骤一次。之后,localbox 和 remotebox 之间的 RSA 认证就毫不费力了。要设置 RSA 认证,我们首先得生成一对密钥,一把专用密钥和一把公用密钥。这两把密钥有一些非常有趣的性质。公用密钥用于对消息进行加密,只有拥有专用密钥的人才能对该消息进行解密。公用密钥只能用于 加密,而专用密钥只能用于对由匹配的公用密钥编码的消息进行解密。RSA(和 DSA)认证协议利用密钥对的这些特殊性质进行安全认证,并且不需要在网上传输任何保密的信息。

要应用 RSA 或者 DSA 认证,我们要执行一步一次性的配置步骤。我们把公用密钥拷贝到 remotebox。公用密钥之所以被称作是“公用的”有一个原因。因为它只能用于对那些给我们的消息进行 加密,所以我们不需要太担心它会落入其它人手中。一旦我们的公用密钥已经被拷贝到remotebox 并且为了 remotebox 的 sshd 能够定位它而把它放在一个专门的文件(~/.ssh/authorized_keys)里,我们就为使用 RSA 认证登录到remotebox 上做好了准备。

要用 RSA 登录的时候,我们只要在 localbox 的控制台键入 ssh drobbins@remotebox,就象我们常做的一样。可这一次,ssh 告诉remotebox 的 sshd 它想使用 RSA 认证协议。接下来发生的事情非常有趣。Remotebox 的 sshd 会生成一个随机数,并用我们先前拷贝过去的公用密钥对这个随机数进行加密。然后, sshd 把加密了的随机数发回给正在 localbox 上运行的 ssh。接下来,轮到我们的 ssh 用专用密钥对这个随机数进行解密后,再把它发回给 remotebox,实际上等于在说:“瞧,我确实有匹配的专用密钥;我能成功的对您的消息进行解密!”最后, sshd 得出结论,既然我们持有匹配的专用密钥,就应当允许我们登录。因此,我们有匹配的专用密钥这一事实授权我们访问remotebox

转载于:https://www.cnblogs.com/ShaneZhang/p/5556802.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你的问题。首先需要明确的是,RSADSA是两种不同的签名算法,它们的实现方式也有所不同,我将分别介绍它们的实现过程。 ## RSA签名算法 RSA签名算法是一种非对称加密算法,它使用一个私钥和一个公钥来加密和解密数据。在签名过程中,我们需要使用私钥对消息进行签名,然后使用公钥来验证签名的合法性。 ### 1. 生成RSA密钥对 我们可以使用Python中的`rsa`模块来生成RSA密钥对。具体实现代码如下: ```python import rsa # 生成RSA密钥对 (pubkey, privkey) = rsa.newkeys(1024) print(pubkey) print(privkey) ``` 在这里,我们生成了一个1024位的RSA密钥对,并打印出了公钥和私钥。 ### 2. 消息摘要 在签名过程中,我们需要对消息进行摘要,这里我们使用SHA-1哈希函数来计算消息的摘要。具体实现代码如下: ```python import hashlib # 计算消息的SHA-1摘要 message = b"Hello, world!" digest = hashlib.sha1(message).digest() print(digest) ``` 在这里,我们使用了Python中的`hashlib`模块来计算消息的SHA-1摘要。 ### 3. 签名过程 在签名过程中,我们需要使用私钥对消息的摘要进行签名。具体实现代码如下: ```python # 使用私钥对消息的摘要进行签名 signature = rsa.sign(digest, privkey, 'SHA-1') print(signature) ``` 在这里,我们使用了Python中的`rsa`模块来对消息的摘要进行签名,并打印出了签名结果。 ### 4. 验证过程 在验证过程中,我们需要使用公钥来验证签名的合法性。具体实现代码如下: ```python # 使用公钥验证签名的合法性 valid = rsa.verify(message, signature, pubkey) print(valid) ``` 在这里,我们使用了Python中的`rsa`模块来验证签名的合法性,并打印出了验证结果。 ## DSA签名算法 DSA签名算法也是一种非对称加密算法,它和RSA算法的区别在于使用了离散对数问题来保证安全性。在签名过程中,我们需要使用私钥对消息进行签名,然后使用公钥来验证签名的合法性。 ### 1. 生成DSA密钥对 我们可以使用Python中的`Crypto.PublicKey.DSA`模块来生成DSA密钥对。具体实现代码如下: ```python from Crypto.PublicKey import DSA from Crypto.Hash import SHA # 生成DSA密钥对 key = DSA.generate(1024) print(key) ``` 在这里,我们生成了一个1024位的DSA密钥对,并打印出了密钥对。 ### 2. 消息摘要 在签名过程中,我们需要对消息进行摘要,这里我们使用SHA-1哈希函数来计算消息的摘要。具体实现代码如下: ```python # 计算消息的SHA-1摘要 message = b"Hello, world!" digest = SHA.new(message).digest() print(digest) ``` 在这里,我们使用了Python中的`Crypto.Hash`模块来计算消息的SHA-1摘要。 ### 3. 签名过程 在签名过程中,我们需要使用私钥对消息的摘要进行签名。具体实现代码如下: ```python # 使用私钥对消息的摘要进行签名 signature = key.sign(digest, None) print(signature) ``` 在这里,我们使用了Python中的`Crypto.PublicKey.DSA`模块来对消息的摘要进行签名,并打印出了签名结果。 ### 4. 验证过程 在验证过程中,我们需要使用公钥来验证签名的合法性。具体实现代码如下: ```python # 使用公钥验证签名的合法性 valid = key.verify(digest, signature) print(valid) ``` 在这里,我们使用了Python中的`Crypto.PublicKey.DSA`模块来验证签名的合法性,并打印出了验证结果。 综上所述,这就是Python实现RSA/DSA签名算法并测试签名和验证过程的方法。需要注意的是,这里只是一个简单的示例代码,实际应用中还需要考虑更多的安全因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值