有没有不增加输出大小的加密算法?
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,并且它必须与块大小相同。一定是随机的,但不一定是秘密的。
假设我有这个文本: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,并且它必须与块大小相同。一定是随机的,但不一定是秘密的。