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

is there any encryption algorithm that don't increase the output size?

假设我有这个文本:my message will be encrypt 我需要一个算法来用我的密钥加密它,比如 mykey 但不要将输出大小增加到大于输入大小!即我的消息是 26 个字符长度和加密输出大小小于或等于。

语言:PHP 或其他...

我使用了这种河豚加密,但输出大于输入,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)产生与输入长度相同的输出,但我不知道显示这些特征的安全加密算法的标准实现。

CTR 等流模式下的流密码(例如 RC4)或块密码(例如 AES)可以做到这一点。它们通过生成伪随机字节流来工作,该字节流与明文进行异或运算以获得密文。根据您的用例,由于 IV,RC4 没有开销或 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

这是一个带有 256 位密钥(最大)的 AES-CTR 示例:

$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,并且它必须与块大小相同。一定是随机的,但不一定是秘密的。