【发布时间】: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