坑货libmcrypt

今天接触的了一个php版本的 aes-128-cbc

en/de原文如下


class SecretUtil {
    public static $hex_iv = '00000000000000000000000000000000'; # converted JAVA byte code in to HEX and placed it here
    //public static $hex_iv = 'EDD80600A09CFBCB4B152C2B2FAAA237'; # converted JAVA byte code in to HEX and placed it here
    public static $key='my key';

    public static function setKey(){
        self::$key = hash('sha256', self::$key, true);
    }

    public static function encrypt($str){
        self::setKey();

        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
        mcrypt_generic_init($td, self::$key, self::hexToStr(self::$hex_iv));

        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $pad = $block - (strlen($str) % $block);
        $str .= str_repeat(chr($pad), $pad);
        $encrypted = mcrypt_generic($td, $str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);

        return base64_encode($encrypted);
    }
}


看起来好简单的样子。可是我发现怎么也还原不了,无头绪了半天。。。。。。真的半天,直到发现libmcrypt的确是个坑货 


If you're writing code to encrypt/encrypt data in 2015, you should use openssl_encrypt() and openssl_decrypt(). The underlying library (libmcrypt) has been abandoned since 2007, and performs far worse than OpenSSL (which leverages AES-NI on modern processors and is cache-timing safe).


Also, MCRYPT_RIJNDAEL_256 is not AES-256, it's a different variant of the Rijndael block cipher. If you want AES-256 in mcrypt, you have to use MCRYPT_RIJNDAEL_128 with a 32-byte key. OpenSSL makes it more obvious which mode you are using (i.e. 'aes-128-cbc' vs 'aes-256-ctr').


那么好吧。事情就简单了
 self::$key = hash('sha256', self::$key, true);
 这个坑就填了。原来的加解密其实是使用的aes-256-cbc
 第二个坑容易找  $pad = $block - (strlen($str) % $block);
 正好加密内容的长度为 block_size,也就是16时,这家伙会直接追加16个0x10,这个比较有个性。所以使用openssl时也不能使用padding了,得自己来
 我们来试试对应的ruby实现

#encoding:utf-8
require 'openssl'
require 'base64'
key=OpenSSL::Digest::SHA256.digest('my key') 

%w(AES-128-CBC AES-256-CBC).each do |flavour|
	string ='12345678901234561234567890123456asfg'
 	c = OpenSSL::Cipher::Cipher .new flavour
   	pad= c.block_size - string.length % c.block_size 
   	str=string 
   	str<<  Array.new(pad){|x| x=pad}.pack('c*') #unless  pad == 16
   	puts "string pad #{pad} to #{str.length}: #{str.unpack('H*')[0]}"
   
 	c.encrypt
	c.padding=0
	c.key = key
	iv=Array.new(16,0).pack('c*')
	c.iv=iv
 
	enc = c.update(str) + c.final
    en_str=Base64.strict_encode64(enc)
	puts "#{flavour} encrypt #{string} \r\n#{en_str}"

	#解密过程
	d=  OpenSSL::Cipher::Cipher .new flavour
	d.decrypt
	d.padding=0
	d.key=key
	d.iv=iv
	dec=Base64.strict_decode64(en_str)
	de_str=d.update(dec)+ d.final
	puts "#{flavour} decrypt #{en_str} \r\n#{de_str.unpack('H*')[0]}"

	#前面填的坑要自己来埋,去掉最后的padding个padding字符
	last_char=de_str[-1,1].ord
 	padding=Array.new(last_char,last_char).pack('c*') 
 	puts "padding #{padding.unpack('H*')[0] }"
	de_str=de_str[0,de_str.length-padding.length] if de_str.end_with?(padding) 
	puts "drop padding #{de_str} \r\nhex:#{de_str.unpack('H*')[0]}"
end
 



### 回答1: libmcrypt-2.5.8.tar.bz2是一个文件的扩展名,表示一个被压缩的文件。它可能是由mcrypt项目提供的一个应用程序和库的源代码文件的压缩包。 libmcrypt是一个加密算法库,用于提供各种加密和解密功能,用于保护数据的机密性。这个库提供了多种加密算法,包括DES、TripleDES、Blowfish、AES等。它还提供了一组函数和接口,使开发者容易地在应用程序中实现加密和解密的功能。 为了使用libmcrypt库,我们需要先解压缩该文件。使用tar命令和bzip2解压缩文件的压缩包。然后,我们可以找到源代码或是已经编译好的库文件。如果我们打算编译和安装这个库,我们需要使用适合我们操作系统的编译器和构建工具。 在安装libmcrypt之后,我们可以在我们的应用程序中调用其提供的函数和接口来实现数据的加密和解密。这样我们就可以保护敏感数据的安全性,确保只有授权的用户能够访问它们。 总之,libmcrypt-2.5.8.tar.bz2是一个加密算法库的源代码文件压缩包。通过解压缩、编译和安装,我们可以使用这个库来在我们的应用程序中实现数据的加密和解密功能。 ### 回答2: libmcrypt-2.5.8.tar.bz2 是一个软件库的压缩包文件。该软件库被用来实现数据加密和解密的功能。它提供了用于在计算机程序中加密和解密数据的算法和工具。 libmcrypt-2.5.8.tar.bz2 文件是一个经过压缩的二进制文件,以.tar.bz2格式存储。要使用该文件,我们需要先解压缩它。为了解压缩该文件,我们可以使用解压缩软件,如WinRAR或7-Zip等工具,将其解压缩到本地计算机的指定目录。 一旦解压缩完成,你可以在指定目录中找到相关的源代码文件、函数库和其他必要的文件。接下来,你可以根据需要自行编译和安装该库。为了编译和安装该库,你需要在计算机上安装相应的开发工具和依赖项。 一旦成功编译和安装该库,你就可以在你的程序中使用该库提供的功能来实现数据加密和解密。通过调用该库的相应函数,你可以将敏感数据进行加密,确保数据的安全性。同样,你也可以使用该库来解密已经加密的数据,对数据进行恢复。 综上所述,libmcrypt-2.5.8.tar.bz2 是一个用于数据加密和解密的软件库的压缩包文件。通过正确解压缩、编译和安装该库,你可以在自己的计算机程序中使用该库提供的功能来实现数据的安全加密和解密。 ### 回答3: libmcrypt-2.5.8.tar.bz2是一个源代码压缩包,是用于加密和解密数据的库。使用这个库可以实现各种密码算法,包括DES、3DES、Blowfish等。这个压缩包的文件名后缀.tar.bz2表示它是经过tar和bzip2两种压缩方式压缩得到的。 要使用libmcrypt-2.5.8.tar.bz2,首先需要将其解压缩。我们可以使用解压缩工具,比如tar,对这个文件进行解压缩。解压缩之后,我们可以看到一些源代码文件和相关的配置文件。 接下来,我们需要编译和安装这个库。进入解压缩后的目录,在命令行中执行一系列的编译指令。这些指令会根据操作系统和硬件平台进行编译,生成对应的可执行文件。编译完成后,我们可以将生成的可执行文件安装到系统中,以便在其他程序中使用。 安装完成后,我们就可以在我们的程序中调用libmcrypt库的函数了。通过这些函数,我们可以实现各种加密和解密的操作。我们可以根据需求选择不同的密码算法,并对数据进行加密或解密操作,保护数据的安全性。 总之,libmcrypt-2.5.8.tar.bz2是一个用于加密和解密数据的库的源代码压缩包。通过解压缩、编译和安装,我们可以在我们的程序中使用这个库,实现各种密码算法以及加密解密操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值