V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waitmoonman
V2EX  ›  PHP

PHP 把源文件加密到 BMP 位图

  •  
  •   waitmoonman · 2017-10-31 09:40:09 +08:00 · 3240 次点击
    这是一个创建于 2606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前看过一个 C++的视频, 说的是把文件隐藏到 BMP 位图中。 学了 PHP 之后,( PHP 是世界上最好的语言) 应该也可以完成这个任务。

    当然并没有什么实际作用,看看就可以了。 所以就动手做了一个~~~ 利用的是 BMP 位图在色道中,每四个字节就有一个字节是无用的,所以就可以把源文件base64化然后单个拆分存入图片中,再重新生成一张 BMP 位图, 表面上看不出有任何变化。大小如果不超过源文件的 1/4 的话,也是不会有变化的:

    比如位图是 5M,需要加密的文件是 1M,当加密后,位图还是 5M,而且已经把需要加密的文件存入位图中

    刚开始,可以加密文件,但是解密出来会有很多无用的字符串。 后来 ,当加密文件时,增加了 2 个标记, 一个标记文件名长度,用四个字节存储, 一个标记文件数据长度。用八个字节存储。 这样就可以保证能准确读取多大的数据块。 上点核心代码: file 演示地址 github 地址 !!! demo 的地址,不需要上传 bmp 也可以的,因为我服务器内置了一张 2.47m 的 bmp, :smiley:, 你只要加密之后会返回一张 BMP 图片, 然后再点击解密按钮选择加密后的 bmp 位图就可以得到源文件了

    8 条回复    2017-10-31 18:04:09 +08:00
    sagaxu
        1
    sagaxu  
       2017-10-31 10:12:35 +08:00
    图片压缩或者缩放后还能解密吗?
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2017-10-31 13:54:15 +08:00
    你这个做法,rgb565 的 bmp 和 rgba 的 bmp 都不适用的,另外宽度不对齐到 4 的 24 位 bmp 有额外的字节可以用

    都是基本操作没啥特别的
    waitmoonman
        3
    waitmoonman  
    OP
       2017-10-31 14:48:38 +08:00
    @sagaxu 不行的。 加密后的图片进行压缩的话,会导致内部的数据错乱,读取的时候会出错的。
    waitmoonman
        4
    waitmoonman  
    OP
       2017-10-31 14:49:31 +08:00
    @GeruzoniAnsasu 受教了,没有深入接触位图的知识,只是看了一篇位图的文章然后写的。
    sagaxu
        5
    sagaxu  
       2017-10-31 15:13:39 +08:00
    @waitmoonman 你可以搜一下图片隐写技术,有很多基于信号变换的算法,能应对缩放或者拉伸
    afeicool
        6
    afeicool  
       2017-10-31 15:16:40 +08:00
    php 确实是最好的语言,没毛病
    waitmoonman
        7
    waitmoonman  
    OP
       2017-10-31 18:03:52 +08:00
    @sagaxu mark, 最近在做毕业设计, 忙完回头看一下, 有没有好的博客直接推荐?
    waitmoonman
        8
    waitmoonman  
    OP
       2017-10-31 18:04:09 +08:00
    @afeicool 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3132 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.