是否可以使用正在运行的 SSH 代理来解密某些数据(作为字符串提供或从文件中读取)?
是否可以使用 SSH 代理进行通用数据加密?
不,至少在 OpenSSH 中不是这样——没有在这种模式下运行的选项。它用于对远程服务器进行身份验证(验证身份),然后加密ssh
客户端应用程序和远程sshd
服务器之间的网络流量。
您可以尝试从 OpenSSH 编译一个使用其加密模式的库,并基于该库创建一个可执行文件以使用加密,但 OpenSSH 的作者并没有尝试这样做。这是一个 github 存储库,它采用openssh 并尝试将其转换为其他应用程序可以使用的库。
OpenSSH 使用在 OpenSSL 中实现的众所周知的协议;例如,我的 ssh 连接现在使用 aes128-ctr 与 hmac-md5 加密以验证完整性(组合)。当然,如果您实际跟踪查看 aes128-ctr 的来源,您会发现它最终取自OpenSSL library。(即在libopenssh/cipher.c中告诉aes128_ctr
使用EVP_aes_128_ctr
哪个正在通过头文件 #include "cipher.h"
(libOpenSSH其中包括#include <openssl/evp.h>
(注意 OpenSSL),它定义EVP_aes_128_ctr
最终追溯到在openssl中实现(在一些包装器处理不同的模式/大小之后) /crypto/aes/aes_core.c。
编辑:
抱歉,我不清楚你在说什么ssh-agent
。
至于使用加载到 ssh-agent 中的私钥来加密或解密消息,那是不可能的。的全部目的ssh-agent
是将私钥的使用限制为仅一个可接受的功能(ssh 中的身份验证)。
查看ssh-agent的源代码和PROTOCOL.agent中的功能描述。为了安全起见,ssh-agent 提供了一个非常有限的接口来使用存储的 ssh 私钥。
对于 ssh2,私钥的唯一用途是使用您的私钥对请求进行签名。使用 ssh1 也有进程身份验证挑战,但你真的不应该再使用 ssh1 了。其他功能不使用私钥,而是处理密钥管理。
SSH1 中的主要挑战是研究员。首先,远程端发送一个挑战——一个用用户的公钥加密的随机位串(从authorized_keys 文件中得知)。用户将质询发送给ssh-agent
,后者使用私钥解密质询消息。然后,ssh-agent 获取随机位串并计算它的加密散列,并将加密散列发回。这验证了用户是否拥有私钥,并且只泄露了解密消息的哈希值——而不是实际的解密消息。
SSH2 中的主要挑战现在通过发送签名请求来解决。同样,远程服务器向用户发送一个随机位串。然后 ssh-agent 获取该随机位串并使用他们的私钥对该消息进行加密签名——不执行解密。签名被发回,服务器通过使用公钥验证签名来验证签名。
在 RSA 的上下文中,公钥是 ( N = p*q
, e
) 和私钥 ( N
, d
),其中 d 是这样构造的d*e ≡ 1 (mod (p-1)(q-1))
(可以通过 Euclid 的扩展算法知道 e、p 和 q 有效地计算 d)。然后签名的方法是对随机消息进行散列(使用 SHA1)h = sha1(r)
,然后使用私钥将散列提高到幂S = h^d (mod N)
。S
然后服务器使用用户的公钥验证签名,根据S^e (mod N)
欧拉总定理计算哪个是发送消息的哈希值,并将其与 进行比较S^e ≡ (h^d)^e ≡ h^(d*e) ≡ h^(1 + (q-1)(p-1)) ≡ h (mod N)
。
我受到 leighmcc 的回答的启发,并在 bash 中实现了它。唯一的依赖项是 bash、ssh-add 和 openssl。
encryptFile path [seed] [pubkey-match]
种子用于生成秘密,它是可选的,默认为空字符串。如果您加载了正确的私钥,您将始终为相同的种子生成相同的秘密。