Php 用于在cookie上存储数据的AES加密

Php 用于在cookie上存储数据的AES加密,php,cookies,encryption,aes,formula,Php,Cookies,Encryption,Aes,Formula,我需要在一个cookie上存储尽可能多的字符,并在AES中加密存储字符字符串 cookie有大约4kb的内存 所以我需要计算我可以在一个cookie中存储多少字符,并在AES中加密所有这些字符 要存储的字符是字母数字字符串 编辑:我可以允许所有的UTF-8字母数字字符都是纯文本和chipertext 这是我的代码 <?php $Pass = "132ksjcngpt04938idjsk39urtokg"; $Clear = "123hryd{}ls.-''ksllasllallall

我需要在一个cookie上存储尽可能多的字符,并在AES中加密存储字符字符串

cookie有大约4kb的内存

所以我需要计算我可以在一个cookie中存储多少字符,并在AES中加密所有这些字符

要存储的字符是字母数字字符串

编辑:我可以允许所有的UTF-8字母数字字符都是纯文本和chipertext

这是我的代码

 <?php


$Pass = "132ksjcngpt04938idjsk39urtokg";
$Clear = "123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123hryd{}ls.-''ksllasllallallallallal:{}::{}jdhhfn123456789012345678901234567890123456789o";


$crypted = fnEncrypt($Clear, $Pass);
echo "Encrypred: ".$crypted."<br></br>";

$newClear = fnDecrypt($crypted, $Pass);
echo "Decrypred: ".$newClear."<br></br>";



function fnEncrypt($sValue, $sSecretKey)
{
    return trim(
        base64_encode(
            mcrypt_encrypt(
                MCRYPT_RIJNDAEL_128,
                $sSecretKey, $sValue, 
                MCRYPT_MODE_ECB, 
                mcrypt_create_iv(
                    mcrypt_get_iv_size(
                        MCRYPT_RIJNDAEL_128, 
                        MCRYPT_MODE_ECB
                    ), 
                    MCRYPT_RAND)
                )
            )
        );
}

function fnDecrypt($sValue, $sSecretKey)
{
    return trim(
        mcrypt_decrypt(
            MCRYPT_RIJNDAEL_128, 
            $sSecretKey, 
            base64_decode($sValue), 
            MCRYPT_MODE_ECB,
            mcrypt_create_iv(
                mcrypt_get_iv_size(
                    MCRYPT_RIJNDAEL_128,
                    MCRYPT_MODE_ECB
                ), 
                MCRYPT_RAND
            )
        )
    );
}
?>
chiperText由3040个utf-8字符组成


加密最多4056个utf-8字符

如果我错了,请纠正我,但假设您将utf-8用作纯文本的字母数字字符,因为AES使用16字节长度的块(在本上下文中可以视为16个字母数字字符),您的纯文本至少填充了15字节(最糟糕的情况)

因此,给定
n
纯文本的长度,可以通过以下公式推断出密码文本的长度:

(n + 16) - (n % 16)
只要我的2美分。
Dario。

如果使用经过身份验证的流模式,如AES-GCM,原始密文大小(以字节为单位)将比明文大小大32字节。其中16个用于随机静脉注射,16个用于MAC

现在的问题是,任意字节都不是有效的UTF-8,因此需要一些编码来解决这个问题。Base64是一种流行的变体,但它将大小增加到原始大小的4/3。
这意味着,如果您的大小限制为4KB,您将能够支持高达3040字节的明文

还有其他更有效的编码,但这会变得更复杂,您需要找出哪些字符是有效的(例如
\0
)。除非绝对必要,否则我不建议这样做


您的代码有很多错误:

  • 你正在使用ECB,几乎是所有模式中最糟糕的
  • 加密和解密需要相同的IV。因此,将其与密文一起存储。你没有注意到,因为欧洲央行不使用静脉注射
  • 你没有身份验证
  • 你的第四代人不好。使用
    MCRYPT\u DEV\u uradom
    而不是
    MCRYPT\u RAND

  • 1) AES不是散列。2) 输出大小取决于链接模式。你用哪一种?CBC?3) 您可能需要添加一个IV和一个MAC,否则它可能不安全。4) 字符和字节不是一回事(假设是一个健全的类型系统)。@CodesInChaos谢谢你的信息我是这个论点的新手我想了解一下,我编辑了我的答案以便更好地向你展示(希望我的英语好)我需要做什么;)你对角色的定义还不清楚。明文中允许哪些字符,密文中允许哪些字符?@CodesInChaos明文中允许所有utf-8字母数字字符密文是加密数据1)您假设的是CBC模式2)AES的输出不是有效的utf-8,因此您需要使用Base64这样的编码来增加大小。3) 如果有人能在我的房间里点些东西,你的配方奶漏了IV,MACi会变成疯子的head@CodesInChaos我知道你有答案,请给我ti:))我打算使用CBC模式,没问题吧?CBC会增加额外的开销(1-16字节),你仍然需要IV+MAC。CBC有点烦人,因为你需要自己添加一个MAC,这很容易出错。我推荐使用随机IV的AES-GCM(使用加密PRNG)。它包括身份验证和加密。我更新了一个问题,你能检查我的代码并编辑吗?@Ispuk这和我预测的差不多。如果你加上IV和MAC,你将得到4096个字符,这是你想要的最大4KB。您仍然需要修复我指出的缺陷,或者您的加密不安全。不,您需要比我更了解php的人。
    (n + 16) - (n % 16)