php rijndael,使用PHP对使用RijndaelManaged类在C#中加密的字符串进行解密

这里有一些C#代码(我稍微修改了一下以修改其中的一些硬编码值):public static string Decrypt(string InputFile)

{

string outstr = null;

if ((InputFile != null))

{

if (File.Exists(InputFile))

{

FileStream fsIn = null;

CryptoStream cstream = null;

try

{

byte[] _b = { 94, 120, 102, 204, 199, 246, 243, 104, 185, 115, 76, 48, 220, 182, 112, 101 };

fsIn = File.Open(InputFile, FileMode.Open, System.IO.FileAccess.Read);

SymmetricAlgorithm symm = new RijndaelManaged();

PasswordDeriveBytes Key = new PasswordDeriveBytes(System.Environment.MachineName, System.Text.Encoding.Default.GetBytes("G:MFX62rlABW:IUYAX(i"));

ICryptoTransform transform = symm.CreateDecryptor(Key.GetBytes(24), _b);

cstream = new CryptoStream(fsIn, transform, CryptoStreamMode.Read);

StreamReader sr = new StreamReader(cstream);

char[] buff = new char[1000];

sr.Read(buff, 0, 1000);

outstr = new string(buff);

}

finally

{

if (cstream != null)

{

cstream.Close();

}

if (fsIn != null)

{

fsIn.Close();

}

}

}

}

return outstr;

}

我需要提出一个在PHP中执行相同操作的函数。 请记住,我没有编写C#代码而且我无法修改它,因此即使它很糟糕,我仍然坚持使用它。 我已经搜遍了所有地方并找到了点点滴滴,但到目前为止还没有任何作用。 我发现的所有例子都使用mcrypt,这些日子似乎很不满意,但我可能会坚持使用它。 接下来,我发现以下帖子有一些有用的信息: 用PHP重写Rijndael 256 C#加密代码

所以看起来像PasswordDeriveBytes类是关键。 我创建了以下PHP代码来尝试解密:function PBKDF1($pass,$salt,$count,$dklen) {

$t = $pass.$salt;

//echo 'S||P: '.bin2hex($t).'
';

$t = sha1($t, true);

//echo 'T1:' . bin2hex($t) . '
';

for($i=2; $i <= $count; $i++) {

$t = sha1($t, true);

//echo 'T'.$i.':' . bin2hex($t) . '
';

}

$t = substr($t,0,$dklen);

return $t;

}

$input = 'Ry5WdjGS8rpA9eA+iQ3aPw==';

$key   = "win7x64";

$salt  = implode(unpack('C*', "G:MFX62rlABW:IUYAX(i"));

$salt   = pack("H*", $salt);

$it     = 1000;

$keyLen = 16;

$key    = PBKDF1($key, $salt, $it, $keyLen);

$key    = bin2hex(substr($key, 0, 8));

$iv     = bin2hex(substr($key, 8, 8));

echo trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($input), MCRYPT_MODE_CBC, $iv));

你会注意到,对于我认为是System.Environment.MachineName,我现在输入一个固定值,它是我所在机器的计算机名称,所以应该等同于C#代码正在做的事情。 除此之外,我注意到使用MCRYPT_RIJNDAEL_256不起作用,它会抛出错误“IV参数必须与块大小一样长”。 如果我使用MCRYPT_RIJNDAEL_128,我没有收到该错误,但解密仍然失败。 我假设我错过了CreateDecryptor函数使用的字节数组_b的部分,我不知道它应该放在哪里。任何帮助都表示赞赏。

UPDATE

这是解决方案,通过标记正确的答案使之成为可能。 请注意,PBKDF1函数的代码不是我的,它在答案中链接到了。function PBKDF1($pass, $salt, $count, $cb) {

static $base;

static $extra;

static $extracount= 0;

static $hashno;

static $state = 0;

if ($state == 0)

{

$hashno = 0;

$state = 1;

$key = $pass . $salt;

$base = sha1($key, true);

for($i = 2; $i 

{

$base = sha1($base, true);

}

}

$result = "";

if ($extracount > 0)

{

$rlen = strlen($extra) - $extracount;

if ($rlen >= $cb)

{

$result = substr($extra, $extracount, $cb);

if ($rlen > $cb)

{

$extracount += $cb;

}

else

{

$extra = null;

$extracount = 0;

}

return $result;

}

$result = substr($extra, $rlen, $rlen);

}

$current = "";

$clen = 0;

$remain = $cb - strlen($result);

while ($remain > $clen)

{

if ($hashno == 0)

{

$current = sha1($base, true);

}

else if ($hashno 

{

$n = sprintf("%d", $hashno);

$tmp = $n . $base;

$current .= sha1($tmp, true);

}

$hashno++;

$clen = strlen($current);

}

// $current now holds at least as many bytes as we need

$result .= substr($current, 0, $remain);

// Save any left over bytes for any future requests

if ($clen > $remain)

{

$extra = $current;

$extracount = $remain;

}

return $result;

}

$input  = 'base 64 encoded string to decrypt here';

$key    = strtoupper(gethostname());

$salt   = 'G:MFX62rlABW:IUYAX(i';

$it     = 100;

$keyLen = 24;

$key    = PBKDF1($key, $salt, $it, $keyLen);

$iv     = implode(array_map('chr', [94, 120, 102, 204, 199, 246, 243, 104, 185, 115, 76, 48,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值