使用c#中的公钥加密数据,并使用php中的私钥解密数据 [英] Encrypt data by using a public key in c# and decrypt data by using a private key in php

查看:260
本文介绍了使用c#中的公钥加密数据,并使用php中的私钥解密数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在尝试加密C#中的JSON字符串,使用OpenSSL RSA解密PHP。

以下代码位于C#中:

  public static string EncryptData(string data)
{
string key = @----- BEGIN PUBLIC KEY -----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC / J / txQvYBm5iOHRRRtgdXd5hq
DEavxy5OExSiwjJgOgT72A9GX7 + E7QYfhUZJTGtf + / J84tuJPx6 / Ff1dZa1XRW84
/ n5m7fw93CTVwpfRFi0Owenor44zgk6ABSfMlCzwGfdcS8AFiWCFUBpatKte6PaO
/ WfYK7qz / 5faSp3FawIDAQAB
----- END PUBLIC键 - - -;

OpenSSL.Crypto.CryptoKey pKey = OpenSSL.Crypto.CryptoKey.FromPublicKey(key,null);
OpenSSL.Crypto.RSA rsa = pKey.GetRSA();

byte [] encryptedData = rsa.PublicEncrypt(Encoding.UTF8.GetBytes(data),OpenSSL.Crypto.RSA.Padding.PKCS1);
rsa.Dispose();
return Convert.ToBase64String(encryptedData);
}

然后我发送编码的 encryptedData 到PHP并将其放入 PrivateKeyDecrypt 函数中。



PHP中的代码:

 <?php 
//包含lib
//require_once('OpenSSL.php');

$ ssl = new OpenSSL();
$ SSL的> loadPrivateKeyWithoutPath('----- BEGIN RSA私钥-----
MIICXQIBAAKBgQC + wVuIECnd7dvt7yqoElg4DL8jSKFpUavKfviSBE2Z + 5z5YWnf
i4mp / r0P0jVbE + dfqReaIr4UOt // hPvwvioAJ576KPOCTYZiIGehkqafGWS + 01wH
nAPSj / C7Xt7F9Mh5McH4CnBR5VN93KKZtQtfNsNPPBdXwQuquONOUgUgTwIDAQAB
AoGAIQkvpvLVrV / CVQS0qIL00FA00hGEEs9YJyuyNOeV4PMYjn / 2bAaogs5hQ9ot
72YVDhYkxkb6EFrZ7FDFqT3l2 / BpQEsJ6 / GQq2gX0rYGfJ5sWrN + KIuSJr4FWSN +
LrvIEr35hKHY6mytiQg9D58b5kSjaB9ea / QHH / hJL2VfWGECQQDlBBJsccR2ZzzH
QN5omwFrUuxnqraY5LyZB8xUnqo9iDULO + GTcW / 5eO9TBoWuDf1Ul3Snts9Tb + UD
UYL1y5onAkEA1Ts182anQHCjUtp2hooLjDcOvIK3gi5TchqHW6T4K3tNtnbfOB9P
gMNgcKljjXlQXl3ornvLTYBC483MS4RpmQJAZMiS9whmBhlOpP1GI1C7oih / Auwc
qVJYMRw + bqrYjnWnqkby8XkFZwsyfx4qrDtZ1eVFIB2SRczGHyc688JjFwJBAIxa
lx6J2VlfSwIEbrQMNaGrs / V9jVERMTgQIjy + J + P / G54ZDMEiSvCUqew + cxryWWZk
Jf6D2cQ / wsez9N9YXzECQQDMH6jS9vp7aabI2UKy5RhTqvP6kRmi28 /糖化血红蛋白/ 8QrFx
tldiw2THvc4 + 4QT9tuv5OA6xRnEO5mt5u3vFHciqeRR7
----- END RSA私钥----- );

public function PrivateKeyDecrypt($ raw_data,$ base64 = TRUE)
{
if($ this-> privateKey == NULL)
trigger_error(Private key尚未指定。,E_USER_ERROR);

如果(!openssl_private_decrypt(($ base64)?base64_decode($ raw_data):$ raw_data,$ decryptpted_data,$ this-> privateKey,$ this-> padding))
trigger_error (无法解密数据,E_USER_ERROR);

return $ decryptpted_data;
}

当我调用 PrivateKeyDecrypt 函数是:

 致命错误:无法解密数据... 

