Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的AES-256加密_Php_Security_Encryption_Aes_Encryption Symmetric - Fatal编程技术网

PHP中的AES-256加密

PHP中的AES-256加密,php,security,encryption,aes,encryption-symmetric,Php,Security,Encryption,Aes,Encryption Symmetric,我需要一个PHP函数,AES256\u encode($dataToEcrypt)将$data加密为AES-256,另一个AES256\u decode($encryptedData)则相反。有人知道这个函数应该有什么代码吗?请看 AES Rijndael示例取自 这是MCRYPT_RIJNDAEL_256不等同于AES_256 使RIJNDAEL从AES解密的方法是使用MCRYPT_RIJNDAEL_128并在加密之前填充要加密的字符串 AES-256的块大小为128位,键大小为256位 Ri

我需要一个PHP函数,
AES256\u encode($dataToEcrypt)
$data
加密为AES-256,另一个
AES256\u decode($encryptedData)
则相反。有人知道这个函数应该有什么代码吗?

请看

AES Rijndael示例取自


这是MCRYPT_RIJNDAEL_256

不等同于AES_256

使RIJNDAEL从AES解密的方法是使用MCRYPT_RIJNDAEL_128并在加密之前填充要加密的字符串

AES-256的块大小为128位,键大小为256位 Rijndael-256的BlockSize=256bit,KeySize=256bit

只有AES/Rijndael 128位是相同的。 Rijndael-192和Rijndael-256与AES-192和AES-256不同(块大小和轮数不同)。

$key='324325923495kdfgiert734t';//jasper代码中用于解密的密钥
$text='string_to_be_encrypted';
$encrypted=fncrypter($text,$key);
函数fnecrypt($plaintext,$key)
{
$plaintext=pkcs5_pad($plaintext,16);
返回bin2hex(mcrypt_encrypt(mcrypt_RIJNDAEL_256,hex2bin($key),$plaintext,mcrypt_MODE_ECB));
}
函数pkcs5_pad($text,$blocksize)
{
$pad=$blocksize-(strlen($text)%$blocksize);
返回$text.stru repeat(chr($pad),$pad);
}
函数hex2bin($hexdata)
{
$bindata=“”;
对于($i=0;$i
我需要一个PHP函数,
AES256\u encode($dataToEcrypt)
$data
加密为AES-256,另一个
AES256\u decode($encryptedData)
则相反。有人知道这个函数应该有什么代码吗

有一个问题

你真的需要AES-256吗?AES-256与AES-128的安全性没有那么重要;您更可能在协议层出错,而不是被黑客攻击,因为您使用的是128位分组密码而不是256位分组密码

重要信息-使用图书馆

  • (锂钠包装,现在稳定)
一种快速脏的AES-256实现 如果您对构建自己的感兴趣,不是为了在生产中部署它,而是为了您自己的教育,我提供了一个示例AES256

/**
 * This is a quick and dirty proof of concept for StackOverflow.
 * 
 * @ref http://stackoverflow.com/q/6770370/2224584
 * 
 * Do not use this in production.
 */
abstract class ExperimentalAES256DoNotActuallyUse
{
    /**
     * Encrypt with AES-256-CTR + HMAC-SHA-512
     * 
     * @param string $plaintext Your message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     * @return string
     */
    public static function encrypt($plaintext, $encryptionKey, $macKey)
    {
        $nonce = random_bytes(16);
        $ciphertext = openssl_encrypt(
            $plaintext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        );
        $mac = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
        return base64_encode($mac.$nonce.$ciphertext);
    }

    /**
     * Verify HMAC-SHA-512 then decrypt AES-256-CTR
     * 
     * @param string $message Encrypted message
     * @param string $encryptionKey Key for encryption
     * @param string $macKey Key for calculating the MAC
     */
    public static function decrypt($message, $encryptionKey, $macKey)
    {
        $decoded = base64_decode($message);
        $mac = mb_substr($message, 0, 64, '8bit');
        $nonce = mb_substr($message, 64, 16, '8bit');
        $ciphertext = mb_substr($message, 80, null, '8bit');

        $calc = hash_hmac('sha512', $nonce.$ciphertext, $macKey, true);
        if (!hash_equals($calc, $mac)) {
            throw new Exception('Invalid MAC');
        }
        return openssl_decrypt(
            $ciphertext,
            'aes-256-ctr',
            $encryptionKey,
            OPENSSL_RAW_DATA,
            $nonce
        );
    }
}
用法 首先,生成两个密钥(是的,其中两个)并以某种方式存储它们

$eKey = random_bytes(32);
$aKey = random_bytes(32);
然后,要加密/解密消息:

$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey);
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);

如果没有
random_bytes()
,则获取。

-1,AES-256不同于
RIJNDAEL-256
。AES中的256表示密钥大小,而RIJNDAEL中的256表示块大小
AES-256
与256位键一起使用时为
RIJNDAEL-128
。@CodesInChaos我已根据您的观察编辑了答案。现在,答案应该是正确的。我只想强调,如果可以进行主动攻击,Mac非常重要。一个众所周知的攻击是接收者的反应泄漏有关明文的信息,允许通过查询接收者逐字节恢复明文。填充也需要注意:因为php中的mcrypt库只支持零长度填充。大多数人使用pkcs#5或pkcs#7填充。因此,如果在不同的平台/位置(例如:webserver vs mobile app)进行加密和解密,PHP已经弃用了
mcrypt
库,它将在7.1之后从PHP版本中删除,请始终确保匹配填充。因此,使用建议mcrypt会使此答案不受欢迎。看,你肯定是对的,但这篇文章并没有真正回答这个问题。谢谢@CodesInChaos。使用openssl从AES解密RIJNDAEL的方法是使用MCRYPT_RIJNDAEL_128并在使用以下函数加密之前填充要加密的字符串:请简要解释您的答案,使其对OP和其他读者更有用。请同时添加解密函数。下面是一篇解释如何使用MCRYPT的好博客文章库:你能解释一下为什么在生产中使用快速而肮脏的实现不是一个好主意吗?如果它能满足需要的话,你会发现这是你想要的,而不是自己滚动或从StackOverflow复制粘贴。自己动手的唯一原因是创建玩具实现来教自己。是的,但是举个例子,我想处理一些类似于从CPP通过套接字到PHP的流加密的事情。我个人并没有研究过defuse的库,但上面写的通用AES256有什么不合适的原因吗?显然不是确切的密码,但就构建密码而言是类似的。这个答案仍然是最新的吗?(只是检查一下)。我不知道halite的历史,但在我看来,
v3.2.0
目前有一个稳定的可用版本,除了libnail将在PHP7.2中登陆之外,一切都发生了变化。
$eKey = random_bytes(32);
$aKey = random_bytes(32);
$plaintext = 'This is just a test message.';
$encrypted = ExperimentalAES256DoNotActuallyUse::encrypt($plaintext, $eKey, $aKey);
$decrypted = ExperimentalAES256DoNotActuallyUse::decrypt($encrypted, $eKey, $aKey);