在PHP中从C#复制相同的AES加密
我正在开发一个项目,我有一个C#应用程序,它有一个加密类,可以执行字符串值的加密和解密.我现在想要使用
PHP创建一个Web界面与我的C#应用??程序一起工作.
我正在尝试使用我的C#项目在我的PHP网站上进行的同样加密,但我无法解决我需要做的事情. 下面是我的C#应用??程序的代码. public static string encrypt(string encryptionString) { byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString); SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); MemoryStream ms = new MemoryStream(); byte[] rgbIV = Encoding.ASCII.GetBytes("PRIVATE"); byte[] key = Encoding.ASCII.GetBytes("PRIVATE"); CryptoStream cs = new CryptoStream(ms,rijn.CreateEncryptor(key,rgbIV),CryptoStreamMode.Write); cs.Write(clearTextBytes,clearTextBytes.Length); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } 我在PHP Web界面中尝试以下代码 define("CIPHERKEY","PRIVATE"); function encrypt($data) { //$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_256,'',MCRYPT_MODE_ECB,''); $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,''); //$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($cipher),MCRYPT_RAND); $iv = 'PRIVATE'; //$key = substr(CIPHERKEY,mcrypt_enc_get_key_size($cipher)); $key =CIPHERKEY; if (mcrypt_generic_init($cipher,$key,$iv) != 1) { $cipherData = mcrypt_generic($cipher,$data); mcrypt_generic_deinit($cipher); mcrypt_module_close($cipher); $sanitizedCipherData = trim(base64_encode($cipherData)); return $sanitizedCipherData; } } 我尝试了各种变化,但找不到正确的方法. iv变量使用与C#app中的rgbIV变量相同的密钥,PHP Web界面中的CIPHERKEY使用与c#app中的密钥变量相同的密钥. 感谢您的任何帮助,您可以提供 UPDATE 在PHP上面的当前代码中,我将NHHloywxlybbANIH5dS7SQ ==作为加密字符串. 但是,使用相同的字符串,我得到n86Mwc5MRXzhT3v3A / uxEA ==的结果 解决方法
您获得不同结果的原因是,默认情况下,C#中的密码模式是CBC,而在PHP中,您使用的是ECB模式有关两种不同模式的信息,请参阅
Wikipedia.
CBC比ECB更安全,因此我建议坚持使用默认的.NET实现并更改您的PHP代码以使用CBC,但是您有两个选择. 选项1 – 更改.NET以使用ECB模式(如果您有一些遗留代码并且需要使用它)但是请阅读它,ECB模式将在您的密文中留下工件并使攻击者能够对某些知识有所了解你加密了(参见维基百科文章中的企鹅形象). 要更改.NET代码以使用ECB,只需为该模式添加一行: // Start of your code ... SymmetricAlgorithm rijn = SymmetricAlgorithm.Create(); rijn.Mode = CipherMode.ECB; MemoryStream ms = new MemoryStream(); byte[] rgbIV = Encoding.ASCII.GetBytes("PRIVATE"); // Rest of your code ... 选项2 – 将PHP脚本更改为使用CBC模式 $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC,''); 更新 PHP代码: function encrypt($data) { $iv = "AAAAAAAAAAAAAAAA"; $key = CIPHERKEY; return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,addpadding($data),$iv)); } function addpadding($string,$blocksize = 16) { $len = strlen($string); $pad = $blocksize - ($len % $blocksize); $string .= str_repeat(chr($pad),$pad); return $string; } C#代码将根据PKCS7自动添加填充. 更新2条填充: function strippadding($string) { $slast = ord(substr($string,-1)); $slastc = chr($slast); $pcheck = substr($string,-$slast); if(preg_match("/$slastc{".$slast."}/",$string)){ $string = substr($string,strlen($string)-$slast); return $string; } else { return false; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |