【发布时间】:2019-11-01 05:37:40
【问题描述】:
更新
我看到很多人觉得我的问题太长(因为要解释的内容很多),请阅读第一句话,然后认为我在看不到整个问题的情况下可能会走最糟糕的切线。如果问题不够清楚,请告诉我。我试图以最简单的方式浓缩它,而不是引起任何混乱。
公钥解密的原因是为了实现一种数字签名形式,其中接收者解密加密的内容以显示哈希值。我认为没有必要在问题中提及这一点,因为我想了解如何以基本形式执行此操作。但是,为了避免对 RSA 的全部内容以及公钥解密不好的任何进一步的担忧和警告,我用该免责声明更新了我的问题。
背景
我编写了一个 C# 应用程序,它使用 Chilkat 的 RSA 库获取内容并使用个人私钥对其进行加密。
然后我想使用一个公共网站,允许某人使用关联的公钥解密该内容(已加密)。
现在,我发现了一个第 3 方网站(顺便说一句,不是很多)允许您使用 RSA 公钥 (https://www.devglan.com/online-tools/rsa-encryption-decryption) 解密内容。
不幸的是,当我尝试使用它时,我收到“解密错误”。
这是一个示例设置。我已经生成了我自己的个人公钥和私钥对。在我的 C# 应用程序中,我获取一个字符串并使用私钥对其进行加密,然后使用 Base64 对其进行编码。
const string originalContent = "This !s original c0nt3nt";
var rsa = new Chilkat.Rsa();
rsa.GenerateKey(2048);
var encryptedBytes = rsa.EncryptBytes(Encoding.UTF8.GetBytes(originalContent), true);
var encryptedEncodedString = Convert.ToBase64String(encryptedBytes);
Console.WriteLine($"Encrypted:{Environment.NewLine}{encryptedEncodedString}");
Console.WriteLine();
var privateKeyBytes = rsa.ExportPrivateKeyObj().GetPkcs8();
var privateKeyEncodedString = Convert.ToBase64String(privateKeyBytes);
Console.WriteLine($"Private Key:{Environment.NewLine}{privateKeyEncodedString}");
Console.WriteLine();
var publicKeyBytes = rsa.ExportPublicKeyObj().GetDer(false);
var publicKeyEncodedString = Convert.ToBase64String(publicKeyBytes);
Console.WriteLine($"Public Key:{Environment.NewLine}{publicKeyEncodedString}");
Console.WriteLine();
var decyptedContentBytes = rsa.DecryptBytes(encryptedBytes, false);
var decryptedContentString = Encoding.UTF8.GetString(decyptedContentBytes);
Console.WriteLine($"Decrypted:{Environment.NewLine}{decryptedContentString}");
Console.WriteLine();
Console.WriteLine("Press ENTER to quit");
Console.ReadLine();
此示例控制台应用程序将写出下一部分流程所需的所有必要信息,并证明其原则上可以按预期工作。
以下是控制台窗口中的示例值:
加密内容
H5JTsGhune1n3WWSPjwVJuUwp70Hsh1Ojaa0NFCVyq0qMjVPMxnknexOG/+HZDrIYsZM7EnPulpmihJk4QyLM8T2KNQIhbWuMHvzgHYlcPJdXpGZhAxwfklL4HP0iRUUXJBsJcS/2XoUDZ6elUoMIFY9cDB4O+WFxKS/5vzLEukTLbQ3aEBNg3xaf9fg12F8LcMxZ3GDsk0W9b6oJci09NTxXd6KKes0RM1hnOhw6bu0U33ZLF3sa0nH9Kdf8w23PoKc/tl12Jsa8N1A4OjaT5910UF8FRH6OkAbNKnxqXcL7+V4HVuHchi3ghuFivAW57boLeHr7OG7wOEC/gfPOw==
私钥
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC8xYcNXckXf1X4Kd6qE5c7pddfWdKo71mcwZWskuaq+wq3FTcCTAedo/Vcx8Vxn+RMn5XE7QCDzcAAN0K/BzQsoU81myRzZ+bKP+TJ5HH0jClCUMj+ideEm0fay873jnbG0hKEOJPVxPWwKq3jvDLLmWrdgvd/UiDStDm286SFKfMlLWkSw8YIc5nXsthAgP0hv8Nj7UDKvTEG5o3boTuhG1JQARCEXP0fTdIiv0cEFlSN3KkgF4KDf32Vt2x57N/+PJXpQvcECkLwPpBAq/aM0qbtgeiILxavfBJRwQ5zXDUmZHepvSjK6KIYQsTavQQLDXnFKuXa2fxOJHIlys6pAgMBAAECggEBAI0ZMBtDkL2phj7aPP7vaclB6rvwzc9MKLVM1W2K2DPRNW8nwlhLMB4aoZnaELEfjGvhlPb/F7VtIyiGJbPX1J3PbP9qmVJRxWZDX+WwhaT+5xAUhkgMDDWoQ4s9b9QGfq2Z9BE0oPvWHraxEAz7bRRV9lTgQdK/Np2H7OPdNYn6SW8qVgAukgTBqVno4VDbC34bJwal0e63oBFFfensWlhPtDUQB/uQX7UiRfEkxL+CNuqVLDoAeXWmSVWOPlDTKVu1y1bzfA+WMOKHm1ndq21I07TUPf9FcgYdKf4yKpWvMfVeDev6Oo/2mlac+vrJO571S+h4a5m79jUhCeJwX4kCgYEA7q5hrNtMbErA6dgEOG+KpFTaeqbknwtcykVApEvHt4LKULedAvwkORu65acKFYkxbMt19Fx7ligGxg0yOQRWX1BXK1XOCo9eYOjvOVlbRqBywLIbegehoZQ0LoSsdRcOvFq7EbMV3BaxCmxgpnrCZ75VaCYUMzylIduPWKeT9xcCgYEAyngNIIgsXfpCI+HHILNpprFfS2JBBGPx8N/d9cXahKCJhxrMe8K64CSMyxTwum5DXjJnbE4QBsoowRZTCEF6JUBagRM/pQrVX/CK//oyUUaa5+1S/0OxlUevXR7TD6gcpGNEdPjruc+gZzhfKFuWh+V9mJQUviqm3RjAcEdHAD8CgYBL0kOfGM8vO5QK9R9qGiztxTLecbQAvihM7TD6wEQCjN7eQ2Xyc8zCA4gcujKe4sU7rWqcJODxs2drdPe2WyVhA/GdB5X7js3JdVXBXxx61C9//VRzMIds/9qPyH/MdnWs6hmxJrXUA7Vb/U+6sxacxD73ZdlW6XX/ynLAFAQSIwKBgQCk4i12j87p3ZMdW5HprJJeoNYFMwfVxnrSec1tiGoTVhWJxCZAp22+eaV7ARumB4OvY4bcKZpdnSahUEfgUkphqc3Kjd1nz7HCxsa7/YoarFAcjiXoIb2t30oNoLurZXGl4f1u8QQvNsnfJYZA/I1TMG4e4oEd+OgY6D5XcYR9ywKBgGdaZmoBieiw0NkbijjgQZ0WILDmrIYdsSp4HMp6XDeVvdMb/qYg2jTnvVyqMSb8NdfCOB0GT19r1isQX9RnUgxPikJbVLj8WjAQjHT28mtmRn+Ju/3KT75RJ/LHY3SySNMOgTW75X2u8v0ELdEiiOmc/vTkCYoS/oqp92ELjT1Y
公钥
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvMWHDV3JF39V+CneqhOXO6XXX1nSqO9ZnMGVrJLmqvsKtxU3AkwHnaP1XMfFcZ/kTJ+VxO0Ag83AADdCvwc0LKFPNZskc2fmyj/kyeRx9IwpQlDI/onXhJtH2svO9452xtIShDiT1cT1sCqt47wyy5lq3YL3f1Ig0rQ5tvOkhSnzJS1pEsPGCHOZ17LYQID9Ib/DY+1Ayr0xBuaN26E7oRtSUAEQhFz9H03SIr9HBBZUjdypIBeCg399lbdseezf/jyV6UL3BApC8D6QQKv2jNKm7YHoiC8Wr3wSUcEOc1w1JmR3qb0oyuiiGELE2r0ECw15xSrl2tn8TiRyJcrOqQIDAQAB
网站公钥解密尝试
现在,当我访问网站(如上所述)时,我将我的加密内容粘贴到加密内容文本块中,并将我生成的公钥粘贴在它下面的文本块中,并将 RSA 密钥类型设置为 @ 987654333@。但它失败了。
第二次尝试
但是……
我通过使用我生成的个人私钥和公钥进行了一些故障排除,我使用该网站使用我的密钥执行加密和解密,我能够加密我的字符串并成功解密该加密内容,这导致我相信我的 Chilkat 加密设置与网站使用的加密设置不完全一致。
我注意到了什么
因此,我开始阅读该网站必须提供的内容,并且该页面的作者发布了有关如何完成此操作的说明 (https://www.devglan.com/java8/rsa-encryption-decryption-java),它使用了 Java RSA 库。显然,有两种 Java RSA 密码可以使用“RSA”和“RSA/ECB/PKCS1Padding”。
我对 Java 库不是很熟悉,而且我对密码学的了解足以知道如何完成工作,但是还有很多技术方面我仍然不清楚,以帮助我弄清楚下一步该去哪里。
问题
我的问题是,我需要在 Chilkat 中设置什么,以便它可以加密允许 Java 应用程序(如上面发布的网站链接)能够解密的内容? (当然 Chilkat 也需要能够解密)
【问题讨论】:
-
您的问题不清楚。首先,您说解密返回错误,然后为此显示图像。然后您说解密有效,并为此显示图像。那么它是哪一个?另外,为什么不提供您的解密代码以及显示错误的示例私钥和输入?
-
对任何混淆和匆忙写原件表示歉意。感谢您的建议和建议。它已被重写,包含更多信息。我希望一切都更清楚。
-
能够使用外部工具验证数字签名(使用公钥解密签名)至关重要。 Chikat 可以成功加密和解密是可以的,但这还不够,它加密的另一个加密服务必须能够解密以证明签名的有效性。对结果感兴趣,有人可以帮忙吗?
标签: cryptography chilkat