脚本宝典收集整理的这篇文章主要介绍了在PHP中从C#复制相同的AES加密,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用我的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()); }
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 ==的结果
CBC比ECB更安全,因此我建议坚持使用默认的.NET实现并更改您的PHP代码以使用CBC,但是您有两个选择.
选项1 – 更改.NET以使用ECB模式(如果您有一些遗留代码并且需要使用它)但是请阅读它,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 ...
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC,'');
更新
我更详细地检查了这一点,发现你还需要在你的明文中添加填充.以下代码将为您提供匹配:
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; }
更新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; } }
以上是脚本宝典为你收集整理的在PHP中从C#复制相同的AES加密全部内容,希望文章能够帮你解决在PHP中从C#复制相同的AES加密所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。