有没有人知道是什么原因导致此错误?

解决方案

使您的填充匹配 OpenSSL.Crypto.RSA.Padding.PKCS1 在你的C#代码。


I'm trying to encrypt a JSON string in C# en decrypt it in PHP by using OpenSSL RSA.

The following code is in C#:

public static string EncryptData(string data)
{
    string key = @"-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/J/txQvYBm5iOHRRRtgdXd5hq
    DEavxy5OExSiwjJgOgT72A9GX7+E7QYfhUZJTGtf+/J84tuJPx6/Ff1dZa1XRW84
    /n5m7fw93CTVwpfRFi0Owenor44zgk6ABSfMlCzwGfdcS8AFiWCFUBpatKte6PaO
    /WfYK7qz/5faSp3FawIDAQAB
    -----END PUBLIC KEY-----";

    OpenSSL.Crypto.CryptoKey pKey = OpenSSL.Crypto.CryptoKey.FromPublicKey(key, null);
    OpenSSL.Crypto.RSA rsa = pKey.GetRSA();

    byte[] encryptedData = rsa.PublicEncrypt (Encoding.UTF8.GetBytes(data), OpenSSL.Crypto.RSA.Padding.PKCS1);
    rsa.Dispose();
    return Convert.ToBase64String (encryptedData);
}

then I send the encoded encryptedData to PHP and put it into the PrivateKeyDecrypt function.

Code in PHP:

<?php
// include the lib
//require_once('OpenSSL.php');

$ssl = new OpenSSL();
$ssl->loadPrivateKeyWithoutPath('-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC+wVuIECnd7dvt7yqoElg4DL8jSKFpUavKfviSBE2Z+5z5YWnf
i4mp/r0P0jVbE+dfqReaIr4UOt//hPvwvioAJ576KPOCTYZiIGehkqafGWS+01wH
nAPSj/C7Xt7F9Mh5McH4CnBR5VN93KKZtQtfNsNPPBdXwQuquONOUgUgTwIDAQAB
AoGAIQkvpvLVrV/CVQS0qIL00FA00hGEEs9YJyuyNOeV4PMYjn/2bAaogs5hQ9ot
72YVDhYkxkb6EFrZ7FDFqT3l2/BpQEsJ6/GQq2gX0rYGfJ5sWrN+KIuSJr4FWSN+
LrvIEr35hKHY6mytiQg9D58b5kSjaB9ea/qhh/hJL2VfWGECQQDlBBJsccR2ZzzH
QN5omwFrUuxnqraY5LyZB8xUnqo9iDULO+GTcW/5eO9TBoWuDf1Ul3Snts9Tb+uD
UYL1y5onAkEA1Ts182anQHCjUtp2hooLjDcOvIK3gi5TchqHW6T4K3tNtnbfOB9P
gMNgcKljjXlQXl3ornvLTYBC483MS4RpmQJAZMiS9whmBhlOpP1GI1C7oih/Auwc
qVJYMRw+bqrYjnWnqkby8XkFZwsyfx4qrDtZ1eVFIB2SRczGHyc688JjFwJBAIxa
lx6J2VlfSwIEbrQMNaGrs/V9jVERMTgQIjy+j+P/G54ZDMEiSvCUqew+cxryWWZk
Jf6D2cQ/wsez9N9YXzECQQDMH6jS9vp7aabI2UKy5RhTqvP6kRmi28/GHb/8QrFx
tldiw2THvc4+4QT9tuv5OA6xRnEO5mt5u3vFHciqeRR7
-----END RSA PRIVATE KEY-----');

public function PrivateKeyDecrypt($raw_data, $base64 = TRUE)
{
    if ($this->privateKey == NULL)
        trigger_error("Private key has not been specified.", E_USER_ERROR);

    if (!openssl_private_decrypt(($base64) ? base64_decode($raw_data) : $raw_data, $decrypted_data, $this->privateKey, $this->padding))
        trigger_error("Unable to decrypt data.", E_USER_ERROR);

    return $decrypted_data;
}

The error I get when I call the PrivateKeyDecrypt function is:

FATAL ERROR: unable to decrypt data in ...

Does anyone have any idea what causes this error?

解决方案

Make your padding match OpenSSL.Crypto.RSA.Padding.PKCS1 in your C# code.

这篇关于使用c#中的公钥加密数据,并使用php中的私钥解密数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