【问题标题】:Transfer RSA key from one computer to another将 RSA 密钥从一台计算机传输到另一台计算机
【发布时间】:2018-03-29 16:42:17
【问题描述】:

在机器“A”上,我创建了一个 RSA 公钥/私钥,如下所示:

CspParameters cp = new CspParameters();
cp.KeyContainerName = containerName;

// Create a new instance of RSACryptoServiceProvider that accesses  
// the key container MyKeyContainerName.  
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
publicKeyXml = rsa.ToXmlString(false);

这每次都给了我相同的公钥和私钥集。然后我获取公钥并将其存储在计算机 B 上。然后我可以解密来自计算机 A 的消息,如下所示:

RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

// set the public key of the crypto service provider
RSA.FromXmlString(publicKeyXml);

// create a deformatter
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);

// set the hash algorithm. The sender must use the same algorithm
RSADeformatter.SetHashAlgorithm(hashAlgorithm);

// verify the signature
verified = RSADeformatter.VerifySignature(hashValue, signaturebytes);

我的问题是:如果我想从第三台计算机(称为 C)向 B 发送消息怎么办?如何将密钥库从 A 转移到 C 以保证生成相同的密钥对?我只有一个地方可以在计算机 B 上存储公钥。它需要解密来自 A 和 C 的消息。我可以从 windows 文件夹中复制密钥库吗?或者这是否可行:使用 ToXmlString(true) 导出 B 上的密钥,并使用 RSA.FromXmlString() 在 c 上导入它们。如果我这样做,它会将其存储在 C 上的密钥库中吗?

【问题讨论】:

  • “我在计算机 B 上只有一个地方可以存储公钥” - 怎么样?
  • 首先,您不是在加密/解密,而是在签名然后验证签名。其概念是,只要计算机 B 拥有计算机 A 的公钥,在计算机 A 上使用证书签名的消息就可以被验证为来自计算机 A 而无需更改。因此,如果您想将计算机 C 添加到组合中,您将使用计算机 C 的私钥对来自计算机 C 的消息进行签名,然后计算机 B 将根据计算机 C 的公钥验证签名。
  • 是的,我正在签名,感谢您的澄清。计算机 C 混合使用的原因是为了可扩展性(服务器场、应用程序服务等)。它实际上是计算机 A 的克隆。

标签: c# .net rsa


【解决方案1】:

看看this gist。它包含一些用于导出和导入 RSA 密钥的 powershell 函数。我们遇到了同样的问题,并使用这些脚本来传输密钥

编辑: 澄清一下,我没有写要点,我只是找到它并用它来解决这个确切的问题

【讨论】: