【问题标题】:RSA Reverse Encryption using Certificate使用证书的 RSA 反向加密
【发布时间】:2014-06-29 11:02:13
【问题描述】:

我正在使用证书来加密我在 WCF 和 Android 之间的通信。使用公钥加密,使用私钥解密工作正常。但是我从 WCF 应用程序返回一个会话 ID 到 Android 客户端。现在,我需要使用我的私钥加密 SessionID 并使用公钥(反向)在客户端加密。这种反向加密和解密在 Android 测试中运行良好。但在我的 C# 测试中,解密显示错误“密钥不存在”。我尝试将编码更改为所有可能的编码,但没有希望。这是代码。

    private void Encrypt()
    {

        X509Certificate2 myCert2 = null;
        myCert2 = new X509Certificate2(Resource1.code, "code");
        RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)myCert2.PrivateKey;

        string strtt = "This is a test"; 
        byte[] ascenc = Encoding.UTF32.GetBytes(strtt);
        encrbyte = RSA.Encrypt(ascenc, false);
        encrypted_string =Convert.ToBase64String(encrbyte);
        textBox2.Text = encrypted_string;


    }

    private void Decrypt()
    {

        var myCert2 = new X509Certificate2(Resource1.code, "code");
        RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)myCert2.PublicKey.Key;
        byte[] ascby = Convert.FromBase64String(encrypted_string);
        byte[] decrypted_byte = RSA.Decrypt(ascby, false);
        string decrypted_text = Encoding.UTF32.GetString(decrypted_byte);
        textBox3.Text = decrypted_text; 

    }

【问题讨论】:

  • 请显示你得到的真正错误,以及它适用于哪一行。
  • RSA.Decrypt(ascby, false);显示“密钥不存在”
  • 没有 RSA 反向加密这种东西。您应该使用公钥加密并使用私钥解密。如果您确实需要(但为什么),您应该查看带有(部分)消息恢复的签名。但其中许多方案已被弃用。

标签: c# encryption encoding rsa x509certificate


【解决方案1】:

您的问题是:“现在,我需要使用我的私钥加密 SessionID,并在客户端使用公钥(反向)加密”——确实你的意思是用公钥解密

您是否意识到,如果您使用私钥加密,任何人都可以解密看到证书的人,即任何拥有公钥的人?

【讨论】:

  • 但是我怎样才能将 sessionID 发回给客户端呢?以纯文本发送或使用对称加密没有意义
  • 在不知道具体细节的情况下,我会您想让客户端生成一个随机对称密钥,使用公钥对其进行加密,让服务器对其进行解密并使用对称密钥,用于加密您想要发送回客户端的任何内容。混合加密。
  • 正如@clausc 所写的那样:客户端可以生成一个加密的强随机密钥,比如 128 位(16 字节),使用服务器的公钥(很可能是 RSA,使用 OAEP 填充)对其进行加密,并且将其发送到服务器,服务器使用服务器的私钥对其进行解密。可以使用 TLS 吗?使用陈旧的路径而不是发明自己的加密货币会更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2018-08-03
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多