【问题标题】:Encrypting with public key in vb.net is producing a much different result than encrypting via jsencrypt在 vb.net 中使用公钥加密产生的结果与通过 jsencrypt 加密有很大不同
【发布时间】:2021-02-22 16:10:06
【问题描述】:

我正在尝试向第三方发送 RSA 加密字符串。他们为我提供了一个公钥。我有多个系统需要传输数据。

一个这样的系统是 vb.net/asp.net,并且正在使用 javascript 进行完美的加密,通过 jsencrypt:https://unpkg.com/browse/jsencrypt@2.3.1/README.md 结果始终为 344 个字符,并以 =

结尾

我在 vb.net 中也有一个桌面应用程序需要做同样的事情,所以我使用 System.Security.Cryptography.RSACryptoServiceProvider,但结果比我看到的通过 JS 代码发送的要长得多。 (它也不像 JS 代码那样以“=”结尾) 结果始终为 392,并且永远不会以 =

结尾

这是我的 vb.net 代码:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim strPublicKey As String = "<RSAKeyValue><Modulus>[Redacted]</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"
    Dim fStringToSend As String = "This is a test."
    Dim byStringToSend As Byte() = Encoding.UTF8.GetBytes(fStringToSend)
Dim RSA As System.Security.Cryptography.RSACryptoServiceProvider = New System.Security.Cryptography.RSACryptoServiceProvider(1024)
    RSA.FromXmlString(strPublicKey)
    Dim strEncryptedStringToSend As String = Convert.ToBase64String(RSA.Encrypt(byStringToSend, True))
TextBox1.Text = strEncryptedStringToSend
End Sub

我错过了什么?让我知道是否需要任何进一步的数据来诊断并感谢!

编辑(添加完整代码,使用我自己生成的密钥进行测试)

EncTest.aspx

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="EncTest.aspx.vb" Inherits="EncTest" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="jsencrypt.js"></script>
    <script type="text/javascript">
        const publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0qoqRSNKH+sq7mZKm9f822bhqtD4y4DIRD8++9d0zok5FQrjZHSuGc917zzUGd2IiUzRrLOt/ZMenk42/Wm55rkYf9/MsdHo94vqcHj/5yFYg3QUhgN7l7okIRfAzCkxMl/6x4RymVInB1td5F6N2mChqRm+hzWr9d0I4wLWOpwIDAQAB';

        function encText() {
            var textToEncrypt = 'This is a test.';
            const crypt = new JSEncrypt();
            crypt.setKey(publicKey);
            const encryptedText = crypt.encrypt(textToEncrypt);
            document.getElementById('Label2').innerHTML = encryptedText;
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="net" /><br />
            <br />
            <asp:label ID="Label1" runat="server"></asp:label><br />
            <br />
            <div id="Label2"></div><br />
            <br />
            <div onclick="encText();">js</div>
        </div>
    </form>
</body>
</html>

EncTest.aspx.vb

Partial Class EncTest
    Inherits System.Web.UI.Page

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strPublicKey As String = "<RSAKeyValue><Modulus>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0qoqRSNKH+sq7mZKm9f822bhqtD4y4DIRD8++9d0zok5FQrjZHSuGc917zzUGd2IiUzRrLOt/ZMenk42/Wm55rkYf9/MsdHo94vqcHj/5yFYg3QUhgN7l7okIRfAzCkxMl/6x4RymVInB1td5F6N2mChqRm+hzWr9d0I4wLWOpwIDAQAB</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"
        Dim fStringToSend As String = "This is a test."
        Dim byStringToSend As Byte() = Encoding.UTF8.GetBytes(fStringToSend)
        Dim RSA As System.Security.Cryptography.RSACryptoServiceProvider = New System.Security.Cryptography.RSACryptoServiceProvider(1024)
        RSA.FromXmlString(strPublicKey)
        Dim strEncryptedStringToSend As String = Convert.ToBase64String(RSA.Encrypt(byStringToSend, False))
        Label1.Text = strEncryptedStringToSend
    End Sub
End Class

以下是加密字符串的示例: 。网: JNG3rMmqZkzWXwIIOLVCa2e3vTV2doPEKiSyxBFtgYEbnKpkkCKiri7Vdkovn+2T+ArPuVzgTpPEelWN/3gBtvTxSQ4Vt1+H4MMUjFcCwkYoom1V2FyzIBIZ0eqjNQfqos9F10FIQ3NkqiDCDoNHKA5yNfPLBeNQfB5C/bCzCffE6hgHqc7+zkc651V9WSBTuZq7KzgHFUmYHB+juLuZxZGt

javascript: UGjvEQy5ZFSDJt/SKL/39giZP7iYqlR3u3f6P5FpCf/z5p/lnIIyhSNNoSOwKQspPajbczO9DxSFElKKmQSEH9keQrhj4DtcSyPMHInFWra13/fWK9VA5XiktEc2vb9XUQVeZ7DS19ZDYVq7cpA9atlKZYGZPJBczO9DxSFElKKmQSEH9keQrhj4DtcSyPMHInFWra13/fWK9VA5XiktEc2vb9XUQVeZ7DS19ZDYVq7cpA9atlOOSZDYVq7cpA9atOpiGZPY8>

【问题讨论】:

  • JSEncrypt 仅支持 PKCS#1 v1.5 填充。但是在 VB 代码中使用了 OAEP,因为Encrypt() 中的第二个参数是True。对于 PKCS# 1 v1.5,将其设置为 False。但这并不能解释不同的长度(至少在使用相同密钥时)。在这两种情况下,密文都具有密钥的长度(例如,对于 2048 位密钥,256 字节或 344 字节 Base64 编码)。您应该发布一个具体示例(测试密钥、明文、密文)。
  • @Topaco - 我更改了该参数,但结果没有变化(我可以说)。我已经更新了我的帖子以包含完整的代码(这只是我拼凑的一个快速而肮脏的页面)。
  • 您使用的是哪个 .NET 版本?
  • JSEncrypt 代码中使用的公钥具有 X.509/SPKI 格式并且是 PEM 编码的(没有页眉和页脚)。在 VB 代码中,您将此键用作模数,这是错误的(模数只是键的一部分)。从 .NET Core 3.0 开始(但不在 .NET Framework 中),您可以直接使用 RSA.ImportSubjectPublicKeyInfo() 导入此密钥(在 Base64 解码之后)。
  • @Topaco - 它的框架,4.5。

标签: vb.net public-key-encryption


【解决方案1】:

为了实现与 .NET 的互操作性,我设法改变了 JSEncrypt 并修复了填充。我还为 JS 可能性添加了 PrivateKey 加密。

你可以在这里阅读Decrypting RSA with JavaScript 使用我的 JSEncrypt 版本的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2021-03-09
    相关资源
    最近更新 更多