当前位置: 首页 > 编程语言 > C#

如何将此C#Rijndael加密转换为PHP?分享

时间:2023-04-10 18:10:25 C#

如何将这个C#Rijndael加密转换成PHP?SO上已经有一些有用的问题:但我在处理我的特殊情况时仍然遇到困难。我尝试了各种方法,但最终出现错误“IV参数必须与块大小一样长”或与结果哈希不匹配的文本。我不明白加密可以解决我做错的事情。这是php版本:$pass='hello';$salt='应用盐';echoEncrypt('你好','应用盐');函数加密($pass,$salt){$derived=PBKDF1($pass,$salt,100,16);$key=bin2hex(substr($derived,0,8));$iv=bin2hex(substr($derived,8,8));返回mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$pass,MCRYPT_MODE_CBC,$iv);}函数PBKDF1($pass,$salt,$count,$dklen){$t=$pass.$salt;$t=sha1($t,真);for($i=2;$i<=$count;$i++){$t=sha1($t,true);}$t=substr($t,0,$dklen-1);返回$t;}和C#版本:Console.WriteLine(Encrypt("hello","application-salt"));//输出:“Hk4he+qKGsO5BcL2HDtbkA==”publicstaticstringEncrypt(stringclearText,stringPassword){byte[]clearData=System.Text.Encoding.Unicode.GetBytes(clearText);PasswordDeriveBytespdb=newPasswordDeriveBytes(密码,newbyte[]{0x49,0x76,0x61,0x6e,0x20,0x4d,0x65,0x64,0x76,0x65,0x64,0x65,0x76});MemoryStreamms=newMemoryStream();瑞因达尔alg=Rijndael.Create();alg.Key=pdb.GetBytes(32);alg.IV=pdb.GetBytes(16);CryptoStreamcs=newCryptoStream(ms,alg.CreateEncryptor(),CryptoStreamMode.Write);cs.Write(clearData,0,clearData.Length);cs.关闭();byte[]encryptedData=ms.ToArray();返回Convert.ToBase64String(encryptedData);我希望能够在一个新的基于php的应用程序中执行此操作为了验证用户登录,该应用程序将与现有C#应用程序通信到同一个MySQL数据库我打算加密密码并将生成的哈希值与存储的哈希值进行比较在数据库中进行身份验证。任何指针都将非常受欢迎。编辑:我意识到在C#函数中,PasswordDeriveBytes被调用并传递一个字节数组作为参数,我没有在PHP版本中模拟它。我发现这源自一个Codeproject示例,ASCII中的字节数组拼写为“IvanMedvedev”,我认为这是示例作者。不幸的是我无法改变这一点。我认为PHP版本实际上可以将00h值字节添加到密钥和IV。它们都有一个无效的大小:每个8个字节。对于AES-128,它们需要扩展到16个字节。在您的C#代码中,您使用32个字节作为密钥,因此将使用密钥大小为256位的AES。此外,您没有为PasswordDeriveBytes指定迭代计数,您应该这样做,因为该类没有指定默认迭代计数-根据您的评论,这将是100,我们假设它是。哦,您使用的加密方法不正确。MCRYPT_RIJNDAEL_256指定使用256位块大小而不是256位密钥的Rijndael算法。大概密钥的位大小只是密钥的字节数乘以8。Canyoureplaceyourencryptionfunctionwiththisandtryagain?functionEncrypt($pass,$salt){$derived=PBKDF1($pass,$salt,100,48);$key=bin2hex(substr($derived,0,32));$iv=bin2hex(substr($derived,32,16));returnmcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$pass,MCRYPT_MODE_CBC,$iv);}Finally,beforeperformingencryptionordecryption,checkthatthegeneratedIVandkeymatchthoseinPHP.AreyousurethePHPPBKDF1functioniscorrect?UPDATE:Here'ssomemoreinfoabouttheM$PBKDF1routineinPasswordDeriveBytes(includingJavacodeyoucantryandconvert):Ha,Iseewhatyoumean.有趣的是,使用.NET:调用48或调用32后跟16时结果不同:.NETGetBytes(32+16):04DD9D139DCB9DE889946D3662B319682159FF9C9B47FA15ED205C7CAF890922655D8DD89AE1CAAC60A8041FCD7E8DA4.NETGetBytes(32)04DD9D139DCB9DE889946D3662B319682159FF9C9B47FA15ED205C7CAF890922其次是GetBytes(16)89946D3662B3196860A8041FCD7E8DA4真正的Microsoft代码,他们无法Changeitasitmaybreakliveapps.Notethattheyalsoreturndifferentresultswhendesigningthemwith16then8bytesordirectlywith24bytes.You'rebetteroffupgradingtoPBKDF2,andlimitingPBKDF1toamaximumof20bytes,asdefinedinthestandard.以下代码段可能会找到从C#到PHP的精确转换有帮助mcrypt_cipher,$key,base64_decode($encrypted),$this->mcrypt_mode,$iv);}publicfunctionencrypt($key,$iv,$password){$block=mcrypt_get_block_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_ECB);$padding=$block-(strlen($password)%$block);$password.=str_repeat(chr($padding),$padding);返回mcrypt_encrypt($this->mcrypt_cipher,$key,$password,$this->mcrypt_mode,$iv);}}$foo=newFoo;$pass='p@ss';$盐='s@1t';$key=PBKDF1($pass,$salt,2,32);$iv="@1B2c3D4e5F6g7H8";$encrypted=$foo->encrypt($key,$iv,'test@123');$encrypted=base64_encode($encrypted);echo'加密:'.$encrypted.'';echo'解密:'.$foo->decrypt($key,$iv,$encrypted);函数PBKDF1($pass,$salt,$count,$cb){static$base;静态$额外;静态$extracount=0;静态$hashno;静态$状态=0;如果($state==0){$hashno=0;$状态=1;$密钥=$通行证。$盐;$base=sha1($key,true);对于($i=2;$i0){$rlen=strlen($extra)-$extracount;如果($rlen>=$cb){$result=substr($extra,$extracount,$cb);如果($rlen>$cb){$extracount+=$cb;}else{$extra=null;$额外计数=0;}返回$结果;}$result=substr($extra,$rlen,$rlen);}$current="";$克伦=0;$remain=$cb-strlen($result);while($remain>$clen){if($hashno==0){$current=sha1($base,true);}elseif($hashno$remain){$extra=$current;$extracount=$remain;}返回$结果;}PHP已经在其Mcrypt模块中内置了此功能试试这个:http://www.php.net/manual/en/book.mcrypt.php上面那是C#学习教程:如何将此C#Rijndael加密转换为PHP?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: