资讯专栏INFORMATION COLUMN

php实现对图片对称加解密(适用身份证加密等场景)

yearsj / 1907人阅读

摘要:图片加解密可以将人员身份证图片通过修改字节加密,并且可将身份证信息也写入图片中。

图片加解密
可以将人员身份证图片通过修改字节加密,并且可将身份证信息也写入图片中。 可以直接将以下代码复制到一个php文件中进行测试。详情请看代码。
255, 2=>216, 3=>255, ……, 29124=>217 ]
        
        // 关闭一个已打开的文件指针        
        fclose($fileId);

        $tempArr = [];
        // 自定义加密规则
        for ($i = 1; $i <= $fileSize; $i++) { 
            $value = 0;
            if ($i % 3 == 0) {
                $value = 2;
            } elseif ($i % 5 == 0) {
                $value = 4;
            } elseif ($i % 7 == 0) {
                $value = 6;
            }
            $byte = $imgUnpack[$i];    // 图片原始字节
            $byte = $byte + $value; // 经过加密规则之后的字节
            // 打包成二进制字符串
            $tempArr[] = pack("C*", $byte);
        }

        $img = implode("", $tempArr);    // 将解包之后的一维数组装换成字符串
        file_put_contents($filePath, $img); // 重写图片
    }


    /**
     * 图片对称解密
     *
     * @param [string] $filePath    图片路径
     * @return void
     */
    public function dec($filePath)
    {
        $fileId = fopen($filePath, "rb+");
        $fileSize = filesize($filePath);
        $img = fread($fileId, $fileSize);
        $imgUnpack = unpack("C*", $img);
        fclose($fileId);

        $tempArr = [];
        // 开始解密
        for ($i = 1; $i <= $fileSize; $i++) { 
            $value = 0;
            if ($i % 3 == 0) {
                $value = 2;
            } elseif ($i % 5 == 0) {
                $value = 4;
            } elseif ($i % 7 == 0) {
                $value = 6;
            }
            $byte = $imgUnpack[$i];
            $byte = $byte - $value;
            $tempArr[] = pack("C*", $byte);
        }
        $img = implode("", $tempArr);
        file_put_contents($filePath, $img);
    }


    /**
     * 图片追加信息
     *
     * @param [string] $filePath    图片路径
     * @param [array] $cardmsg    需要添加的信息数组
     * @param [array] $separate    分隔数组(类似于做一个加密分隔 key)
     * @return void
     */
    public function encmsg($filePath, $cardmsg, $separate)
    {
        // 文档中建议:为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 "b" 标记。
        $fileId = fopen($filePath, "rb+");
        // 取出文件大小的字节数 (29124)
        $fileSize = fileSize($filePath);
        // 读取文件,返回所读取的字符串 (读出来的为二进制序列)
        $img = fread($fileId, $fileSize);
        // 使用“无符号字符”,从二进制字符串对数据进行解包
        // (pack、unpack用法)https://segmentfault.com/a/1190000008305573
        $imgUnpack = unpack("C*", $img); // $fileSize 长度的一维数组 [ 1=>255, 2=>216, 3=>255, ……, 29124=>217 ]
        // 关闭一个已打开的文件指针        
        fclose($fileId);

        // 处理身份信息
        $cardmsgJson = json_encode($cardmsg, JSON_UNESCAPED_UNICODE);
        $cardmsgUnpack = unpack("C*", $cardmsgJson);

        // 合并图片字节、自定义分隔数组(类似手动加 key 值)、身份信息字节
        $mergeArr = array_merge($imgUnpack, $separate, $cardmsgUnpack);

        $pack = [];
        foreach ($mergeArr as $k => $v) {
            $pack[] = pack("C*", $v);
        }
        $packStr = join("", $pack);
        file_put_contents($filePath, $packStr); // 重写图片
    }


    /**
     * 获取追加进图片的信息
     *
     * @param [string] $filePath    图片路径
     * @param [array] $separate    定义的分隔数组(分隔 key)
     * @return [string] 追加进的图片信息
     */
    public function decmsg ($filePath, $separate) 
    {
        // 文档中建议:为移植性考虑,强烈建议在用 fopen() 打开文件时总是使用 "b" 标记。
        $fileId = fopen($filePath, "rb+");
        // 取出文件大小的字节数 (29192)
        $fileSize = fileSize($filePath);
        // 读取文件,返回所读取的字符串 (读出来的为二进制序列)
        $img = fread($fileId, $fileSize);

        // 使用“无符号字符”,从二进制字符串对数据进行解包
        $imgUnpack = unpack("C*", $img); // $fileSize 长度的一维数组 [ 1=>255, 2=>216, 3=>255, ……, 29192=>217 ]
        // 关闭一个已打开的文件指针        
        fclose($fileId);

        $imgUnpackStr = join(",",$imgUnpack); // 将一维数组转换为字符串
        $separateStr = implode(",", $separate); // 将一维数组转换为字符串
        $imgAndCardmsgArr = explode($separateStr, $imgUnpackStr); // 以自定义分隔符分隔出图片字节和身份信息字节
        
        $cardmsgArr = explode(",", $imgAndCardmsgArr[1]); // 取出身份信息字节
        unset($cardmsgArr[0]); // 去除身份信息字节首位空白 (字符串转数组时所留)
        $cardmsg = "";
        foreach ($cardmsgArr as $k => $v) {
            $cardmsg .= pack("C*", $v);    // 打包成二进制文件字符串
        }
 
        return json_decode($cardmsg, true);
    }



}


