假设我有这样的文字: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;
}
答案 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必须存在,并且必须与块的大小相同。它必须是随机的,但不一定是秘密的。