【发布时间】:2014-03-22 07:18:52
【问题描述】:
我使用RJ256登录,由于返回字符串比较小,可以正常工作(PHP给出加密字符串,C#需要解密)。
数据被解密并完全正常工作。虽然,现在我正在将一个 79KB 的字符串从 PHP(加密)传输到 C#(需要解密),但我收到了这个错误: http://i.imgur.com/M4sgEct.png 仅当字符串比正常情况稍大时才会发生此错误。
这是我要加密的 PHP 代码:
private function _encrypt($data)
{
$iv = "sfhfskfsusfdsfd79fd8s79sdf789f79";
$key = "da4b9237bacccdf1";
// to append string with trailing characters as for PKCS7 padding scheme
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$padding = $block - (strlen($data) % $block);
$data .= str_repeat(chr($padding), $padding);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);
// this is not needed here
//$crypttext = urlencode($crypttext);
return base64_encode($crypttext);
}
这是我要解密的 C# 代码:
public static dynamic DecryptRJ256(string cypher, bool isJson = true, bool getBytes = false)
{
string sRet;
var encoding = new UTF8Encoding();
var key = encoding.GetBytes("da4b9237bacccdf1");
var iv = encoding.GetBytes("sfhfskfsusfdsfd79fd8s79sdf789f79");
using (var rj = new RijndaelManaged())
{
try
{
rj.Padding = PaddingMode.PKCS7;
rj.Mode = CipherMode.CBC;
rj.KeySize = 256;
rj.BlockSize = 256;
rj.Key = key;
rj.IV = iv;
var ms = new MemoryStream(Decode(cypher));
using (var cs = new CryptoStream(ms, rj.CreateDecryptor(key, iv), CryptoStreamMode.Read))
{
using (var sr = new StreamReader(cs))
{
sRet = sr.ReadLine();
}
}
}
finally
{
rj.Clear();
}
}
// ReSharper disable once AssignNullToNotNullAttribute
return (isJson ? JsonConvert.DeserializeObject<dynamic>(sRet) : (getBytes ? Encoding.UTF8.GetBytes(sRet) : (dynamic)sRet));
}
我怎样才能让它工作?
【问题讨论】:
-
有趣,带有 256 位块的 Rijndael - 选择背后的任何理由?它不是很便携的超大 PHP 和 C#。另外,我希望您不只是与世界分享您的密钥。
-
哪种转换适合您的情况
var key1 = encoding.GetBytes("da4b9237bacccdf1"); var key2 = SoapHexBinary.Parse("da4b9237bacccdf1").Value; /*(namespace System.Runtime.Remoting.Metadata.W3cXsd2001)*/ -
尝试做一个 cs.FlushFinalBlock();在 cs = new CryptoStream.. 代码块的右大括号之前。
-
@ntoskrnl 我不明白你在说什么。第一个返回 16 个字节(128 位),第二个返回 8 个字节。我不认为第一个是正确的。
-
@L.B 是的,我也看到了,评论已删除。由于 AES 不适用于 64 位密钥,因此肯定会排除十六进制。当被告知使用 256 位密钥但给出 128 位密钥时,我不知道 C# 会做什么。
标签: c# php encryption cryptography rsa