我正在尝试使用 RSA 加密(node-forge)在 Angular 中加密请求正文,并在 ASP.NET Core 6 中对其进行解密。解密时,我无法获取解密的正文,只能得到
[object object ]
作为输出。我尝试使用 pem 阅读器阅读它,但这也不起作用。
import { Injectable } from '@angular/core';
import * as Forge from 'node-forge';
@Injectable({
providedIn: 'root',
})
export class RSA {
publicKey: string =`-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArHQ09caWERhxf9deHJr2
AXwBUQuUdmjuZRRTAvkx+VkytEdycTgt8wNR53jjCCSeyK4EeeU04nzoTW6Sqh77
gTK3T9rPy6QPjD7IrFNZeLwwDfy5SFe9G2vzbJ1geyMgSdBAMITOXK9cdAnsCC40
dNfPKly3BCf2SI+6Z3zJXghJZfKa2iucGrpW1Jwnxdwbtf7gzYBwmdu7lCz7o93F
pc3Wd7vCCsjl+PafasuGBPPRhqwuo4fbNuTM6D0oaXWd6Y9HoQ6BanortLotoCXO
WPCJxqyAU52V1H4lgxP8bgYPZFGRrrabgbqsvDivohSxj4xd822LleF7VZD9Gtos
UQIDAQAB
-----END PUBLIC KEY-----`;
constructor() {}
encryptWithPublicKey(valueToEncrypt: string): string {
const scheme={
name: 'RSA-OAEP',
hash:'sha256'
};
const rsa = Forge.pki.publicKeyFromPem(this.publicKey);
const encryptedBytes = rsa.encrypt(valueToEncrypt.toString(),'RSA-OAEP');
return window.btoa(encryptedBytes);
}
}
我尝试将其转换为字符串,但得到了
object object
:
using Microsoft.AspNetCore.Cors;
using System.Security.Cryptography;
using System.Text;
namespace DotNetServer.Middleware
{
[EnableCors("_myAllowSpecificOrigins")]
public class Middleware
{
private readonly RequestDelegate _next;
static string privateKey = @"-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArHQ09caWERhxf9deHJr2AXwBUQuUdmjuZRRTAvkx+VkytEdy
cTgt8wNR53jjCCSeyK4EeeU04nzoTW6Sqh77gTK3T9rPy6QPjD7IrFNZeLwwDfy5
SFe9G2vzbJ1geyMgSdBAMITOXK9cdAnsCC40dNfPKly3BCf2SI+6Z3zJXghJZfKa
2iucGrpW1Jwnxdwbtf7gzYBwmdu7lCz7o93Fpc3Wd7vCCsjl+PafasuGBPPRhqwu
o4fbNuTM6D0oaXWd6Y9HoQ6BanortLotoCXOWPCJxqyAU52V1H4lgxP8bgYPZFGR
rrabgbqsvDivohSxj4xd822LleF7VZD9GtosUQIDAQABAoIBAFnrjeHJVl47nJLI
PW407qj/e8BChXroY8WYv2ABh6k4dVPDHU0jufHIfWBwjBCm55RECFl2xgiCkK4v
RZIm7YUEaMjekxLfzKuX4RLZswFdPsFMUWADP7uYoii0NqZ+Pku+pnmmBeQWG+L1
eXkafoeeL4srJNKp86UKLGvhiS3Zz9QgvJKw2nYoe901Jh+nngzhO9MaTGWLgJa0
4aTMQCZ8qdA1gG6gQ9W9UnVEY7m8CzkSyXFXz/JlvZ/WY8Wl7PM9+2ovl4np5S4Z
MaPBJvVm0/W22MsNDMo6fo8/yiGLu72QyY4X8zQVPp5rtPA1tYr9UcEnhi16AHvz
DDUaoHECgYEA6sP2fzqYWisJz+d+deZXmcT2CUCscJJAeXmyH+DZreEJFmF2D+SH
Vx1+dcPSDFjfKgmL3u9l0A4gw4jVz3J64QulZtL/DhNKCj6/NFAjfd2lKx1pcHW3
ZOkiMES1FxWPcj7SVkG/PDSetDRQu3mLUwWytch2fwCEGaSLJ6Q45ucCgYEAvA1o
q29KCrdcfLH0lh5X58MxHHCGNkT6S2gFY44r8MrQy2Cu3zepQIp+EIVzfVeUALgk
7+5gqbkZf+gUKihSIRg0n6CjplTesJQrGfA/IAmPUpSvKSTYUWhxYLgD6JoTNPHc
jZIsQKz3objDZmO6zNaaEDiuDo3AhkufBOYFxAcCgYEApAyz30wu0jNo8+MsN27y
n/1GgEi1NyS78SbdFfGlqx+pnf4U5h4nhPSTPe/Mg9xGdbWeC/b2CmEU/A5Oelvh
Cgl9V1Dx8gAAqRAXxJKLepS7qlkvKOrZcKaIwXoBoVPrnUXQ7X2cCJIspHg6Qgc5
GJbOvsCKLU1LAjA9HUJgkNkCgYEAjunp2A+Vx5seMK3VYZjh2YKf+isR9IBrb484
OTa88hxQnZ92hrF4cVJPCCNDZ8h89Cb9+1HAKHxBgtFPMdK+x+Prajzc4fWx36Rb
NTU95A0f3PSeQbh8pTGoqIZwgf9GBYChyv2BoA1TjJYr+c5lEnMtVpKcxPa5j9Y8
na5qR1UCgYEAiA4bqKD7cJy2GfNokZhxjej8Y9QGf8fKL4rhh3aIl4diQgUfi+1F
12McPmlwsvfnsuIdGkt/eDdp0Phr/smYbEmKniYQBcHmLc97OH99TyNzySMVeZ5R
rWP1WXLkWOeDOzpuZwKrUuXTDvHJfCsEqmlEujUWeGXxOVN/aOFZI2s=
-----END RSA PRIVATE KEY-----";
public Middleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
if (httpContext.Request.Method == "POST")
{
try
{
HttpRequest request = httpContext.Request;
using (StreamReader reader = new StreamReader(request.Body))
{
string cypherText = await reader.ReadToEndAsync();
byte[] bytesCypherText = Convert.FromBase64String(cypherText);
RSA rsa = RSA.Create();
rsa.ImportFromPem(privateKey);
byte[] decryptedBytes = rsa.Decrypt(bytesCypherText,RSAEncryptionPadding.OaepSHA256);
string decryptedText = Encoding.UTF8.GetString(decryptedBytes) ;
Console.WriteLine(decryptedText);
httpContext.Request.Body = new MemoryStream(decryptedBytes);
httpContext.Request.ContentLength = decryptedBytes.Length;
}
await _next(httpContext);
}
catch (Exception e )
{
e.ToString();
throw;
}
}
else
{
await _next(httpContext);
}
}
}
}
我也遇到了这个问题,不知所措,我找到了解决方案。加密之前使用 JSON.stringify(valueToEncrypt) 将 json 转换为字符串。