好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php7.1des加密 php7 加密

很多站长朋友们都不太清楚php7.1des加密,今天小编就来给大家整理php7.1des加密,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 PHP对称加密-AES 2、 PHP 加密扩展 php-beast 的使用 3、 如何用php实现和c#一致的DES加密解密 4、 PHP常用加密解密方法 PHP对称加密-AES

对称加解密算法中,当前最为安全的是 AES 加密算法(以前应该是是 DES 加密算法),PHP 提供了两个可以用于 AES 加密算法的函数簇: Mcrypt 和 OpenSSL 。

其中 Mcrypt 在 PHP 7.1.0 中被弃用(The Function Mycrypt is Deprecated),在 PHP 7.2.0 中被移除,所以即可起你应该使用 OpenSSL 来实现 AES 的数据加解密。

在一些场景下,我们不能保证两套通信系统都使用了相函数簇去实现加密算法,可能 siteA 使用了最新的 OpenSSL 来实现了 AES 加密,但作为第三方服务的 siteB 可能仍在使用 Mcrypt 算法,这就要求我们必须清楚 Mcrypt 同 OpenSSL 之间的差异,以便保证数据加解密的一致性。

下文中我们将分别使用 Mcrypt 和 OpenSSL 来实现 AES-128/192/256-CBC 加解密,二者同步加解密的要点为:

协同好以上两点,就可以让 Mcrypt 和 OpenSSL 之间一致性的对数据进行加解密。

AES 是当前最为常用的安全对称加密算法,关于对称加密这里就不在阐述了。

AES 有三种算法,主要是对数据块的大小存在区别:

AES-128:需要提供 16 位的密钥 key

AES-192:需要提供 24 位的密钥 key

AES-256:需要提供 32 位的密钥 key

AES 是按数据块大小(128/192/256)对待加密内容进行分块处理的,会经常出现最后一段数据长度不足的场景,这时就需要填充数据长度到加密算法对应的数据块大小。

主要的填充算法有填充 NUL("0") 和 PKCS7,Mcrypt 默认使用的 NUL("0") 填充算法,当前已不被推荐,OpenSSL 则默认模式使用 PKCS7 对数据进行填充并对加密后的数据进行了 base64encode 编码,所以建议开发中使用 PKCS7 对待加密数据进行填充,已保证通用性(alipay sdk 中虽然使用了 Mcrypt 加密簇,但使用 PKCS7 算法对数据进行了填充,这样在一定程度上亲和了 OpenSSL 加密算法)。

Mcrypt 的默认填充算法。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的。

OpenSSL的默认填充算法。下面我们给出 PKCS7 填充算法 PHP 的实现:

默认使用 NUL("\0") 自动对待加密数据进行填充以对齐加密算法数据块长度。

获取 mcrypt 支持的算法,这里我们只关注 AES 算法。

注意:mcrypt 虽然支持 AES 三种算法,但除 MCRYPT_RIJNDAEL_128 外, MCRYPT_RIJNDAEL_192/256 并未遵循 AES-192/256 标准进行加解密的算法,即如果你同其他系统通信(java/.net),使用 MCRYPT_RIJNDAEL_192/256 可能无法被其他严格按照 AES-192/256 标准的系统正确的数据解密。官方文档页面中也有人在 User Contributed Notes 中提及。这里给出如何使用 mcrpyt 做标注的 AES-128/192/256 加解密

即算法统一使用 MCRYPT_RIJNDAEL_128 ,并通过 key 的位数 来选定是以何种 AES 标准做的加密,iv 是建议添加且建议固定为16位(OpenSSL的 AES加密 iv 始终为 16 位,便于统一对齐),mode 选用的 CBC 模式。

mcrypt 在对数据进行加密处理时,如果发现数据长度与使用的加密算法的数据块长度未对齐,则会自动使用 "\0" 对待加密数据进行填充,但 "\0" 填充模式已不再被推荐,为了与其他系统有更好的兼容性,建议大家手动对数据进行 PKCS7 填充。

openssl 簇加密方法更为简单明确,mcrypt 还要将加密算法分为 cipher + mode 去指定,openssl 则只需要直接指定 method 为 AES-128-CBC,AES-192-CBC,AES-256-CBC 即可。且提供了三种数据处理模式,即 默认模式 0 / OPENSSL_RAW_DATA / OPENSSL_ZERO_PADDING 。

openssl 默认的数据填充方式是 PKCS7,为兼容 mcrpty 也提供处理 "0" 填充的数据的模式,具体为下:

options 参数即为重要,它是兼容 mcrpty 算法的关键:

options = 0 : 默认模式,自动对明文进行 pkcs7 padding,且数据做 base64 编码处理。

options = 1 : OPENSSL_RAW_DATA,自动对明文进行 pkcs7 padding, 且数据未经 base64 编码处理。

