PHP-libmcrypt-2.4.x加密-AES加密

mcrypt_get_block_size — 获得加密算法的分组大小

此函数将在PHP7.1.0以后将被弃用。

int mcrypt_get_block_size ( int $cipher )
int mcrypt_get_block_size ( string $cipher , string $mode )

第一个原型针对 libmcrypt 2.2.x, 第二个原型针对 libmcrypt 2.4.x 或 2.5.x。

PHP的AES加、解密类:

<?php
class Security {
	public static function encrypt($input, $key) {
	// define (‘MCRYPT_RIJNDAEL_128‘, "rijndael-128");// 16字节,128位
	// define (‘MCRYPT_MODE_ECB‘, "ecb");// 常用加密模式
	$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
	// 填充空位;pkcs5_pad&pkcs7_pad二者区别不大
	$input = Security::pkcs5_pad($input, $size);
	$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, ‘‘, MCRYPT_MODE_ECB, ‘‘);
	$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	$data = base64_encode($data);
	return $data;
	}
         
        /**
         * $text 加密的字符串
         * $blocksize 区块大小,16字节;值为16
         */
	private static function pkcs5_pad ($text, $blocksize) {
		$pad = $blocksize - (strlen($text) % $blocksize);
		// 使用$pad的ascii码值来填充空位
		return $text . str_repeat(chr($pad), $pad);
	}
 
	public static function decrypt($sStr, $sKey) {
		$decrypted= mcrypt_decrypt(
		MCRYPT_RIJNDAEL_128,
		$sKey,
		base64_decode($sStr),
		MCRYPT_MODE_ECB
	);
		$dec_s = strlen($decrypted);
		$padding = ord($decrypted[$dec_s-1]);
		$decrypted = substr($decrypted, 0, -$padding);
		return $decrypted;
	}
}
 
 
 
// $key = "1234567891234567";
// $data = ‘{"user":"1234556789","pwd":"4343434343","tel":"18988888888","realname":"zhangsan"}‘;
 
// $value = Security::encrypt($data , $key );
// echo "加密::".$value.‘<br/>‘;
// echo Security::decrypt($value, $key );

代码中使用:

   /**
     * 加密、解密
     */
    function zm_ecrypt()
    {
        // 加密、解密
        $string = ‘{"user":"1234556789","pwd":"4343434343","tel":"18988888888","realname":"zhangsan"}‘;
        
        vendor(‘encrypt.Security‘) or die("方案7引入失败");
        $sec = new \Security();
        // 这里对第二个参数key进行了base64_encode加密
        $sec_res1 = $sec->encrypt($string, "em1hcnRlAzIwMTc5ODc2NTQzMjEwMTIz");
        // 结果转16进制
        $sec_res = toHexString(base64_decode($sec_res1));
        
        // 解密
        // 先把十六进制转成字符串,然后进行base64_encode
        $demo = base64_encode(hexToStr($sec_res));
        $sec_dec = $sec->decrypt($demo, "em1hcnRlAzIwMTc5ODc2NTQzMjEwMTIz");
//         var_dump("\r\n方案7加密的结果\r\n" . $sec_res);
//         var_dump("\r\n方案7解密的结果\r\n" . $sec_dec);

//         return $as_res_encrypt;
    }

使用的时候,请注意base64_encode和base64_decode,对key和string是否进行编码。

用到的十六进制与字符串之间的转换:

   /**
     * 十六进制转字符串
     * 16进制的转为2进制字符串    
     * @param 十六进制 $hex
     * @return string
     */
    function hexToStr($hex)
    {
        $string="";
        for($i=0;$i<strlen($hex)-1;$i+=2)
            $string.=chr(hexdec($hex[$i].$hex[$i+1]));
        return  $string;
    }
    
    /**
     * 将$string转换成十六进制
     * @param string $string
     * @return stream
     */
    function toHexString ($string){
        $buf = "";
        for ($i = 0; $i < strlen($string); $i++){
            $val = dechex(ord($string{$i}));
            if(strlen($val)< 2)
                $val = "0".$val;
            $buf .= $val;
        }
        return $buf;
    }
