当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-30 05:16:01 PHP

图片加解密可以通过修改字节的方式对人员身份证图片进行加密,也可以将身份证信息写入图片中。可以直接将以下代码复制到php文件中进行测试。有关详细信息,请参阅代码。255,2=>216,3=>255,…,29124=>217]//关闭一个打开的文件指针fclose($fileId);$tempArr=[];//自定义加密规则($i=1;$i<=$fileSize;$i++){$value=0;如果($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=内爆('',$tempArr);//用字符串替换解压后的一维数组file_put_contents($filePath,$img);//重写图片}/***图片对称解密**@param[string]$filePath图片路径*@returnvoid*/publicfunctiondec($filePath){$fileId=fopen($filePath,'rb+');$fileSize=文件大小($filePath);$img=fread($fileId,$fileSize);$imgUnpack=unpack('C*',$img);fclose($fileId);$tempArr=[];//开始解密for($i=1;$i<=$fileSize;$i++){$value=0;如果($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);}/***图像附加器Information**@param[string]$filePathImagepath*@param[array]$cardmsg要添加的信息数组*@param[array]$separateseparatearray(类似于制作一个加密的separatedkey)*@returnvoid*/publicfunctionencmsg($filePath,$cardmsg,$separate){//文档中的建议:为了可移植性,强烈建议在使用fopen()打开文件时始终使用'b'标志$fileId=fopen($filePath,'rb+');//获取文件大小的字节数(29124)$fileSize=fileSize($filePath);//读取文件并返回读取的字符串(读出的是二进制序列)$img=fread($fileId,$fileSize);//使用“unsignedchar”从二进制字符串中解包数据//(打包、解包用法)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);//合并图片字节,自定义分隔数组(类似手动添加键值),身份信息字节$mergeArr=array_merge($imgUnpack,$separate,$cardmsgUnpack);$包=[];foreach($mergeArras$k=>$v){$pack[]=pack('C*',$v);}$packStr=join('',$pack);file_put_contents($filePath,$packStr);//rewriteimage}/***获取附加到图片的信息**@param[string]$filePath图片路径*@param[array]$separate定义的分隔数组(分隔键)*@return[string]添加图片信息*/publicfunctiondecmsg($filePath,$separate){//文档咨询:为了便携性,强烈建议在使用fopen()打开文件时始终使用“b”标志$fileId=fopen($filePath,'rb+');//获取文件大小的字节数(29192)$fileSize=fileSize($filePath);//读取文件并返回读取的字符串(读出的是二进制序列)$img=fread($fileId,$fileSize);//使用“unsignedchar”从二进制字符串中解压数据$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]);//提取身份信息bytesunset($cardmsgArr[0]);//去除身份信息字节的第一个空白(字符串转数组时保留)$cardmsg='';foreach($cardmsgArras$k=>$v){$cardmsg.=pack('C*',$v);//打包成二进制字符串}returnjson_decode($cardmsg,true);}}$encrypt=newEncrypt();$path='./001.jpg';$separate=[255,0,255,0,255,0,255,206,210,202,199,183,214,184,244];//15bytes$cardmsg=['name'=>'张三','gender'=>'男','idcard'=>12345678910];//53字节