options = 2 : OPENSSL_ZERO_PADDING,要求待加密的数据长度已按 "0" 填充与加密算法数据块长度对齐,即同 mcrpty 默认填充的方式一致,且对数据做 base64 编码处理。注意,此模式下 openssl 要求待加密数据已按 "0" 填充好,其并不会自动帮你填充数据,如果未填充对齐,则会报错。

故可以得出 mcrpty簇 与 openssl簇 的兼容条件如下:

建议将源码复制到本地运行,根据运行结果更好理解。

1.二者使用的何种填充算法。

2.二者对数据是否有 base64 编码要求。

3.mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,并通过调整 key 的长度 16, 24,32 来实现 ase-128/192/256 加密算法。

PHP 加密扩展 php-beast 的使用

安装完 php-beast 后可以使用 tools 目录下的 encode_files.php 来加密你的项目。使用 encode_files.php 之前先修改 tools 目录下的 configure.ini 文件,如下:

src_path 是要加密项目的路径,

dst_path 是保存加密后项目的路径,

expire 是设置项目可使用的时间 (expire 的格式是:YYYY-mm-dd HH:ii:ss)。

encrypt_type是加密的方式,选择项有: DES、AES、BASE64 。

修改完 configure.ini 文件后就可以使用命令 php encode_files.php 开始加密项目。

附上例子:将demo项目全部加密到新的demo2

使用 beast_encode_file() 函数加密文件,函数原型如下:

beast_encode_file(string $input_file, string $output_file, int expire_timestamp, int encrypt_type)

例子:

beast_encode_file('index2.php','index3.php','1656518400',BEAST_ENCRYPT_TYPE_AES);

想要更深入了解的话可以看官方文档

参考文章:

如何用php实现和c#一致的DES加密解密

PHP实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。

注意:key的长度为8位以内。

[csharp] view plain copy print?

//C# 版DES 加解密算法  

using System;     

using System.Data;     

using System.Configuration;     

using System.Web;     

using System.Web.Security;     

using System.Web.UI;     

using System.Web.UI.WebControls;     

using System.Web.UI.WebControls.WebParts;     

using System.Web.UI.HtmlControls;     

using System.Data.SqlClient;     

using System.Security.Cryptography;     

using System.IO;     

using System.Text;     

public class Des{     

    //加解密密钥  

    private static  string skey = "12345678";  

    //初始化向量  

    private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };   

   

                #region DESEnCode DES加密     

                public static string DESEnCode(string pToEncrypt, string sKey)     

                {     

                    pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt);     

                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();     

                    byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);     

                 

                    //建立加密对象的密钥和偏移量      

                    //原文使用ASCIIEncoding.ASCII方法的GetBytes方法      

                    //使得输入密码必须输入英文文本      

                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);     

                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);     

                    MemoryStream ms = new MemoryStream();     

                    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);     

                 

                    cs.Write(inputByteArray, 0, inputByteArray.Length);     

                    cs.FlushFinalBlock();     

                 

                    StringBuilder ret = new StringBuilder();     

                    foreach (byte b in ms.ToArray())     

                    {     

                        ret.AppendFormat("{0:X2}", b);     

                    }     

                    ret.ToString();     

                    return ret.ToString();     

                }    

                #endregion    

                /// <summary>  

                ///   

                /// </summary>  

                /// <param name="pToDecrypt"> 待解密的字符串</param>  

                /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同</param>  

                /// <returns>解密成功返回解密后的字符串,失败返源串</returns>  

                #region DESDeCode DES解密  

                public static string DESDeCode(string pToDecrypt, string sKey)  

                {  

                    //    HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);     

                    //    HttpContext.Current.Response.End();     

                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();  

               

                    byte[] inputByteArray = new byte[pToDecrypt.Length / 2];  

                    for (int x = 0; x < pToDecrypt.Length / 2; x++)  

                    {  

                        int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));  

                        inputByteArray[x] = (byte)i;  

                    }  

               

                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);  

                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  

                    MemoryStream ms = new MemoryStream();  

                    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);  

                    cs.Write(inputByteArray, 0, inputByteArray.Length);  

                    cs.FlushFinalBlock();  

               

                    StringBuilder ret = new StringBuilder();  

               

                    return HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));  

                }  

    #endregion   

}

[php] view plain copy print?

<?php  

class DES  

{  

    var $key;  

    var $iv; //偏移量  

      

    function DES( $key, $iv=0 ) {  

    //key长度8例如:1234abcd  

        $this->key = $key;  

        if( $iv == 0 ) {  

            $this->iv = $key; //默认以$key 作为 iv  

        } else {  

            $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );  

        }  

    }  

      

    function encrypt($str) {  

    //加密,返回大写十六进制字符串  

        $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );  

        $str = $this->pkcs5Pad ( $str, $size );  

        return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );  

    }  

      

    function decrypt($str) {  

    //解密  

        $strBin = $this->hex2bin( strtolower( $str ) );  

        $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );  

        $str = $this->pkcs5Unpad( $str );  

        return $str;  

    }  

      

    function hex2bin($hexData) {  

        $binData = "";  

        for($i = 0; $i < strlen ( $hexData ); $i += 2) {  

            $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );  

        }  

        return $binData;  

    }  

  

    function pkcs5Pad($text, $blocksize) {  

        $pad = $blocksize - (strlen ( $text ) % $blocksize);  

        return $text . str_repeat ( chr ( $pad ), $pad );  

    }  

      

    function pkcs5Unpad($text) {  

        $pad = ord ( $text {strlen ( $text ) - 1} );  

        if ($pad > strlen ( $text ))  

            return false;  

        if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)  

            return false;  

        return substr ( $text, 0, - 1 * $pad );  

    }  

      

}  