时间: 2024-11-05 16:11:21

PHP-libmcrypt-2.4.x加密-AES加密的相关文章

AES加密的四种模式详解

对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB) 一. AES对称加密:                                                       AES加密                          分组 二. 分组密码的填充                                                    分组密码的填充 e.g.:                                          

信息安全-加密:AES 加密

ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的

iOS代码加密常用加密方式

在今天的面试中,被问到了iOS是采用什么进行加密解密操作的,我的回答是这样的:AES,MD5,Base 64,然后是对这几种加密算法进行了一下简单的介绍和概述和几种算法之间的不同点和优缺点.然而,收到的回答是:这些都不是iOS的加密!我顿时就无语了,这不就是iOS加密所用到的方法么?然后向面试官请教了一下:MD5是一种摘要....什么叫加密呢?加密是客户端对数据加密和服务器端采用秘钥对数据进行解密处理,为了数据的安全考虑.要说加密应该是RSA.幸亏之前有了解过RSA,只是了解的不是很彻底和清楚.

Linux进行AES加密每次结果都不一致并且解密失败报错

1. 现象 windows操作系统下进行"123456"的AES加密 encrypted message is below : QLNYZyjRnKF/zxAjzDt/lw== decrypted message is below : 123456 阿里云服务器,同样是"123456"的密码,每次加密结果都不一样,且不是QLNYZyjRnKF/zxAjzDt/lw==,解密是报错的 2.解决方法 经过检查之后,定位在生成KEY的方法上,如下: public stat

AES加密

package util; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;impo

aes加密步骤

最近学了aes加密,在这写一下自己对加密过程的理解. 1.加密采用轮秘钥加密,密钥长度一般为128bit,也对应着是16个字节.128bit的秘钥长度对应的是10轮. 首先是轮秘钥的生成,即秘钥的编排方案,先选取128bit的种子秘钥,对10轮版本的aes需要11个轮秘钥,每个轮秘钥都由16个字节组成,一个字节用两个二进制数来表示.秘钥编排算法是面向字的,即一个字4字节,32bit,即每一轮要四个字.轮秘钥的并联叫做扩展秘钥,共有44个字.每个w[i]都是一个字.未完待续,先去写秘钥编排算法.

Java aes加密C#解密的取巧方法

摘要: 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Java代码: /** * 加密 * * @param content 需要加密的内... 项目开发过程中遇到一个棘手的问题:A系统使用java开发,通过AES加密数据,B系统使用C#开发,需要从A系统获取数据,但在AES解密的时候遇到麻烦.Java的代码和C#的代码无法互通. Java代码: /**

非对称技术栈实现AES加密解密

非对称技术栈实现AES加密解密 正如前面的一篇文章所述,https协议的SSL层是实现在传输层之上,应用层之下,也就是说在应用层上看到的请求还是明码的,对于某些场景下要求这些http请求参数是非可读的,这就要求在前端和后端不同的技术栈上完成信息的加密解密.当然我们通常完成这样专业的功能都会考虑使用相应的框架或者程序库来完成功能,前端或者NodeJS平台通常是JavaScript语言,JavaScript主流的加密解密库分别是SjclJS和CryptoJS, 本文以CryptoJS为例进行讨论.另

王立平--AES加密图片实现 SkImageDecoder::Factory return null

这个问题是在加密图片,存入sd卡,在解密出来展示,出现的.我个人研究了非常久没解决.最后经过高人指点,最终攻克了. 在此,拿出来分享,希望各位少走弯路. 我之前的设计思路是:(能够不看哦) 1.把图片从drawable读入成bitmap 2.bitmap-->byte 3.调用AES的byte加密算法. 4.加密成byte,在转化为string 5,把string存入sd卡. -------------------------------- 4,从sd卡获取string. 5.string-->