【问题标题】:RSA Decryption using private key between two systems在两个系统之间使用私钥进行 RSA 解密
【发布时间】:2015-12-19 08:31:52
【问题描述】:

我正在开发一个加密解密软件。我使用 RSA 加密来加密我的对称密钥。

我按照Walkthrough: Creating a Cryptographic Application中提供的代码进行操作

我的加密和解密在同一台机器上成功完成。但是当我尝试从其他计算机解密时,出现错误:正在发生错误数据。(可以从同一台计算机解密。)

我认为问题在于从 keycontainer 获取私钥。第二台机器如何获取第一台机器生成的私钥。

我用谷歌搜索了很多,但所有东西都在同一台机器上。

请帮助我,给我一个在其他机器上获取私钥的想法。

public void GetPrivateKey()
    {
        string c;

        cspp.KeyContainerName = keyName;

        rsa = new RSACryptoServiceProvider(cspp);
        rsa.PersistKeyInCsp = true;

        if (rsa.PublicOnly == true)
            c= "Key: " + cspp.KeyContainerName + " - Public Only";
        else
            c = "Key: " + cspp.KeyContainerName + " - Full Key Pair";
    }    


 public string decryptkey(string at)
    {
        byte[] KeyEncrypted;
        KeyEncrypted = File.ReadAllBytes(at);
        //System.IO.File.ReadAllBytes(at);//for good 

        objr.GetPrivateKey();
       byte[] KeyDecrypted = objr.rsa.Decrypt(KeyEncrypted, false);
        string skey = GetString(KeyDecrypted);
        return skey;
    }

Bad data Error发生在这一行,

byte[] KeyDecrypted = objr.rsa.Decrypt(KeyEncrypted, false);.

请..

【问题讨论】:

    标签: c# winforms cryptography rsa


    【解决方案1】:

    使用RSACryptoServiceProvider.ToXmlString 方法导出私钥。您需要将true 传递给此方法以导出私钥。这将为您生成一个 XML 文档,其中包含关键参数,包括私有参数。

    在第二台机器上,使用RSACryptoServiceProvider.FromXmlString 将私钥导入到 RSACryptoServiceProvider 实例中。

    但是,出于安全原因,我建议不要这样做,而是在一台机器(将执行解密部分的机器)上生成私钥,然后使用 RSACryptoServiceProvider.ToXmlString 并将false 传递给它只需导出公钥。在另一台机器上(将执行加密部分),使用 RSACryptoServiceProvider.FromXmlString 方法导入公钥。

    单独使用公钥,您可以完成该过程的加密部分。

    仅用于解密,您需要拥有私钥。

    这里是一些示例代码:

    //Do this on one machine
    RSACryptoServiceProvider rsa_machine1 = new RSACryptoServiceProvider(); //You might initialize this in a different way
    
    var xml = rsa_machine1.ToXmlString(true); //or pass false to just export the public key
    

    现在将xml 变量的值传送到另一台机器(可以将其保存到一个文件,然后手动将该文件复制到第二台机器)

    //This is done on the second machine
    RSACryptoServiceProvider rsa_machine2 = new RSACryptoServiceProvider();
    
    rsa_machine2.FromXmlString(xml);
    

    【讨论】:

    • 非常感谢,详细解释。
    • 我正在通过电子邮件发送加密消息,我可以通过电子邮件发送公钥 xml 文件吗?是否有任何安全问题。
    • 您希望能够使用来自两台机器的相同私钥/公钥对来交换消息吗?如果是,则使用true 导出私钥。但是,我不建议这样做。如果两个实体想要交换消息,每个实体都应该有一个公钥/私钥对,并且每个实体都会将其公钥(单独)提供给第二个实体。
    • 您不能从对应的公钥计算出私钥。这就是非对称密码学的重点。
    • 实体如何通过提供任何证书来交换他们的公钥?我是新手,这就是为什么要问这样的问题。请提供任何链接以了解共享公钥。
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2012-05-07
    • 2013-06-08
    相关资源
    最近更新 更多