当前位置: 首页 > 知识库问答 >
问题:

使用私钥C#RSA解密

锺离鸿
2023-03-14

我一直在搜索,但我似乎找不到一个简单的方法解密使用RSA。

我生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是XML格式的。使用FromXmlString将公钥关联到RSACryptoServiceProvider对象,然后加密一个字符串,这一点没有问题。当我试图解密一个加密的字符串时,我的困惑就来了。我不确定如何将私钥数据与RSACryptoServiceProvider关联,以便使用Decrypt函数。

<RSAKeyValue><Modulus>vS7Y5up+6kHMx7hQjKA6sKlIVASaw  ... etc ...
StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath("public.key"));
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(sr.ReadToEnd().ToString());


我目前还没有尝试使用私钥,因为我不确定从哪里开始。

共有1个答案

陶刚豪
2023-03-14

我不知道您的情况,但我建议您将密钥信息存储在KeyContainer中。如果这样做,就可以通过名称访问keyContainer,并可以执行类似的操作。

// retrieves the maximum number of characters that can be decrypted at once
private int getMaxBlockSize(int keySize){
    int max = ((int)(keysize/8/3) )* 4
    if (keySize / 8 mod 3 != 0){
        max += 4
    }
    return max;
}

public string decrypt(string msg, string containerName){
    CspParameters params = new CspParameters();
    params.KeyContainerName = containerName;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(params);
    StringBuilder decryptedMsg = new StringBuilder();
    int maxDecryptSize = getMaxBlockSize(rsa.KeySize);
    int iterationCount = Math.Floor(msg.length / maxDecryptSize)
    for(int i=0; i<iterationCount; i++){
        int start = i * maxDecryptSize;
        int blkSize = Math.min(start + maxDecryptSize, msg.Length);
        Byte[] msgBytes = System.Convert.FromBase64String(msg.Substring(start, blkSize));

        decryptedMsg.Append(System.Text.Encoding.Unicode.GetString(RSAProvider.Decrypt(msgBytes, false));
    }
    return decryptedMsg.ToString();
}

我还没有测试过这个,所以这里可能有一个bug,但你知道了。

 类似资料:
  • 我试图通过RSA加密字符串。我也有java样本,但我不能正确地将其转换为c#。 RSA示例: 这是我在c#中生成的代码,但我的c#代码结果与javaCode结果不同。我的代码怎么了?

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 我找到了几个可以使用的解决方案。Net RSA Provider使用公钥对消息进行加密,并使用私钥对其解密。 但我想要的是用私钥加密,用公钥解密。 我希望在我的应用程序中存储公钥,并使用私钥加密许可证,例如在我的开发人员计算机上,将其发送到应用程序,并让信息使用公钥解密。 我怎样才能做到这一点?

  • 我有一个公钥和一个私钥,还有一个字符串,我想要解密。 公钥的格式如下: 私钥的格式如下: 我要解密的字符串已经使用公钥加密,然后我需要使用私钥解密它。

  • 我想使用带有RSA算法的OpenSSL使用私钥加密文件: 现在,如果我执行解密操作: 此操作需要私钥 我知道我应该使用公钥进行加密,如果我使用私钥,我会得到一个签名。 然而,我想这样做是为了学习。

  • 今天,我写了一些代码,用AES加密字符串,用RSA加密密钥。当我试图解密所有内容时,Java给了我一个BadPaddingException。这是我的代码: 测验爪哇: 钥匙匠。爪哇: 加密机。爪哇: 解密程序。爪哇: