Php 有没有不增加输出大小的加密算法?

Php 有没有不增加输出大小的加密算法?,php,algorithm,encryption,Php,Algorithm,Encryption,假设我有这个文本:我的消息将被加密 我需要一个算法来用我的密钥加密它,比如mykey 但不要将输出大小增加到大于输入大小!i、 e我的邮件长度为26个字符,加密输出大小应小于或等于 语言:PHP或任何其他 我使用了这种blowfish加密,但输出大于输入,gzcompress没有帮助: function encrypt_blowfish($pure_string,$key) { $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRY

假设我有这个文本:我的消息将被加密 我需要一个算法来用我的密钥加密它,比如mykey 但不要将输出大小增加到大于输入大小!i、 e我的邮件长度为26个字符,加密输出大小应小于或等于

语言:PHP或任何其他

我使用了这种blowfish加密,但输出大于输入,gzcompress没有帮助:

function encrypt_blowfish($pure_string,$key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
    $encrypted_string = mcrypt_encrypt(MCRYPT_BLOWFISH, hash('sha256', $key, TRUE), utf8_encode($pure_string), MCRYPT_MODE_ECB, $iv);
    $encrypted_string = bin2hex($encrypted_string);

    return $encrypted_string;
}

function decrypt_blowfish($encrypted_string,$key) {
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
    $encrypted_string = hex2bin($encrypted_string);
    $decrypted_string = mcrypt_decrypt(MCRYPT_BLOWFISH, hash('sha256', $key, TRUE), $encrypted_string, MCRYPT_MODE_ECB, $iv);
    $decrypted_string = trim($decrypted_string);

    return $decrypted_string;
}

不过,一般来说,您将经历两个步骤-先压缩后加密或先加密后压缩。有些方法将两者结合使用,例如加密的zip文件

然而,如果您的消息足够短,压缩就不会带来好处


有一些加密方法,如普通ROT13,可以产生与输入相同长度的输出,尽管我不知道安全加密算法的标准实现会显示这些特征。

流密码(如RC4)或分组密码(如CTR等流模式下的AES)可以做到这一点。它们的工作原理是产生一个伪随机字节流,与明文进行异或运算,得到密文。根据您的用例,RC4没有开销,或者由于IV,AES的开销很小

CTR模式下的AES被认为是安全的,而RC4存在一些问题

具有2048位密钥最大值的RC4示例:

$cipher = "arcfour";
$k = mcrypt_create_iv(256); // random
$data = "some string";
$mode = "stream";

echo "data size: " . strlen($data) . "\n"; // 11

echo "key size: ".mcrypt_get_key_size($cipher, $mode)."\n";
echo "iv size: ".mcrypt_get_iv_size($cipher, $mode)."\n";

$c = mcrypt_encrypt($cipher, $k, $data , $mode, "");
echo "ciphertext size: " . strlen($c) . "\n"; // 11
$cipher = "rijndael-128";
$k = mcrypt_create_iv(32); // random
$iv = mcrypt_create_iv(16); // random
$data = "some string";
$mode = "ctr";

echo "key size: ".mcrypt_get_key_size($cipher, $mode)."\n";
echo "iv size: ".mcrypt_get_iv_size($cipher, $mode)."\n";

$c = mcrypt_encrypt($cipher, $k, $data , $mode, $iv);
echo "ciphertext size: " . strlen($c) . "\n"; // 11
这是一个最大256位密钥的AES-CTR示例:

$cipher = "arcfour";
$k = mcrypt_create_iv(256); // random
$data = "some string";
$mode = "stream";

echo "data size: " . strlen($data) . "\n"; // 11

echo "key size: ".mcrypt_get_key_size($cipher, $mode)."\n";
echo "iv size: ".mcrypt_get_iv_size($cipher, $mode)."\n";

$c = mcrypt_encrypt($cipher, $k, $data , $mode, "");
echo "ciphertext size: " . strlen($c) . "\n"; // 11
$cipher = "rijndael-128";
$k = mcrypt_create_iv(32); // random
$iv = mcrypt_create_iv(16); // random
$data = "some string";
$mode = "ctr";

echo "key size: ".mcrypt_get_key_size($cipher, $mode)."\n";
echo "iv size: ".mcrypt_get_iv_size($cipher, $mode)."\n";

$c = mcrypt_encrypt($cipher, $k, $data , $mode, $iv);
echo "ciphertext size: " . strlen($c) . "\n"; // 11

请注意,对于AES,IV必须存在,并且它必须与块大小相同。它必须是随机的,但不一定是秘密的。

为什么-1?有问题吗?你试过什么吗?这里的人不喜欢什么都不尝试的问题。所以任何压缩算法,zip\rar等,答案都是肯定的。有一些算法可以将一条消息编码为相同大小的消息。由于开销,没有什么能使安全加密的10-50个字符变小;根据您的安全级别需要,您自己的替换密码将很难实现。是的,我知道。但在短消息中,压缩不起作用。有些算法并不那么安全。你永远不会先加密然后压缩——任何真正的加密方法都不会产生可压缩的输出。