$encrypt = new Encrypt();

$path = "./001.jpg";

$separate = [255, 0, 255, 0, 255, 0, 255, 206, 210, 202, 199, 183, 214, 184, 244]; // 15字节
$cardmsg = ["name" => "张三", "gender" => "男", "idcard" => 12345678910]; // 53字节





文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/31762.html

相关文章

  • 区块链学习之密码学安全技术(五)

    摘要:非对称加密算法的安全性往往需要基于数学问题来保障,目前主要有基于大数质因子分解离散对数椭圆曲线等经典数学难题进行保护。消息认证码基于对称加密,可以用于对消息完整性进行保护。 Hash 算法与数字摘要 Hash (哈希或散列)算法它能将任意长度的二进制明文串映射为较短的(通常是固定长度的)二进制串(Hash值),并且不同的明文很难映射为相同的Hash值。 Hash 定义 Hash (哈希...

    aboutU 评论0 收藏0
  • 解密算法介绍

    摘要:加密解密算法介绍算法目前常见有加密算法,散列算法,编码算法,使用位关键字作为流加密算法加密技术通常分为两大类对称式和非对称式。对称性加密算法有用途对称加密算法用来对敏感数据等信息进行加密数据加密标准,速度较快,适用于加密大量数据的场合。 加密解密算法介绍 算法目前常见有: 加密算法,散列算法,Base64(编码算法),https(SSL使用40位关键字作为RC4流加密算法) 加密技术通...

    ThinkSNS 评论0 收藏0
  • 安全开发笔记

    摘要:登录注册安全风险登录注册的风险点主要有四个暴力破解撞库遍历注册用户批量注册。引入了验证码机制同样引入了额外的安全风险,比如短信验证码的短信炸弹风险图形验证码的可绕过可识别等。 概述 很多技术研发不了解安全,也不重视安全,只有在自己的服务器被黑掉、被挂马、被脱裤才想起关注安全,但是这个时候,技术架构已经成型、代码已经在线上稳定运行,再亡羊补牢,改代码、改策略,往往成本巨大、确收效很低。所...

    Cruise_Chan 评论0 收藏0
  • Swoole 源码分析——Server模块之OpenSSL (上)

    摘要:另一方比如小明得到公钥之后,双方就可以通信。然而,中间人还是可能截获公钥,然后自己弄一对秘钥,然后告诉小明说是小红的公钥。这样,小亮在签署小红的身份证的时候,可以在小红身份证后面附上自己的身份证。一般来说,自签名的根身份证用于公司内部使用。 前言 自从 Lets Encrypt 上线之后,HTTPS 网站数量占比越来越高,相信不久的未来就可以实现全网 HTTPS,大部分主流浏览器也对 ...

    ky0ncheng 评论0 收藏0

发表评论

0条评论

yearsj

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<