在PHP中从C#复制相同的AES加密

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了在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;
    }
}

脚本宝典总结

以上是脚本宝典为你收集整理的在PHP中从C#复制相同的AES加密全部内容,希望文章能够帮你解决在PHP中从C#复制相同的AES加密所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。