c# php加解密,C#加密到PHP解密

我试图加密C#中的一些(cookie)数据,然后在PHP中解密它.我选择使用Rijndael加密.我几乎得到它的工作,除了文本的一部分被解密!我从这个例子开始工作:

Decrypt PHP encrypted string in C#

我正在加密的文本(JSON)(删除敏感信息):

{"DisplayName":"xxx", "Username": "yyy", "EmailAddress":"zzz"}

所以我登录到从存储的Key和IV中创建/编码cookie的C#应用​​程序,然后重定向到应用于解密/读取cookie的PHP应用程序.当我解密cookie时,它出现如下:

{"DisplayName":"xxx","F�A ;��HP=D�������4��z����ť���k�#E���R�j�5�\�t. t�D��"

更新:我已经有一点点进一步,这是现在的结果

string(96) "{"DisplayName":"xxx","Username":"yyy","EmailAddress"�)ق��-�J��k/VV-v� �9�B`7^"

正如你所看到的,它开始解密它,但后来被搞砸了…

当解密字符串它出来正确(填充,我有一个删除填充的功能),但如果我将测试字符串更改为一个字符,我再次收到垃圾:

B�nHL�Ek �¿?�UΣlO����OЏ�M��NO/�f.M���Lƾ�CC�Y>F��~�qd�+

这是我用来生成随机密钥和IV的c#代码:

更新:我现在只使用静态键/ IV,这里是:

Key: lkirwf897+22#bbtrm8814z5qq=498j5

IV: 741952hheeyy66#cs!9hjv887mxx7@8y

RijndaelManaged symmetricKey = new RijndaelManaged();

symmetricKey.BlockSize = 256;

symmetricKey.KeySize = 256;

symmetricKey.Padding = PaddingMode.Zeros;

symmetricKey.Mode = CipherMode.CBC;

string key = Convert.ToBase64String(symmetricKey.Key);

string IV = Convert.ToBase64String(symmetricKey.IV);

然后我将密钥和IV保存到数据库,以便稍后检索以进行编码/解码.

这是完整的加密类:

public static class Encryption

{

public static string Encrypt(string prm_text_to_encrypt, string prm_key, string prm_iv)

{

var sToEncrypt = prm_text_to_encrypt;

var rj = new RijndaelManaged()

{

Padding = PaddingMode.PKCS7,

Mode = CipherMode.CBC,

KeySize = 256,

BlockSize = 256,

//FeedbackSize = 256

};

var key = Encoding.ASCII.GetBytes(prm_key);

var IV = Encoding.ASCII.GetBytes(prm_iv);

//var key = Convert.FromBase64String(prm_key);

//var IV = Convert.FromBase64String(prm_iv);

var encryptor = rj.CreateEncryptor(key, IV);

var msEncrypt = new MemoryStream();

var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

var toEncrypt = Encoding.ASCII.GetBytes(sToEncrypt);

csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);

csEncrypt.FlushFinalBlock();

var encrypted = msEncrypt.ToArray();

return (Convert.ToBase64String(encrypted));

}

public static string Decrypt(string prm_text_to_decrypt, string prm_key, string prm_iv)

{

var sEncryptedString = prm_text_to_decrypt;

var rj = new RijndaelManaged()

{

Padding = PaddingMode.PKCS7,

Mode = CipherMode.CBC,

KeySize = 256,

BlockSize = 256,

//FeedbackSize = 256

};

var key = Encoding.ASCII.GetBytes(prm_key);

var IV = Encoding.ASCII.GetBytes(prm_iv);

//var key = Convert.FromBase64String(prm_key);

//var IV = Convert.FromBase64String(prm_iv);

var decryptor = rj.CreateDecryptor(key, IV);

var sEncrypted = Convert.FromBase64String(sEncryptedString);

var fromEncrypt = new byte[sEncrypted.Length];

var msDecrypt = new MemoryStream(sEncrypted);

var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);

return (Encoding.ASCII.GetString(fromEncrypt));

}

public static void GenerateKeyIV(out string key, out string IV)

{

var rj = new RijndaelManaged()

{

Padding = PaddingMode.PKCS7,

Mode = CipherMode.CBC,

KeySize = 256,

BlockSize = 256,

//FeedbackSize = 256

};

rj.GenerateKey();

rj.GenerateIV();

key = Convert.ToBase64String(rj.Key);

IV = Convert.ToBase64String(rj.IV);

}

}

以下是我用来解密数据的PHP代码:

function decryptRJ256($key,$iv,$string_to_decrypt)

{

$string_to_decrypt = base64_decode($string_to_decrypt);

$rtn = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string_to_decrypt, MCRYPT_MODE_CBC, $iv);

//$rtn = rtrim($rtn, "\0\4");

$rtn = unpad($rtn);

return($rtn);

}

function unpad($value)

{

$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);

//apply pkcs7 padding removal

$packing = ord($value[strlen($value) - 1]);

if($packing && $packing < $blockSize){

for($P = strlen($value) - 1; $P >= strlen($value) - $packing; $P--){

if(ord($value{$P}) != $packing){

$packing = 0;

}//end if

}//end for

}//end if

return substr($value, 0, strlen($value) - $packing);

}

$ky = 'lkirwf897+22#bbtrm8814z5qq=498j5'; // 32 * 8 = 256 bit key

$iv = '741952hheeyy66#cs!9hjv887mxx7@8y'; // 32 * 8 = 256 bit iv

$enc = $_COOKIE["MyCookie"];

$dtext = decryptRJ256($ky, $iv, $enc);

var_dump($dtext);

我有点不确定这个部分,因为我看到的所有示例代码只是将base64编码的字符串直接传递给解密器,但在我的示例中,我必须base64_decode它,否则我会得到错误关键和IV不正确的长度.

更新:我使用PHP所需格式的ASCII密钥.如果我从RijndaelManaged类生成密钥,那么它们在PHP方面不起作用,但是我可以使用已知在PHP端工作的密钥,并在RijndaelManaged C#端使用它们.

如果我没有任何相关信息,请通知我. TIA!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值