首页 / PHP / 在PHP中从C#复制相同的AES加密
在PHP中从C#复制相同的AES加密
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在PHP中从C#复制相同的AES加密,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3331字,纯文字阅读大概需要5分钟。
内容图文
![在PHP中从C#复制相同的AES加密](/upload/InfoBanner/zyjiaocheng/792/da1318ed8a3b44409c8bf850c59ea1e5.jpg)
我正在开发一个项目,我有一个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, 0, 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, '', MCRYPT_MODE_ECB, '');
//$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($cipher), MCRYPT_RAND);
$iv = 'PRIVATE';
//$key = substr(CIPHERKEY, 0, 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, $key, addpadding($data), MCRYPT_MODE_CBC, $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, 0, strlen($string)-$slast);
return $string;
} else {
return false;
}
}
内容总结
以上是互联网集市为您收集整理的在PHP中从C#复制相同的AES加密全部内容,希望文章能够帮你解决在PHP中从C#复制相同的AES加密所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。