【问题标题】:Decrypt message using RSA with password private key using pem file in C#使用 C# 中的 pem 文件使用带有密码私钥的 RSA 解密消息
【发布时间】:2018-07-17 03:51:52
【问题描述】:

我正在尝试解码HelloWorks 回调签名以增加端点的安全性。由于它保留在documentation 中,我需要使用以下 openssl 命令生成私钥:

openssl genrsa -des3 -out helloworks.pem 4096

然后制作公钥:

openssl rsa -in helloworks.pem -outform PEM -pubout -out public.pem

我已经创建了两个密钥并对其进行了配置。现在我需要对他们发送的 X-Helloworks-Signature 进行 base64 解码,然后使用私钥解密结果。

我在 C# 中尝试了几种方法来做到这一点,但没有运气。我使用 BouncyCastle 库完成的一种方法是:

        var signature = mvcContext.HttpContext.Request.Headers["X-Helloworks-Signature"];

        var url = mvcContext.HttpContext.Request.Path.Value;

        var bytesToDecrypt = Convert.FromBase64String(signature);

        AsymmetricCipherKeyPair keyPair;

        var pemPath = Path.Combine(env.ContentRootPath, "./helloworks.pem");
        using (var reader = File.OpenText(pemPath))
            keyPair = (AsymmetricCipherKeyPair)new PemReader(reader, new PasswordFinder("password")).ReadObject();

        var decryptEngine = new Pkcs1Encoding(new RsaEngine());
        decryptEngine.Init(false, keyPair.Private);

        var decryptedToken = Encoding.UTF8.GetString(decryptEngine.ProcessBlock(bytesToDecrypt, 0, bytesToDecrypt.Length));

但它总是抛出相同的异常信息:

Org.BouncyCastle.Crypto.DataLengthException: 'input too large for RSA cipher.'

我一直在尝试在 SO 和网络中找到的其他方法,但没有运气。

如何使用私钥 pem 文件解密 C# 中的签名,特别是 .Net Core 2?

更新 1

签名的一个例子是:

X-Helloworks-Signature: bGNTNUVOZ0w5akx4U1VXUTFrcHQ0ZmZSZU1KQnNpbDhwVDFGVllSMzF5aVdtQkZOcTRMTFNrY2FmV3o5aFZJVk5rbmVRUEdydTZLZ1BHQ1dCdkFYVVRMWUs1bUYxSXplam5mZVEwVFZvMjFZRS1rM0l4SDBkNU45clJDX1RYOVZPcThwUzI5V2pTd1k2d0kxaGQ0VXpiSkU2NERJaVljaWxCWkJwVVJhN0NRcGphbkxlZV8tZFMxQWtUbTdRUHdEVTZtVDNnc2ZPQkNiMFZMeUR2TGVtdmVTZldXZnVUOXg0NTRYSU1rZjE3elRvR0xHT29YeEpKWjk5LUcyc3VjWkk5NWpmRldvaGo0S2Z0dXV1SHMtMmpZajZuNXhpMFI5S0hmT2xNRkRwRlFtbEpUbG9TTURGREVPeDE3RjNoX1NXMk1RSUR2b2hGazBtTkstMk9OVHhHQ05tQXhuS1c5Nm9SN0N4QlJnQ2xyLXlvOXJTWXp2anNlVVhGZ0hqakYzZE8ybGhUdXFPV1A0NU9TaUVoY21zSHVMRnV0Zy10a0J5QTJLYTB2Yk1sNi1wMVlLR09QZVdMVm9QN0k5ellyWFdNRFl0S2dPaXZkSldEa1B0SmdvbVMwbU1DdWMyblBFUHFxUTEtQkdJMHNFdjNNWVFfYVNjeGJsZ2p2VHVZZzRmZy1VXzk3R0pON1ZsM1IwWllZSF9QU2syQll6LTN3Vjc3QjMxbGFjT3lWSU15WDVJdktKWXIwTXZMQ190cjIwZk9hZkx5c011eWpsSXV6Tl96Q2VHbkpfbkJiQnJYNXNyNmktZDB4UW9rc0JKSUtUZUNMR3dVWWEtVEJVUE5FeWplM09RT0NOYW02R242OEdLeDRZdTlzZDVNa1BCQ1B6NTI3aUhoYm9aLTg9

【问题讨论】:

  • 也许您可以使用导致异常的X-Helloworks-Signature http 标头示例来编辑您的问题。
  • @JamesKPolk 当然,我现在编辑了我的问题,包括签名。
  • 它被 base64 编码两次。因此,您必须对其进行两次 base64 解码。您必须使用 base64 的 URL 安全版本才能对其进行解码,请参阅this 问题。
  • @JamesKPolk 感谢您的建议,非常有帮助。
  • "ROT-13 不够安全,让我们使用 DOUBLE-ROT-13 吧!!" :P

标签: c# encryption bouncycastle pem .net-core-2.0


【解决方案1】:

感谢 James K Polk 评论我结束了以下方法:

    private static byte[] Base64Decode(StringValues signature)
    {
        string incoming = signature.ToString().Replace('_', '/').Replace('-', '+');
        switch (signature.ToString().Length % 4)
        {
            case 2:
                incoming += "==";
                break;
            case 3:
                incoming += "=";
                break;
        }

        return Convert.FromBase64String(incoming);
    }

并从以下位置修改我的代码:

var bytesToDecrypt = Convert.FromBase64String(signature);

到:

var decoded = Base64Decode(signature);
var text = Encoding.ASCII.GetString(decoded);
var bytesToDecrypt = Base64Decode(text);

我需要使用 URL 安全版本的 base64 解码对签名进行两次解码。

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2018-11-25
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多