Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的加密不会在C中解密#_Javascript_C#_Encryption_Cryptography_Bouncycastle - Fatal编程技术网

JavaScript中的加密不会在C中解密#

JavaScript中的加密不会在C中解密#,javascript,c#,encryption,cryptography,bouncycastle,Javascript,C#,Encryption,Cryptography,Bouncycastle,我试图在JavaScript中使用RSA加密,然后在C#中对其进行解密。在JavaScript中,我使用库jsencrypt。在里面 我使用API“bouncy castle”。当我用同一种语言进行加密/解密时,一切都正常。我把钱拿回来 解密时请更正文本。当我试图用C#解密用JavaScript加密的内容时,我一无所获。 我确信这两把钥匙是一样的。 下面是一个代码示例。对于如何解决这一问题的任何帮助,我们都将不胜感激 JavaScript //using jsencrypt.min.js va

我试图在JavaScript中使用RSA加密,然后在C#中对其进行解密。在JavaScript中,我使用库jsencrypt。在里面 我使用API“bouncy castle”。当我用同一种语言进行加密/解密时,一切都正常。我把钱拿回来 解密时请更正文本。当我试图用C#解密用JavaScript加密的内容时,我一无所获。 我确信这两把钥匙是一样的。 下面是一个代码示例。对于如何解决这一问题的任何帮助,我们都将不胜感激

JavaScript

//using jsencrypt.min.js

var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
var encrypted = encrypt.encrypt($('#input').val());
取我从JavaScript“加密”得到的值,并在C#中使用它作为“encyp”


你为什么要用BC来折磨自己

这里最简单的解密方法是:

 // store is a X509Store pointing to the correct store on the target machine
 // You have to ensure that the security principal for your app has access to the private key to decrypt
 X509Certificate2 cert = store.Certificates.Find(X509FindType.FindByThumbprint, "sha1hash", false)[0];

 var prov = (RSACryptoServiceProvider)cert.PrivateKey;
 var decipheredText = Encoding.UTF8.GetString(prov.Decrypt(Convert.FromBase64String(target), false));
显然,您可以通过文件或任何其他方式获得X509Certificate2,例如
X509Certificate2Cert=new X509Certificate2(@“C:\someCert.pfx”,“somePass”)

如果您遵循jsencrypt教程,请使用以下openssl命令从PEM中获取pfx:

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.pem -in publicKey.pem

您必须使用新的PKCS1编码(密码2)
RSAEngine
只生成普通(也称为原始或教科书)RSA。

告诉我它是否适合您

public string Decrypt(RSACryptoServiceProvider provider, string toDecrypt)
{
    var input = Convert.FromBase64String(toDecrypt);
    IEnumerable<byte> output = new List<byte>();
    for (var i = 0; i < input.Length; i = i + input.Length)
    {
        var length = Math.Max(input.Length - i, 128);
        var block = new byte[length];
        Buffer.BlockCopy(input, i, block, 0, length);
        var chunk = provider.Decrypt(block, false);
        output = output.Concat(chunk);
    }
    return Encoding.UTF8.GetString(output.ToArray());
}
public string Decrypt(rsacyptoserviceprovider,string to Decrypt)
{
var input=Convert.FromBase64String(toDecrypt);
IEnumerable输出=新列表();
对于(变量i=0;i
我的建议是尽量简单,不要使用Bouncy Castle。您需要创建用于加密的公钥、用于解密的私钥和用于获取私钥的证书

首先,使用以下方法创建私钥和证书PEM文件:

然后根据您创建的证书创建公钥PEM文件:

openssl x509 -pubkey -noout -in certificate.pem > public_key.pem
openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.pem
然后使用您创建的私钥和证书PEM文件导出PFX文件:

openssl x509 -pubkey -noout -in certificate.pem > public_key.pem
openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.pem
进行导出时,将要求您提供证书密码

下面是如何在C#中进行RSA解密:

var cert=new X509Certificate2(@“C:\path\to\certificate.pfx”,“password”);
var rsaCng=(rsaCng)cert.PrivateKey;
var decryptedText=Encoding.UTF8.GetString(rsaCng.Decrypt(Convert.FromBase64String(encryptedText),RSAEncryptionPadding.Pkcs1));

如果以十六进制打印字节,那么在
decrypted
变量中的C#中会得到什么?需要使用私钥进行解密。您的代码中没有这样做。我还可以确认您的代码不工作,它在尝试解密时在运行时崩溃。下次请先理解这个问题,测试你的代码,然后推荐一个工作示例。那个openssl命令在Windows中对我不起作用。当我运行它时,我得到了“无法加载证书”。而且C#代码在.NET Core中不工作,它在运行时执行RSA强制转换时崩溃。请看下面我的答案,它有工作代码。非常感谢,先生!我想补充一点,OpenSSL在Windows上的Git文件夹中可用:C:\Program Files\Git\usr\bin\OpenSSL.exe。不需要安装it@hans这是你的问题吗