?>

PHP常用加密解密方法

作者/上善若水

1.md5(string $str,bool $flag = false);

$flag = false 默认返回32位的16进至数据散列值

$flag = true  返回原始流数据

2.sha1($string,$flag = false)

$flag = false 默认返回40位的16进至数据散列值

true  返回原始流数据

3.hash(string $algo,srting $str,bool $flag);

$algo : 算法名称,可通过hash_algos()函数获取所有hash加密的算法

如:md5,sha1等,采用md5,sha1加密所得结果和1,2两种方式结 果相同。

$flag = false 默认返回16进至的数据散列值,具体长度根据算法不同

而不同。

true  返回原始流数据。

4.crypt(string $str,$string $salt);

函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。

具体算法依赖于PHP检查之后支持的算法和$salt的格式和长度,当 然具体结果也和操作系统有关。比较结果采用 hash_equals($crypted,crypt($input,$salt));//且salt值相同

Password_verify($str,$crypted);

5.password_hash ( string $str, integer $algo [, array $options ] )

函数返回哈希加密后的密码字符串, password_hash() 是crypt()的 一个简单封装

$algo : 算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT

$options = [

“cost”=>10,//指明算法递归的层数,

“salt”=>“xxadasdsad”//加密盐值,即将被遗 弃,采用系统自动随机生成安全性更高

];

使用的算法、cost 和盐值作为哈希的一部分返回

Password_verify($str,$hashed);

6.base64_encode(string $str)

设计此种编码是为了使二进制数据可以通过非纯 8-bit 的传输层 传输,例如电子邮件的主体。base64_decode(string $encoded)

可以进行解码;

7.mcrypt_encrypt ( string $cipher , string $key , string $data ,

string $mode [, string $iv ] )

mcrypt_decrypt ( string $cipher , string $key , string $crypted ,

string $mode [, string $iv ] )

$ciper:加密算法,mcrypt_list_algorithms()可以获取该函数所有支持的算法

如MCRYPT_DES(“des”),MCRYPT_RIJNDAEL_128(“rijndael-128”);

$mode : 加密模式 ,mcrypt_list_modes()获取所有支持的加密模式,ecb,cbc

$key: 加密的秘钥,mcrypt_get_key_size ( string $cipher , string $mode )

获取指定的算法和模式所需的密钥长度。$key要满足这个长度,如果长 度无效会报出警告。

$iv : 加密的初始向量,可通过mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),

Iv的参数size:

通过mcrypt_get_iv_size ( string $cipher , string $mode )获取

Iv 的参数source:

初始向量数据来源。可选值有: MCRYPT_RAND (系统随机数生成 器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和  MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。

请注意,在 PHP 5.6.0 之前的版本中, 此参数的默认值 为 MCRYPT_DEV_RANDOM。

Note: 需要注意的是,如果没有更多可用的用来产生随机数据的信息, 那么 MCRYPT_DEV_RANDOM 可能进入阻塞状态。

$data : 要加密的字符串数据

关于php7.1des加密的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php7.1des加密 php7 加密的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did255212
更新时间:2023-10-09   阅读:58次

上一篇: 有没有php扩展 php扩展怎么安装

下一篇:php俄罗斯方块 俄罗斯方块的网址

相关资讯

最新资料更新

  • 1.无限级菜单php java无限极菜单
  • 2.iconv函数php iconv函数参数
  • 3.商品展示模块php 商品展示模块的设计要点
  • 4.php防止ajax接口 php防止接口多次请求
  • 5.天津php公司的 天津程序员公司
  • 6.php交叉报表 ureport 交叉报表
  • 7.php框架制作教程外包 怎么做php框架
  • 8.phphuoqv多选 php选择语句
  • 9.redis缓存类php php redis页面缓存
  • 10.php大马离线版 php大马shell提权
  • 11.字符串对齐方法php php字符串赋值
  • 12.字符编码+php 字符编码转换器
  • 13.php系统源代码下载 php源码免费下载
  • 14.整站系统php源码 php企业网站整站源码
  • 15.php在线运行测试 php 测试工具
  • 16.php网络通信 php通信协议
  • 17.phphtml补全 html自动补全代码
  • 18.php事务的隔离级别 php事务处理
  • 19.php查询数组找到 php查找数组元素
  • 20.php网站后台demo php后端模板

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]