精华内容
下载资源
问答
  • 解密tdata文件的工具。 Telegram Desktop(在台式机上运行,​​而不是在手机上运行)具有一个“ tdata”文件夹,用于存储一些加密文件。 该文件夹通常在Linux上的“〜/ .local / share / TelegramDesktop”和...
  • 该资源为解密通过SQLCipher在Android或者iOS平台加密的数据库,方法简单高效,没有命令语句,只是一个简单的activity,只需要运行,便可解密
  • (从桌面应用程序)解密加密的 data.json文件。 您可以安全地将data.json存储为保管库的加密脱机备份,因为您始终可以解密它。 要确定data.json文件的位置,请参见: 注意:BitwardenDecrypt不适用于Bitwarden...
  • 加密文件解密 学习数据加密/解密(从帮助) 安装密码学库。 了解如何使用对称加密来加密文件,字符串数据,其中单个密钥用于数据的加密和解密
  • AES_CBC解密JS单文件

    2020-07-01 20:39:39
    AES_CBC单文件JS解密,源码是从CryptoJS多个文件中拼装起来的,适用于某些环境下单文件调用。
  • android技术篇(三)解密data

    万次阅读 2017-05-14 21:17:53
    解密
    android技术篇(二)解密data区
    其实data加密和system上锁是相同的性质,不过data加密了部分文件还是可以拷贝进去的,不过里面的数据加密了的是不可修改的,甚至有些连查看都不允许!

    解密data区:

    解密data分区,我知道的目前有2中方法

    一.刷入破解版boot
    1.下载工具
    链接: http://pan.baidu.com/s/1jHbUa4A 密码: c8k6 然后解压两个工具。
    2.将工具里的破解版boot.img解压出来
    把boot.img拖到unpackimg.bat图标上就行(fastboot那个压缩包解压了先别动一会才能用到),解压完成之后,会多出两个文件夹,ramdisk和split_img



    注意:电脑需要安装上对应的ADB驱动
    或者用第三方recovery刷入破解版boot包也行、





    最后把这个新的image-new.img文件复制到刚才解压另一个工具得到的fastboot目录,然后手机进入fastboot模式链接电脑后执行刷入破解后的boot.bat

    二,直接刷入带破解boot的recovery

    带破解版boot的recovery链接: http://pan.baidu.com/s/1skYNTJR 密码: ai4h
    将下载下来的recovery替换掉官方的recovery,然后刷入一个root包(刷root包的过程中会解密data分区)

    下面是这recovery的介绍:
    特点
    自动关闭boot校验
    miui多余应用精简
    ota增量包更新支持
    添加ad-hosts支持
    避免在rec卡屏的问题
    集成SuperSu Pro v2.76
    全新的主题界面
    自动识别中英文
    恢复MIUI官方REC
    更多自行体验


    简要说明:
    1. 增加data分区解密,无需格式化data分区。若解密失效,请取消输入密码并在主界面-清除中选择格式化data分区。(格式化前自行备份资料文件等,如果格式化失败,请检查是否启用rm命令代替格式化)
    2. OTA增量更新支持,本质是备份还原过程,因此有条件限制。使用:在设置-打开支持ota。刷入当前官方系统ROM完整包。本TWRP安装在过程会自动判断并备份。此后在系统正常升级ota增量 无需再次刷入。system分区临时文件的关系,需要额外占用内置储存5.2G以上。非特殊,能不用就别用吧 
    3. 内置Supersu 因签名问题。安装前,请卸载非内置安装SuperSu。或者修改/删除/data/system/packages.xml签名内容。
    4. MIUI多余应用和ad-hosts功能 请参考   小米 4C ZCX-TWRP 
    5. 对于可能极少数rec卡屏无响应 ,请强制重启进入系统。再次进入recovery。通常在首次刷入时候发生。

    展开全文
  • chrome-password-decrypt 合法使用;)
  • Advanced EFS Data Recovery 是一个可以从Windows NTFS分区里解密用 EFS 加密的文件的工具!
  • 首先,加密和加密的大致思想是:加密无非就是对加密后的class文件进行异或一下,解密呢,那就是再对class文件异或回来即可。 加密后的文件如果想要用到的话,就需要classLoader动态加载进来,具体实现为: /...

    该文章所涉及的代码,可以在此处下载:https://github.com/chengqianbygithub/JavaLearningDemos/tree/develop
    在develop分支哦。

    在日常开发中,可能会遇到要对系统中比较敏感的代码进行保护,下面就总结一下保护源码的方法中最简单的方式,即文件加密

    加密和解密的大致思想
    加密无非就是对class文件进行异或一下,解密呢,那就是再对class文件异或回来即可。

    加密后的文件如果想要用到的话,就需要classLoader动态加载进来
    具体实现详情:Java实现自定义classLoader类加载器动态解密class文件

    1、加解密的实现方式

    下面为加解密的实现方式,大部分的解释都放在代码注释里面了。

    /**
     * 加解密类
     */
    public class EdCipher {
    
        // 装加密后的Class文件的目录名
        private String encryptFolderName = "encrypt";
    
        /**
         * 加密方法
         * @param name 需要加密的文件名
         */
        public void encryptClass(String name) {
            // 获取加密前文件的绝对路径
            String path = getAbsolutePathBeforeEncryption(name);
    
            // 为待加密的class文件创建File对象
            File classFile = new File(path);
            if (!classFile.exists()) {
                // TODO 如果文件不存在,做相应的处理。一般情况下都是抛出异常;
            } else {
                // 在 待加密的文件也就是classFile的同级目录下创建一个文件夹,然后把加密后的文件放进去
                File encryptFolder = new File(classFile.getParent() + File.separator + encryptFolderName);
                if (!encryptFolder.exists()) {
                    encryptFolder.mkdirs();
                }
            }
            // 加密后的文件需要单独放,就放在encryptFolderName文件夹下,encryptedFile 为加密后文件的全路径文件名
            String encryptedFile = classFile.getParent() + File.separator + encryptFolderName + File.separator + classFile.getName();
            try (
                    FileInputStream fileInputStream = new FileInputStream(classFile);
                    BufferedInputStream bis = new BufferedInputStream(fileInputStream);
                    FileOutputStream fileOutputStream = new FileOutputStream(encryptedFile);
                    BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream)
                ) {
    
                // 加密
                int data;
                while ((data = bis.read()) != -1) {
                    bos.write(data ^ 0xFF);
                }
                bos.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 现在将原来未加密的文件删除
            classFile.delete();
    
            // 先获取加密前文件绝对路径名,然后修改后缀,再创建File对象
            File oldFile = new File(path + "en");
            // 删除未加密前的文件
            if (oldFile.exists()) {
                oldFile.delete();
            }
            // 根据加密后的文件创建File对象
            File newEncryptedFile = new File(encryptedFile);
            // 将加密后的对象重命名,这时加密后的文件就把加密前的文件替换掉了,这就是为什么刚开始加密后的文件需要单独放的原因
            newEncryptedFile.renameTo(oldFile);
            // 删除之前的加密文件夹下面的加密文件
            newEncryptedFile.getParentFile().delete();
        }
    
        /**
         * 解密方法
         * @param name 需要解密的文件名
         */
        protected byte[] decryptClass(String name) {
            String path;
            if (!name.contains(".class")) {
                path = getAbsolutePathAfterEncryption(name);
            } else {
                path = name;
            }
            // 为待加密的文件创建File对象
            File decryptClassFile = new File(path);
            if (!decryptClassFile.exists()) {
                System.out.println("decryptClass() File:" + path + " not found!");
                return null;
            }
            byte[] result = null;
            BufferedInputStream bis = null;
            ByteArrayOutputStream bos = null;
            try {
                bis = new BufferedInputStream(new FileInputStream(decryptClassFile));
                bos = new ByteArrayOutputStream();
                // 解密
                int data;
                while ((data = bis.read()) != -1) {
                    bos.write(data ^ 0xFF);
                }
                bos.flush();
                result = bos.toByteArray();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bis != null) {
                        bis.close();
                    }
                    if (bos != null) {
                        bos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        /**
         * 获取加密前文件的绝对路径
         * @param name 待加密的文件的全限定名
         * @return 文件的绝对路径
         * 注意:根据待加密的文件的位置不同(外部class,项目内部class),改写改方法。
         * 最终目的就是获取到待加密的文件的绝对路径
         */
        private String getAbsolutePathBeforeEncryption(String name) {
            /*String className = name.substring(name.lastIndexOf(".") + 1) + ".class";
            String path = EdCipher.class.getResource(className).toString();
            path = path.substring(path.indexOf("file:/") + "file:/".length());
            if (System.getProperty("os.name").toUpperCase().contains("LINUX")) {
                path = File.separator + path;
            }*/
            return new File(name).getAbsolutePath();
        }
    
        /**
         * 获取加密后文件的绝对路径
         * @param name 待解密的文件的全限定名
         * @return 文件的绝对路径
         * 注意:根据加密后文件的位置不同(外部class,项目内部class),改写改方法。
         * 最终目的就是获取到加密后文件的绝对路径
         */
        private String getAbsolutePathAfterEncryption(String name) {
            /*String className = name.substring(name.lastIndexOf(".") + 1) + ".classen";
            String path = EdCipher.class.getResource(className).toString();
            path = path.substring(path.indexOf("file:/") + "file:/".length());*/
            return new File(name).getAbsolutePath();
        }
    
        // 测试
        public static void main(String[] args) {
            EdCipher edCipher = new EdCipher();
            edCipher.encryptClass("F:\\Test.class");
             
            // 如果使用Ant打包就可以将上面这句huanchen换成下面这句话。
            // edCipher.encryptClass(args[0]);
        }
    }
    

    1.1、小技巧。

    在加密方法的最后为什么要修改文件的后缀呢?
    这里在文件后面加了一个“en”,最后生成的文件就是xxx.classen,这样做的目的是为了在JVM的Application ClassLoader类加载器加载classpath下面的class字节码时,区别于普通的class字节码文件,因为该文件已经被加密了。如果类加载器将它加载进了虚拟机,那么在进行类加载过程中的验证阶段中的文件格式验证环节的时候,就会验证出不符合Class文件格式的约束,虚拟机就会抛出一个java.lang.VerifyError异常或其子类异常,假设使用的HTTP服务器是tomcat,那么tomcat就会报错,启动不起来。这算是一个小技巧。

    2、拓展:Ant打包时加密

    如果要想在Ant打包的时候,就加密文件,就需要在build.xml配置文件中调用该类的Main方法即可;

    <!-- 加密 -->
    <target name="encrypt">
    	<java classname="EdCipher" failonerror="true">
    		<classpath refid="classpath.run"/>
    		<arg line="需要加密的文件的包名+文件名"/>
    	</java>
    </target>
    

    技 术 无 他, 唯 有 熟 尔。
    知 其 然, 也 知 其 所 以 然。
    踏 实 一 些, 不 要 着 急, 你 想 要 的 岁 月 都 会 给 你。


    展开全文
  • 实现功能: 从网站上爬取采用m3u8分段方式的视频文件,对加密的 "ts"文件解密,实现两种方式合并"ts"文件,为防止IP被封,使用代理,最后删除临时文件。 环境 &依赖 Win10 64bit IDE:Pycharm Python 3.8 Python-...

    俗话说,兴趣所在,方能大展拳脚。so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程。

    实现功能:

    从网站上爬取采用m3u8分段方式的视频文件,对加密的 "ts"文件解密,实现两种方式合并"ts"文件,为防止IP被封,使用代理,最后删除临时文件。

     

    环境 &依赖

    • Win10 64bit
    • IDE:Pycharm
    • Python 3.8
    • Python-site-package:requests + BeautifulSoup + lxml + m3u8 + AES 

    在PyCharm中创建一个项目会创建一个临时目录存放环境和所需要的package包,所以要在PyCharm 中项目解释器(Project Interpreter)中添加所有需要的包,这张截图是本项目的包列表,红框中是所必须的包,其他有的包我也不知道做什么用的。

    下面开始我们的正餐,爬取数据第一步我们需要解析目标网站,找到我们需要爬取视频的地址,F12打开开发者工具

    很不幸,这个网站视频是经过包装采用m3u8视频分段方式加载

    科普一下:m3u8 文件实质是一个播放列表(playlist),其可能是一个媒体播放列表(Media Playlist),或者是一个主列表(Master Playlist)。但无论是哪种播放列表,其内部文字使用的都是 utf-8 编码。

    当 m3u8 文件作为媒体播放列表(Meida Playlist)时,其内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。

    OK,本着“没有解决不了的困难“的原则我们继续,依旧在开发者模式,从Elements模式切换到NetWork模式,去掉不需要的数据,我们发现了两个m3u8文件一个key文件和一个ts文件

    分别点击之后我们可以 看到对应的地址

    OK,现在地址已经拿到了,我们可以开始我们的数据下载之路了。

    首先进行初始化,包括路径设置,请求头的伪装等,之后我们通过循环去下载所有ts文件,至于如何定义循环的次数我们可以通过将m3u8文件下载之后解析文件得到所有ts的列表,之后拼接地址然后循环就可以得到所有ts文件了。

    第一层

    #EXTM3U
    #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=500000,RESOLUTION=720x406
    500kb/hls/index.m3u8

    观察数据,不是真正路径,第二层路径在第三行可以看到,结合我们对网站源码分析再次拼接字符串请求:

    第二层

    #EXT-X-VERSION:3
    #EXT-X-TARGETDURATION:2
    #EXT-X-MEDIA-SEQUENCE:0
    #EXT-X-KEY:METHOD=AES-128,URI="key.key"
    #EXTINF:2.000000,
    IsZhMS5924000.ts
    #EXTINF:2.000000,
    IsZhMS5924001.ts
    
    #EXT-X-ENDLIST

    之后我们循环得到的TS列表,通过拼接地址下载视频片段。但是问题远远没有这么简单,我们下载的ts文件居然无法播放,通过对第二层下载得到的m3u8文件进行分析我们可以发现这一行代码:

    #EXT-X-KEY:METHOD=AES-128,URI="key.key"

    此网站采用AES方法对所有ts文件进行了加密,其中

    METHOD=ASE-128 :说明此视频采用ASE-128方式进行加密,

    URI=“key.key”:代表key的地址

    综上所诉,感觉好难啊,好绕了,都拿到了视频还看不了,但是我们要坚持我们的初心不能放弃。Fortunately,我们应该庆幸Python强大的模块功能,这个问题我们可以通过下载AES模块解决。

    完成之后我们需要将所有ts合并为一个MP4文件,最简单的在CMD命令下我们进入到视频所在路径然后执行:

    copy /b *.ts fileName.mp4

    需要注意所有TS文件需要按顺序排好。在本项目中我们使用os模块直接进行合并和删除临时ts文件操作。

    完整代码:

    方法一:

    import re
    import requests
    import m3u8
    import time
    import os
    from bs4 import BeautifulSoup
    import json
    from Crypto.Cipher import AES
    
    class VideoCrawler():
        def __init__(self,url):
            super(VideoCrawler, self).__init__()
            self.url=url
            self.down_path=r"F:\Media\Film\Temp"
            self.final_path=r"F:\Media\Film\Final"
            self.headers={
                'Connection':'Keep-Alive',
                'Accept':'text/html,application/xhtml+xml,*/*',
                'User-Agent':'Mozilla/5.0 (Linux; U; Android 6.0; zh-CN; MZ-m2 note Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 MZBrowser/6.5.506 UWS/2.10.1.22 Mobile Safari/537.36'
            }
        def get_url_from_m3u8(self,readAdr):
            print("正在解析真实下载地址...")
            with open('temp.m3u8','wb') as file:
                file.write(requests.get(readAdr).content)
            m3u8Obj=m3u8.load('temp.m3u8')
            print("解析完成")
            return m3u8Obj.segments
    
        def run(self):
            print("Start!")
            start_time=time.time()
            os.chdir(self.down_path)
            html=requests.get(self.url).text
            bsObj=BeautifulSoup(html,'lxml')
            tempStr = bsObj.find(class_="iplays").contents[3].string#通过class查找存放m3u8地址的组件
            firstM3u8Adr=json.loads(tempStr.strip('var player_data='))["url"]#得到第一层m3u8地址
            tempArr=firstM3u8Adr.rpartition('/')
            realAdr="%s/500kb/hls/%s"%(tempArr[0],tempArr[2])#一定规律下对字符串拼接得到第二层地址, 得到真实m3u8下载地址,
            key_url="%s/500kb/hls/key.key"%tempArr[0]#分析规律对字符串拼接得到key的地址
            key=requests.get(key_url).content
            fileName=bsObj.find(class_="video-title w100").contents[0].contents[0]#从源码中找到视频名称的规律
            fileName=re.sub(r'[\s,!]','',fileName) #通过正则表达式去掉中文名称中的感叹号逗号和空格等特殊字符串
            cryptor=AES.new(key,AES.MODE_CBC,key)#通过AES对ts进行解密
            urlList=self.get_url_from_m3u8(realAdr)
            urlRoot=tempArr[0]
            i=1
            for url in urlList:
                resp=requests.get("%s/500kb/hls/%s"%(urlRoot,url.uri),headers=crawler.headers)
                if len(key):
                    with open('clip%s.ts' % i, 'wb') as f:
                        f.write(cryptor.decrypt(resp.content))
                        print("正在下载clip%d" % i)
                else:
                    with open('clip%s.ts'%i,'wb') as f:
                        f.write(resp.content)
                        print("正在下载clip%d"%i)
                i+=1
            print("下载完成!总共耗时%d s"%(time.time()-start_time))
            print("接下来进行合并......")
            os.system('copy/b %s\\*.ts %s\\%s.ts'%(self.down_path,self.final_path,fileName))
            print("删除碎片源文件......")
            files=os.listdir(self.down_path)
            for filena in files:
                del_file=self.down_path+'\\'+filena
                os.remove(del_file)
            print("碎片文件删除完成")
    if __name__=='__main__':
        crawler=VideoCrawler("地址大家自己找哦")
        crawler.start()
        crawler2=VideoCrawler("地址大家自己找哦")
        crawler2.start()

    方法二
    在方法一中我们是下载所有ts片段到本地之后在进行合并,其中有可能顺序会乱,有时候解密的视频还是无法播放合并之后会导致整个视频时间轴不正确而且视频根本不能完整播放,在经过各种努力,多方查资料之后有的问题还是得不到完美解决,最后突发奇想,有了一个新的想法,我们不必把所有ts片段都下载到本地之后进行合并,而是采用另一种思维模式,一开始我们只创建一个ts文件,然后每次循环的时候不是去下载ts文件而是将通过地址得到的视频片段文件流直接添加到我们一开始创建的ts文件中,如果出现错误跳出当前循环并继续下次操作,最后我们直接得到的就是一个完整的ts文件,还不需要去合并所有片段。具体看代码如何实现。

    本代码好多地方和上面都一样,我们只需要领悟其中的原理和方法就OK了

    import re
    import requests
    import m3u8
    import time
    import os
    from bs4 import BeautifulSoup
    import json
    from Crypto.Cipher import AES
    import sys
    import random
    
    class VideoCrawler():
        def __init__(self,url):
            super(VideoCrawler, self).__init__()
            self.url=url
            self.down_path=r"F:\Media\Film\Temp"
            self.agency_url='https://www.kuaidaili.com/free/'  #获取免费代理的网站,如果网站过期或者失效,自己找代理网站替换
            self.final_path=r"F:\Media\Film\Final"
            self.headers={
                'Connection':'Keep-Alive',
                'Accept':'text/html,application/xhtml+xml,*/*',
                'User-Agent':'Mozilla/5.0 (Linux; U; Android 6.0; zh-CN; MZ-m2 note Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 MZBrowser/6.5.506 UWS/2.10.1.22 Mobile Safari/537.36'
            }
        def get_url_from_m3u8(self,readAdr):
            print("正在解析真实下载地址...")
            with open('temp.m3u8','wb') as file:
                file.write(requests.get(readAdr).content)
            m3u8Obj=m3u8.load('temp.m3u8')
            print("解析完成")
            return m3u8Obj.segments
        def get_ip_list(self,url, headers):
            web_data = requests.get(url, headers=headers).text
            soup = BeautifulSoup(web_data, 'lxml')
            ips = soup.find_all('tr')
            ip_list = []
            for i in range(1, len(ips)):
                ip_info = ips[i]
                tds = ip_info.find_all('td')
                ip_list.append(tds[0].text + ':' + tds[1].text)
            return ip_list
        def get_random_ip(self,ip_list):
            proxy_list = []
            for ip in ip_list:
                proxy_list.append('http://' + ip)
            proxy_ip = random.choice(proxy_list)
            proxies = {'http': proxy_ip}
            return proxies
    
        def run(self):
            print("Start!")
            start_time=time.time()
            self.down_path = r"%s\%s" % (self.down_path, uuid.uuid1())#拼接新的下载地址
            if not os.path.exists(self.down_path): #判断文件是否存在,不存在则创建
                os.mkdir(self.down_path)
            html=requests.get(self.url).text
            bsObj=BeautifulSoup(html,'lxml')
            tempStr = bsObj.find(class_="iplays").contents[3].string#通过class查找存放m3u8地址的组件
            firstM3u8Adr=json.loads(tempStr.strip('var player_data='))["url"]#得到第一层m3u8地址
            tempArr=firstM3u8Adr.rpartition('/')
            all_content = (requests.get(firstM3u8Adr).text).split('\n')[2]#从第一层m3u8文件中中找出第二层文件的的地址
            midStr = all_content.split('/')[0]#得到其中有用的字符串,这个针对不同的网站采用不同的方法自己寻找其中的规律
            realAdr = "%s/%s" % (tempArr[0], all_content)#一定规律下对字符串拼接得到第二层地址, 得到真实m3u8下载地址,
            key_url = "%s/%s/hls/key.key" % (tempArr[0], midStr)#分析规律对字符串拼接得到key的地址
            key_html = requests.head(key_url)#访问key的地址得到的文本
            status = key_html.status_code#是否成功访问到key的地址
            key = ""
            if status == 200:
                all_content=requests.get(realAdr).text#请求第二层m3u8文件地址得到内容
                if "#EXT-X-KEY" in all_content:
                    key = requests.get(key_url).content#如果其中有"#EXT-X-KEY"这个字段说明视频被加密
            self.fileName = bsObj.find(class_="video-title w100").contents[0].contents[0]#分析网页得到视频的名称
            self.fileName=re.sub(r'[\s,!]','',self.fileName)#因为如果文件名中有逗号感叹号或者空格会导致合并时出现命令不正确错误,所以通过正则表达式直接去掉名称中这些字符
            iv = b'abcdabcdabcdabcd'#AES解密时候凑位数的iv
            if len(key):#如果key有值说明被加密
                cryptor = AES.new(key, AES.MODE_CBC, iv)#通过AES对ts进行解密
            urlList=self.get_url_from_m3u8(realAdr)
            urlRoot=tempArr[0]
            i=1
            outputfile=open(os.path.join(self.final_path,'%s.ts'%self.fileName),'wb')#初始创建一个ts文件,之后每次循环将ts片段的文件流写入此文件中从而不需要在去合并ts文件
            ip_list=self.get_ip_list(self.agency_url,self.headers)#通过网站爬取到免费的代理ip集合
            for url in urlList:
                try:
                    proxies=self.get_random_ip(ip_list)#从ip集合中随机拿到一个作为此次访问的代理
                    resp = requests.get("%s/%s/hls/%s" % (urlRoot, midStr, url.uri), headers=crawler.headers,proxies=proxies)#拼接地址去爬取数据,通过模拟header和使用代理解决封IP
                    if len(key):
                        tempText=cryptor.decrypt(resp.content)#解密爬取到的内容
                        progess=i/len(urlList)#记录当前的爬取进度
                        outputfile.write(tempText)#将爬取到ts片段的文件流写入刚开始创建的ts文件中
                        sys.stdout.write('\r正在下载:%s,进度:%s %%'%(self.fileName,progess))#通过百分比显示下载进度
                        sys.stdout.flush()#通过此方法将上一行代码刷新,控制台只保留一行
                    else:
                        outputfile.write(resp.content)
                except Exception as e:
                    print("\n出现错误:%s",e.args)
                    continue#出现错误跳出当前循环,继续下次循环
                i+=1
            outputfile.close()
            print("下载完成!总共耗时%d s"%(time.time()-start_time))
            self.del_tempfile()#删除临时文件
        def del_tempfile(self):
            file_list=os.listdir(self.down_path)
            for i in file_list:
                tempPath=os.path.join(self.down_path,i)
                os.remove(tempPath)
            os.rmdir(self.down_path)
            print('临时文件删除完成')
    if __name__=='__main__':
        url=input("输入地址:\n")
        crawler=VideoCrawler(url)
        crawler.run()
        quitClick=input("请按Enter键确认退出!")

    碰到的问题:

    一、一开始以为电脑中Python环境中有模块就OK了,最后发现在Pycharm中自己虚拟的环境中还需要添加对应模块,

    二、No module named Crypto.Cipher ,网上看了很多最后通过添加pycryptodome模块解决,电脑环境Win10

    三、文件名不能有感叹号,逗号或者空格等这些特殊字符,不然执行合并命令的时候会提示命令不正确

    四、在下载中将ts文件流写入文件时会出现这种错误('Data must be padded to 16 byte boundary in CBC mode',) Data must be padded,我们直接continue跳出当前循环继续下次下载。

    五、有时出现 “Protocol Error, Connection abort, os.error”,应该是爬取操作太频繁ip被封,针对此问题我们使用免费代理。

     

    ok 我们可以生成exe去开心的下载自己想要的视频了,happy!!!

    参考链接:

    python m3u8视频ts解密合成完整mp4

    Python爬取视频之爱情电影

    展开全文
  • Base64加密上传文件----解密下载文件

    千次阅读 多人点赞 2020-03-27 10:03:48
    * 上传文件加密 * @param imgFile 文件路径 * @return */ public static String imageToBase64Str(String imgFile) { InputStream inputStream = null; byte[] data = null; try { inputStream = new ...

    简介:
    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
    Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
    Base64由于以上优点被广泛应用于计算机的各个领域,然而由于输出内容中包括两个以上“符号类”字符(+, /, =),不同的应用场景又分别研制了Base64的各种“变种”。为统一和规范化Base64的输出,Base62x被视为无符号化的改进版本。
    中文名基于64个可打印字符来表示二进制数据外文名base64属 性编码方式应 用用于传输8Bit字节代码定 义8Bit字节代码的编码方式之一可用于在HTTP环境下传递较长的标识信息特 性Base64编码具有不可读性
    在这里插入图片描述
    上传文件加密

    /**
         * 上传文件加密
         * @param imgFile 文件路径
         * @return
         */
        public static String imageToBase64Str(String imgFile) {
            InputStream inputStream = null;
            byte[] data = null;
            try {
                inputStream = new FileInputStream(imgFile);
                data = new byte[inputStream.available()];
                inputStream.read(data);
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 加密
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    
    

    解密下载

       /**
         * base64 这个转换base64图片为图片的时候需要做一些转换
         * @param img base64
         * @param path 存储路径
         * @param imgName 图片名
         * @throws IOException
         * @return 返回图片名字
         */
        public static String base64StrToImage(String path, String img, String imgName) throws IOException {
            if (img==null){
                return null;
            }
            BASE64Decoder decoder = new BASE64Decoder();
            //前台在用Ajax传base64值的时候会把base64中的+换成空格,所以需要替换回来。
            String baseValue = img.replaceAll(" ", "+");
            //去除base64中无用的部分
            byte[] b = decoder.decodeBuffer(baseValue.replace("data:image/png;base64,", ""));
            for (int i = 0; i < b.length; ++i) {
                // 调整异常数据
                if (b[i] < 0) {
                    b[i] += 256;
                }
            }
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
    
            String imgPath = path + imgName + ".pdf";
            OutputStream out = new FileOutputStream(imgPath);
            //写入数据
            out.write(b);
            out.flush();
            out.close();
            return imgName + ".pdf";
        }
    

    在这里插入图片描述
    解密下载(2)

    **
          * 将base64的字符串转成图片
          * @param imgStr base64图片的字符串
          * @param imgFilePath 本地图片存储路径
          * @return
          */
      public static boolean generateImage(String imgStr,String imgFilePath) {
        if(imgStr == null) {
           return false;
          }
         byte[] b;
      try {
       b = new BASE64Decoder().decodeBuffer(imgStr.replace("data:image/png;base64,", ""));
         for (int i = 0; i < b.length; i++) {
           if(b[i]<0) {
               b[i]+=256;
     }
     }
       OutputStream out = new FileOutputStream(imgFilePath);
       out.write(b);
       out.flush();
       out.close();
        return true;
      } catch (IOException e) {
    e.printStackTrace();
       return false;
    }
    }
    

    测试类

      @Test
        void contextLoads() throws IOException {
            //上传文件加密
            String s = imageToBase64Str("E:\\img\\4.jpg");
            System.out.println(s);
           //第一种下载解密
            base64StrToImage("E:\\image\\",s,"4");
            //第二种下载解密
            generateImage("strImg", "E:\\image\\2.jpg");
        }
    

    运行:
    加密
    在这里插入图片描述
    解析
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • Java实现文件的加密与解密

    万次阅读 2019-04-17 09:20:49
     先对文件与加密的相关知识做一个极为简单的科普(知道的可以跳过)。 文件与字串 A、文件的操作流程一般为:打开–>读取–>对内容进行变换–>写入–>关闭。 B、常规性文件操作会用到的类有五个:File...
  • RSA加密解密(读取文件)

    万次阅读 2016-08-09 17:46:55
    RSA加密解密需要用到一对公私钥。...这次讲解一下从文件读取的公私钥,用来加密的问题。至于openssl的安装和用途就不介绍了,网上很多方法。这里介绍的是如何使用openssl和openssl生成公私钥后如何使用到ios端。
  • Advanced EFS Data Recovery--证书密钥解密 是一个可以从WindowsNTFS分区里解密用EFS加密的文件的工具
  • 国密 SM4 文件解密

    千次阅读 2020-04-15 14:51:31
    国密算法SM4 对文件解密 说明:调用开源bcprov-jdk15on 加密算法工具,使用SM4算法,对文件进行加密、解密文件流的操作使用hutool工具包来实现。 引用依赖 <dependency> <groupId>org.bouncy...
  • C#实现AES算法对文件的加密解密

    千次阅读 2020-04-24 11:25:56
    本文实现了C#内置的AES算法对文件进行加密解密。有关AES的介绍不再赘述,主要讲如何实现文件的加密解密。项目工程源代码下载 网上的实现基本上都是要16,24或32位密码,密钥向量也要16位,都固定死在程序中,在此...
  • java实现AES加密解密--文件解密

    千次阅读 2019-06-29 09:53:13
    * 文件解密 * * * @param key * @param sourceFilePath * @param destFilePath * @throws Exception */ public static void decryptFile(String key, String sourceFilePath, String destFilePath) ...
  • EFS解密工具Advanced+EFS+Data+Recovery+V4.2绿色版,经验证能EFS解密
  • 开发必懂的文件解密

    千次阅读 2021-11-24 01:24:06
    大家好,我是 漫步 ,今天来分享一篇关于文件加密和解密相关的,喜欢我的分享记得关注我并设为星标。本文作者:coolyuantao[1]背景最近团队遇到一个小需求,存在两个系统 A、B,系统...
  • XML 文件加密与解密

    千次阅读 2019-07-02 18:55:23
    做这个小程序实属无奈,客户担心文件泄露,要求我们加密,其实都不是什么重要的文件,纯属是客户给我们加工作量...加密解密文件当然要有相关的加密解密函数: public void Decrypt(string filename)//解密函数 { ...
  • 关于本地文件的m3u8格式 从网站上下载的m3u8文件格式是这样的 如果想用ffmpeg文件在线处理,直接把其中的XXXXXX.ts和key.key文件替换成全路径的就可以,比如这样: 然后直接用ffmpeg命令处理这个m3u8文件就...
  • m3u8\ts片段文件解密合成转换

    千次阅读 2021-01-26 19:41:56
    简介 参考 直播流m3u8网页怎么下载? [原创工具] M3U8批量下载器 V1.4.6【9月15日更新】 m3u8中ts文件无损批量合并与转换方法
  • AES加密解密/本地文件读写/Json解析

    千次阅读 2018-08-27 22:41:29
    关于数据加密,前段时间...4. 读取本地加密文件,进行解密操作 5. Json解析 (刚开始的做法,是把二进制文件转化为字符串,然后保存,在读取的时候出现了问题,报错存贮的和读取的字符串不一致,应该是中间数据...
  • 声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 项目场景: ...2.我们可以看到他的数据都在encrypt_data里,是经过加密的,我们需要找出他解密的js,老方法
  • 超大文件采用AES加密,在Android手机上采用FileChannel,一次读取一定的字节数,而后再进行加密解密,最后再通过FileChannel生成新文件 几番折磨终有结果,现将Demo整理出来。。。 package com.king.zjc; ...
  • 最近公司需要对本公司的一些下载文件进行加密解密需求,也就尝试去实现下,其实需要借助第三方的jar包:bcprov-jdk15on-155.jar,下载这个可以到网上搜或者下载本人的demo即可,注意:需要加密和解密的key是一致的才...
  • Chrome在2月份更新了版本 80.0.3987.122(正式版本) (64 位),以前写的抓取Cookies文件的脚本用不了,会提示:pywintypes.error: (13, ‘CryptProtectData’, ‘数据无效。’) 可能时间短,网上这方面资料很少,...
  • 最近要实现一个对数据字典中上传的文件流的加密处理,并存入缓存的处理...重点讲对文件流的加密和解密,废话不多说,看红色代码:  /** *  * @Description: 保存数据字典并缓存 * @author  * @param sysCodeAttr  * @
  • C#文件加密和解密

    万次阅读 多人点赞 2017-07-28 00:14:15
    //由于项目需要,要对文件进行加密操作,所以对这个功能做了一点学习。不难,需要注意的地方也不多: ...一、算法首先,文件要加密就一定要解密,所以一定要找个能解密的算法,这个不用多说……其实加密解密算法也

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,060
精华内容 25,224
关键字:

如何解密data文件