【发布时间】: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 的克隆。