是否有任何加密算法不会增加输出大小?

时间:2015-02-04 22:58:50

标签: php algorithm encryption

假设我有这样的文字:my message will be encrypt 我需要一个算法来加密我的密钥,如mykey 但不要增加输出尺寸大于输入尺寸!即我的消息是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;
}

2 个答案:

答案 0 :(得分:0)

一般来说,你会经历两个步骤 - 压缩然后加密或加密然后压缩。有些方法结合了这两种方法,例如加密的zip文件。

但是,如果您的消息足够短,压缩将无法带来好处。

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

答案 1 :(得分:0)

流媒体模式(如CTR)中的流密码(例如RC4)或分组密码(例如AES)将会这样做。它们通过产生伪随机字节流来工作,该字节流与明文进行异或,以获得密文。根据您的使用情况,由于IV,因此RC4没有开销,或者AES只有很少的开销。

点亮模式下的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必须存在,并且必须与块的大小相同。它必须是随机的,但不一定是秘密的。