发明内容
本发明的目的在于提供一种流媒体的加密与解密方法及装置,以解决上述背景技术中提到的现有的流媒体文件加解密效率低、安全性薄弱等问题。
为实现上述目的,本发明采用以下技术方案:
根据本发明的一个方面,提供一种流媒体的加密与解密方法,所述方法包括:发送方执行文件加密处理,接收方执行文件解密处理;
所述文件加密处理包括:
获取文件的关键信息组合并编码,使用哈希算法进行运算得到track_id;
生成一个关键密钥,将所述关键密钥与所述track_id进行异或运算,生成Blowfish密钥;
将所述文件分割为分块文件,对所述分块文件使用Blowfish算法的CBC加密模式进行加密生成加密文件;
所述文件解密处理包括:
接收所述关键密钥,对所述加密文件传入文件ID并编码,进行哈希运算生成md5_hash字符串;
将所述md5_hash字符串的前16个字符和后16个字符以及所述关键密钥,三个参数中同一索引位置的元素组合为一个元组;
循环读取所述元组并执行异或操作,转换为ASCII字符并编码得到所述Blowfish密钥;
对所述加密文件进行循环分块读取,使用Blowfish算法和所述Blowfish密钥进行解密生成解密文件。
基于前述方案,所述关键信息包括但不限于流媒体文件的标题、作者、时长、格式信息,将所述关键信息按一定顺序排列组合并进行UTF-8编码。
基于前述方案,所述生成一个关键密钥,包括创建一个缓冲区以存储随机字节序列,指定生成字节序列的长度,调用RAND_bytes函数,将所述缓冲区和所述长度传入,生成所述关键密钥。
基于前述方案,所述生成Blowfish密钥,包括将所述关键密钥和所述track_id转换为整数,并执行异或运算,将运算结果转换为十六进制字符串,得到所述Blowfish密钥。
基于前述方案,所述使用Blowfish算法的CBC加密模式,先指定一个初始化向量,所述初始化向量与初始分块文件进行运算加密。
基于前述方案,所述执行异或操作,包括获取所述元组中每个元素的Unicode值,先对第一个元素与第二个元素进行异或运算得到中间值,再对所述中间值与第三个元素进行异或运算。
基于前述方案,循环分块读取所述加密文件时,定义文件块的大小与所述分块文件相同。
根据本发明的另一方面,提供一种流媒体的加密与解密装置,该系统包括加密模块和解密模块;所述解密模块包括接收单元,第二运算单元,分组单元,解密单元;
所述加密模块包括获取单元,第一运算单元,加密单元;
所述获取单元,获取待加密文件的关键信息组合,并进行UTF-8编码;
所述第一运算单元,使用哈希算法进行运算得到track_id;将所述track_id与传入的关键密钥进行异或运算,生成Blowfish密钥;
所述加密单元,使用Blowfish算法的CBC加密模式进行加密处理生成加密文件;
所述接收单元,接收所述关键密钥、所述加密文件和文件ID并编码;
所述第二运算单元,将进行哈希运算生成md5_hash字符串;
所述分组单元,对传入参数的同一索引位置的元素组合为一个元组;
所述解密单元,循环读取所述元组并执行异或操作,转换为ASCII字符并编码得到所述Blowfish密钥;循环分块读取所述加密文件,使用Blowfish算法和所述Blowfish密钥进行解密生成解密文件。
基于前述方案,所述分组单元传入三个参数,包括所述md5_hash字符串的前16个字符,所述md5_hash字符串的后16个字符和所述关键密钥。
由上述技术方案可知,本发明与现有技术相比至少具备以下优点和积极效果:
(1)采用Blowfish算法对分块文件进行加密与解密,实现了流媒体文件在传输和存储过程中的高度安全性;
(2)流媒体文件的分块处理,对数据块进行加密与解密操作,将加密和解密过程分离,保证文件的安全性并节省了加密与解密的计算资源,有效提高加密与解密的处理速度;
(3)根据流媒体文件的track_id生成不同的密钥,使得加密与解密操作具有灵活性和个性化的特点,具有足够的安全性保障。
本发明应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本发明。
具体实施方式
为了更加清楚的阐述本发明的目的、技术方案和优点,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本发明将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本发明的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本发明的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本发明的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
下面结合具体实施例对本发明进行详细的说明:
实施例1
如图1所示,本实施例提供了一种流媒体的加密与解密方法,该方法具体如下:
S1:发送方执行文件加密处理;
如图2所示,文件加密处理的方法步骤具体如下:
S11:获取文件的关键信息组合并编码,使用哈希算法进行运算得到track_id;
在本实施例中,以传送音频文件为例进行加解密操作;发送方终端首先获取音频文件的关键信息,按照特定顺序进行组合,对组合后的信息进行UTF-8编码,然后使用哈希运算生成track_id;
具体地,读取音频的ID3标签获取歌曲名称、艺术家、专辑、发行年份的信息,将获取到的信息按照上述顺序进行排列组合,并使用UTF-8进行编码处理,再使用SHA-256哈希算法对编码后的所述组合信息进行哈希运算得到track_id;如歌手Taylor Swift的歌曲《Cruel Summer》,得到关键信息组合为"Cruel Summer"+"Taylor Swift"+"Lover"+"2019",调用encode进行UTF-8编码得到:b'Cruel SummerTaylor SwiftLover2019';使用hashlib.sha256()创建SHA-256哈希对象,将编码后的内容传入hexdigest函数内进行哈希运算,并截取前16个字符作为track_id,生成的值为“03e95df237694d7a”;
进一步地,音频文件的关键信息组合起来可以表示音频文件的唯一性,为确保文件信息在不同平台上的一致性,需要对所得到的关键信息组合进行UTF-8编码,以便在任何情况下都能够正确地识别它们;SHA-256是一种安全的哈希算法,可以将任何长度的信息转换为固定长度的散列值,运用哈希算法可以保证track_id是不可逆的、唯一的,并且具有足够的安全性保障;最终得到的track_id将是一串字符,可以用于区分不同的音频文件,以及用于识别它们的版权信息等;
S12:生成一个关键密钥,将所述关键密钥与所述track_id进行异或运算,生成Blowfish密钥;
本实施例中,使用OpenSSL的RAND_bytes函数生成关键密钥,使用生成的密钥与track_id进行异或运算,生成Blowfish密钥;
具体地,创建一个缓冲区buffer来存储随机字节序列,再指定生成的字节序列number为8,调用RAND_bytes函数,把buffer和number传入,生成的值为“92f6ac47e2a1cddd”这段随机字节序列就是所需要的关键密钥;将RAND_bytes函数生成的关键密钥和track_id,从十六进制字符串转换为整数,使用Python的位运算符‘^’来执行异或运算,再将结果转换为十六进制字符串为“911ff1b5d5c880a7”,最生成的Blowfish密钥为“b'j4f1e`bb5336c706'”;
进一步地,使用OpenSSL的RAND_bytes函数生成关键密钥,首先导入OpenSSL库并初始化OpenSSL;创建一个缓冲区(buffer),用于存储生成的随字节序列;指定要生成的字节序列的长度,调用RAND_bytes函数,将缓冲区和长度作为参数传入;RAND_bytes函数会生成指定长度的随机字节序列,并存储在缓冲区中,这个随机字节序列是为生成的关键密钥;
进一步地,异或运算是一种位运算,逐位比较两个二进制数的对应位,若对应位相同则结果为0,若对应位不同则结果为1;在生成Blowfish密钥时,通常会使用一个初始密钥(也称为主密钥)作为输入,以及一个唯一的标识符(例如track_id)作为另一个输入;首先,将初始密钥和标识符分别转换为二进制形式;然后,将两个二进制数进行异或运算,逐位比较并得到一个新的二进制数;最后,将新的二进制数转换回十六进制形,得到生成的Blowfish密钥;需要注意的是,Blowfish密钥的生成过程不只是简单的异或运算,Blowfish算法还有其他复杂的过程,包括迭代和子密钥生成等,实际使用时,应遵循Blowfish法的规范和具体实现方式来生成有效的Blowfish密钥;
S13:将所述文件分割为分块文件,对所述分块文件使用Blowfish算法的CBC加密模式进行加密生成加密文件;
本实施例中,将音频文件进行分块处理,使用Blowfish算法的CBC(密码块链接)模式,指定初始化向量,对分块文件进行数据加密;
具体地,使用OpenSSL的RAND_bytes函数生成Blowfish算法中CBC的初始化向量;初始化向量是一个固定长度的随机值,通常与第一个密码块一起使用;CBC(Cipher BlockChaining)模式是一种分组密码的加密模式,常用于数据加密和保护通信的机密性;在CBC模式中,明文数据被分成固定大小的密码块,并与前一个密码块(数据块)进行异或运算后再进行加密,由于初始密码块前没有密码块,因此需要使用初始化向量与初始密码块进行异或运算;
进一步地,使用OpenSSL的RAND_bytes函数生成Blowfish算法中CBC的初始化向量,包含OpenSSL库的头文件:`#include<openssl.h>`,定义一个足够大的缓冲区用存储生成的随机数,例如,对于128位的初始化向量,可以使用16字的缓冲区:`unsigned char iv[16];`;调用RAND_bytes函数生成随机数:`RAND_bytes(iv,sizeof(iv));`;检查RAND_bytes函数的返回值,确保生成随机数的过程没有发生错误,如果返回0,则表示生成失败;现在iv缓冲区中的内容就是生成的随机数,可以用作Blowfish算法中CBC模式的初始化向量;需要注意的是;在使用RAND_bytes函数生成随机数时,应确保OpenSSL的初始化过程已经完成,可通过调用`OpenSSL_add_all_algorithms();`来初始化OpenSSL;另外,Blowfish算法中CBC模式的初始化向量长度通常为8字节(64位)或16字节(128位),具体取决于实际需求;
进一步地,将文件进行分块处理:使用Python的with open函数读取文件,获得文件对象,调用read函数指定读取块的大小;假设我们指定分块大小为2048*3,前2048字节进行加密,后面的不进行加密;利用Blowfish算法对数据库进行加密,创建Blowfish对象,然后调用encrypt函数,传入初始化向量和Blowfish密钥和分块数据进行加密,最后将加密后的各分块数据合并,合并过程就是将加密后的数据进行累加拼接;将合并后的数据结果保存为新的文件,文件格式没有发生变化,与加密前的文件格式相同,例如MP3,文件数据已被加密,无法正常播放;
进一步地,由于对大块数据进行加密与解密处理需要较长的处理时间,因此将文件分割为合适大小的块状数据,通过只对文件块的前部分进行加密,可以减少需要进行加密和解密的字节数量,从而提高整体的处理速度;并且节省计算资源,加密和解密操作通常需要消耗大量计算资源,通过只对文件块的前部分进行加密,可以减少加密操作的开销,从而节省计算资源,使得解密过程更高效;通过对文件分块进行加密,即使被破解也只能解密部分明文,提高了文件的安全性;
进一步地,使用分块加密可以将加密和解密过程分离,即可以对原文件分块加密输出密文,然后将密文按分块存储在不同的位置,这种方法不但可以保证安全性,而且可以方便地实现文件的远程传输与数据持续更新等需求;文件分块加密也为保护项目提供了更好的版本控制,如果在使用加密方式时,用户删除了错误的文件,并且包含有重要信息的解密后的块被损坏,那么用户将不得不重新加密整个文件,而分块加密能够解决这个问题,即使有块遗失或损坏,其余文件块也可以解密成功。
S2:接收方执行文件解密处理;
如图3所示,文件解密处理的方法步骤具体如下:
S21:接收所述关键密钥,对所述加密文件传入文件ID并编码,进行哈希运算生成md5_hash字符串;
本实施例中,接收方终端获取加密文件和关键密钥,读取加密文件,传入音乐文件的ID号,并编码为字节,计算其MD5哈希值,生成一个md5_hash字符串;
具体地,使用上述步骤S12中通过OpenSSL的RAND_bytes函数生成的关键密钥“92f6ac47e2a1cddd”,向音乐文件传入音乐文件的ID号,并编码为字节,编码结果为“b'92f6ac47e2a1cddd'”,计算其MD5哈希值得到“a50f11d7490a6dab230a522bd8bf6750”。
S22:将所述md5_hash字符串的前16个字符和后16个字符以及所述关键密钥,三个参数中的同一索引位置的元素组合为一个元组;
本实施例中,对计算得到的md5_hash字符串进行解密,取md5_hash的前16个字符和后16个字符,分别为md5_hash[:16]和md5_hash[16:];在Python中使用zip函数,传入三个参数,分别是哈希值的前16位,即md5_hash[:16]、哈希值的后16位,即md5_hash[16:]、关键密钥;使用zip函数对这三个参数进行逐个元素分组配对,将三个参数中的同一个索引位置的元素组合成一个新的元组,第一次取三个参数的第一个元素组成元组,第二次取三个参数的第二个元素组成元组,后续依次组成;
具体地,若md5_hash[:16]为“a50f11d7490a6dab”,md5_hash[16:]为“230a522bd8bf6750”,关键密钥为“92f6ac47e2a1cddd”,则使用zip函数得到对应的元组集合:第一个元组包含三个参数的第一个元素的值,具体为:(a,2,9),第二个元组包含三个参数的第二个元素的值,具体为:(5,3,2),……后续元组以此类推。
S23:循环读取所述元组并执行异或操作,转换为ASCII字符并编码,得到所述Blowfish密钥;
本实施例中,使用for循环读取zip函数返回的值,每次会读取一个元组,每个元组包含三个元素,将元组传入特定的函数中进行异或运算;
具体地,进行异或运算首先将每个元组中每个元素都转换为Unicode值(整数表示),使用Unicode值将第一个元素与第二个元素进行异或,得到一个中间值,对该中间值与第三个元素进行异或运算,最终将计算得到的值转换为对应的ASCII字符返回;将for循环中得到的值进行拼接,得到Blowfish密钥。
S24:对所述加密文件进行循环分块读取,使用Blowfish算法和所述Blowfish密钥进行解密生成解密文件;
本实施例中,由于加密文件为分块文件加密后合并而成,因此解密时需对加密文件进行循环分块读取再进行解密;使用Blowfish算法和所述Blowfish密钥,对每次读取的文件块进行对应的解密;
具体地,定义文件块的大小为CHUNK_SIZE,与加密时分块的大小相同,如果块的长度大于等于2048字节,那么会将前2048字节的数据传递给Blowfish算法进行解密,而剩余的字节(超过2048字节)将保持未加密状态;如果块的长度小于2048字节,则整个块都不会被加密,直接添加到数据中,解密时需要传入blowfish_key和初始化向量;
进一步地,使用传入的初始化向量对第一个分块进行初始化操作,对每一个分块进行解密操作,使用Blowfish算法中提供的解密函数,所有分块文件解密完成后,将解密后的分块进行合并,如按照顺序拼接合并,生成解密文件,还原出原文件,文件格式没有发生变化,解密后的文件格式与解密前的文件格式相同,例如MP3;此时文件数据已解密,可以正常浏览播放;
需要注意的是,解密操作需要遵循与加密操作相同的顺序和参数,因此加密与解密算法的实现代码几乎相同,只有加密函数与解密函数的调用顺序是相反的。
实施例2
如图4所示,本实施例示例性的呈现了一种流媒体的加密与解密装置,包括加密模块和解密模块,具体如下:
所述加密模块包括获取单元,第一运算单元,加密单元;
本实施例中获取单元读取音乐文件的关键信息:歌曲名称、艺术家、专辑、发行年份,将关键信息按照顺序进行排列组合,得到关键信息组合并使用UTF-8进行编码处理;
第一运算单元使用SHA-256哈希算法对所述组合的信息进行哈希运算,截取前16个字符得到track_id;生成一个关键密钥,使用RAND_bytes函数生成的关键密钥和track_id,从十六进制字符串转换为整数,使用Python的位运算符‘^’来执行异或运算,再将结果转换为十六进制字符串,即Blowfish密钥;
加密单元将音频文件进行分块处理,使用Blowfish算法的CBC(密码块链接)模式,指定初始化向量,对分块文件进行数据加密;具体地,使用OpenSSL的RAND_bytes函数生成Blowfish算法中CBC的初始化向量,在CBC模式中,明文数据被分成固定大小的密码块,并与前一个密码块(数据块)进行异或运算,由于初始密码块前没有密码块,因此需要使用初始化向量与初始密码块进行异或运算;
进一步地,所述解密模块包括接收单元,第二运算单元,分组单元,解密单元;
具体地,接收单元接收加密文件和关键密钥,读取加密文件,传入音频文件的ID号,并编码为字节;第二运算单元对其进行计算MD5哈希值,生成一个md5_hash字符串;分组单元将得到的md5_hash字符串和关键密钥进行配对分组,传入三个参数,分别是哈希值的前16位、哈希值的后16位、关键密钥;将三个参数中的同一个索引位置的元素组合成一个新的元组,第一次取三个参数的第一个元素组成元组,第二次取三个参数的第二个元素组成元组,后续依次组成;解密单元循环读取所述元组并执行异或操作,转换为ASCII字符并编码为字节,得到所述Blowfish密钥;对所述加密文件进行循环分块读取,使用Blowfish算法和所述Blowfish密钥对每一个分块文件进行解密,将解密后的分块合并,生成解密文件,即还原出原音频文件。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本发明的其它实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本发明的一般性原理并包括本发明未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本发明的真正范围和精神由权利要求指出。应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本发明的范围仅由所附的权利要求来限制。