A. 关于AES加解密中CBC模式的IV初始化向量的安全性问题
前段时间,在研究HLS的AES加密,由于一个地方电视台的HLS流有AES加密,在查看了相关的加解密方案后发现使用的是简单的AES的CBC模式,在CBC的模式下,会设置一个IV,初始化向量。但是我在解密的时候,使用了一个由于理解错误而产生的一个错误IV居然也能解密视频并进行播放,于是就有了这篇张文章。
虽然有五种加密,但是常用的还是CBC,CBC的全称Cipher Block Chaining ,有点类似于区块链哈,我们先来看下加密方式
上面的图片从左往右看,初始化IV只有在第一个块加密的时候才会用到,而第N个块的加密IV则是用的N-1(N>1)个加密后的二进制数组。
CBC的解密则也是从左往右看,但是加密时IV在解密时候,只会用于对第一个块进行解密,其他块的解密则是使用上一块的加密二进制作为IV进行解密操作。
通过上面的分析就能知道,加密的时候,iv会影响所有数据的加密结果,而解密时,iv只会影响第一个加密块的解密结果,其他块的解密可以直接通过分隔加密数据获取正确是N-1块的IV。
这也就印证了为什么ff能播放我用错误的iv解密出来的视频流数据,因为第一块的大小存储大概是id3 的数据,ff直接丢掉id3的数据,直接解码后面的视频数据 ,ff 应该是识别h264编码头开始解码视频。
那么从这点可以看出,在使用了key的情况下,IV对整个数据的保密性没有太大的作用。
再来说说我是怎么发现这个问题,因为错误的IV只会影响第一个块的数据,我在第一次尝试解密后,直接用ff进行播放,ff能够解码并且播放成功,但是相对于其他未加密的HLS流来说,播放我解密后的数据会有3-5s的延时,这让我很是头疼,后来我就通过 ffplay -v trace 打印播放解密的日志,发现视频数据的id3信息丢失了,那么出问题出在第一个块。然后再次研究m3u8加解密IV的赋值方法,后发来经过多次试验,正确赋值IV,解密出来的数据能够及时播放。再后来,就出现了这篇文章的来由。
由此带来的延展,针对iv在CBC模式下的弱用,AES提供了更多的模式可供选择,详细的可以到wiki上了解。
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation
B. 对于加密的总结(AES,RSA)
跟第三方联调的时候会碰到各种加密算法,所以总结一下。
AES不是将拿到的明文一次性加密,而是分组加密,就是先将明文切分成长度相等的块,每块大小128bit,再对每一小块进行加密。那么问题就来了,并不是所有的原始明文串能被等分成128bit,例如原串大小200bit,那么第二个块只有72bit,所以就需要对第二个块进行填充处理,让第二个块的大小达到128bit。常见的填充模式有
不进行填充,要求原始加密串大小必须是128bit的整数倍;
假设块大小8字节,如果这个块跟8字节还差n个字节,那么就在原始块填充n,直到满8字节。例:块{1,2,3},跟8字节差了5个字节,那么补全后的结果{1,2,3,5,5,5,5,5}后面是五个5,块{1,2,3,..7}跟8字节差了1个字节,那么补全后就是{1,2,3,...,7,1},就是补了一个1。
如果恰好8字节又选择了PKCS5Padding填充方式呢?块{1,2,3...8}填充后变成{1,2,3...8,8...8},原串后面被补了8个8,这样做的原因是方便解密,只需要看最后一位就能算出原块的大小是多少。
跟PKCS5Padding的填充方式一样,不同的是,PKCS5Padding只是对8字节的进行填充,PKCS7Padding可以对1~256字节大小的block进行填充。openssl里aes的默认填充方式就是PKCS7Padding
AES有多种加密模式,包括:ECB,CBC,CTR,OCF,CFB,最常见的还是ECB和CBC模式。
最简单的一种加密模式,每个块进行独立加密,块与块之间加密互不影响,这样就能并行,效率高。
虽然这样加密很简单,但是不安全,如果两个块的明文一模一样,那么加密出来的东西也一模一样。
openssl的相关函数:
CBC模式中引入了一个新的概念,初始向量iv。iv的作用就是为了防止同样的明文块被加密成同样的内容。原理是第一个明文块跟初始向量做异或后加密,第二个块跟第一个密文块做异或再加密,依次类推,避免了同样的块被加密成同样的内容。
openssl相关函数:
敲黑板!! 所以跟第三方对接的时候,如果对面说他们用aes加密,务必对他们发起灵魂三问:
签名的作用是让接受方验证你传过去的数据没有被篡改;加密的作用是保证数据不被窃取。
原理:你有一个需要被验签的原串A。
步骤一:选择hash算法将A进行hash得到hash_a;
步骤二:将hash_a进行加密,得到加密值encrypt_a;
步骤三:将原串A和加密的encrypt_a发给第三方,第三方进行验签。第三方先解密encrypt_a,得到一个hash值hash_a1,然后对原串A使用同样的hash算法进行hash,得到的即为加密前的hash_a,如果hash_a = hash_a1, 那么验签成功。
rsa使用私钥对信息加密来做签名,使用公钥解密去验签。
openssl相关函数:
注意:两个函数中的m,是原串hash后的值,type表示生成m的算法,例如NID_sha256表示使用sha256对原串进行的hash,返回1为签名成功或者验签成功,-1位为失败。
再次敲黑板!! 所以如果第三方说使用rsa验签,要让对方告知他们的hash算法。
首先明确,私钥加密不等于签名。加密的时候,使用使用公钥加密,第三方使用你的私钥进行解密。
openssl里公钥加密函数为RSA_public_encrypt,私钥解密函数为RSA_private_decrypt,具体的可以自己去查看下官方文档。
rsa也涉及到了填充方式,所以对接的时候也要问清楚
在使用公钥进行加密时,会发现每次加密出的结果都不一样,但使用私钥加密时,每次的结果都一样,网上查了一圈,说是因为填充方式的原因。
官方文档说明:
那么为什么一定要使用私钥做签名,公钥做加密,而不是公钥做签名,私钥做加密呢?
举个栗子:
C. aes加密iv是什么
iv就是初始化向量,初始化向量的值依密码算法而不裂巧拆同。最基本的要求是“唯宽告一性”,也就是说同一把密钥不重复使用同一个初肆枣始化向量。这个特性无论在区块加密或流加密中都非常重要。
D. 怎么区分PV、IV、UV
区分PV、IV、UV如下:
1、pv访问量(PageView),即页面访问量,每打开一次页面PV计数+1,刷新页面也是。
2、UV访问数(UniqueVisitor)指独立访客访问数,一台电脑终端为一个访客。
3、IV是初始向量(IV,InitializationVector)。
(4)加密算法iv的作用扩展阅读:
PV简介:
PV(pageview)即页面浏览量,通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。网页浏览数是评价网站流量最常用的指标之一,简称为PV。监测网站PV的变化趋势和分析其变化原因是袜野很多站长定期要做的工作。PageViews中的Page一般是指普通的html网页,也包含php、jsp等动态产生的html内容。来自浏览器的一次html内容请求会被看作一个PV,逐渐累计成为PV总数。
除了PV总数外,还可以从不同角度来分析和对比PV,比如想知道哪个网页(Page)被浏览的次数多就要以Page为分析对象并分别累计PV。网页一般通过URL或标题(htmltitle)来标识,大多数工具都提供答贺了类似的定义方法]关于PV的统计要考虑2种特殊情况:
一是从服务器返回错误网页或重定向网页时,是否计数以及如何配置;二是本地或网关服务器的缓存生效时是否计数。这些问题在实施网站分析前需要搞清楚,必要时可以咨询工具厂商。
UV简介:
UV是指不同的、通过互联网访问、浏览这个网页的自然人。
比如清好派,在一台电脑上,哥哥打开了微软的官方主页,注册了一个会员。弟弟一会儿也看了看,注册了另一个会员。由于兄弟两个使用的是相同的计算机,那么他们的ip是一样的,微软的官方计数器记录到一个ip登陆的信息。
但是,具有统计功能的统计系统,可以根据其他条件判断出实际使用的用户数量,返回给网站建设者真实、可信和准确的信息。比如通过注册的用户,甚至可以区分出网吧、机房等共享一个ip地址的不同计算机。
IV简介:
在有线等效保密(WEP)协议中,IV是用来和密钥组合成密钥种子,作为RC4算法的输入,来产生加密字节流对数据进行加密的。标准的64比特WEP使用40比特的钥匙接上24比特的初向量(InitializationVector,IV)成为RC4用的钥匙。
pv-网络UV-网络iv-网络
E. C#对称加密中的Key和IV分别代表什么,请详细讲解一下.
KEY 是加密的密钥 iv 则是加密动作中的 数据操作的偏移量
F. 加密算法和密钥的作用
一、加密算法:将原有的明文信息转化为看似无规律的密文。收信方需要对应的解密密钥,采用对应的解密方法将密文还原为明文(能看懂有意义的信息)。
二、密钥分为加密密钥和解密密钥,对于“对称加密算法”,这两者是一样的;而“非对称加密算法”的密钥分为“公开密钥”和“私有密钥”,用公开密钥加密,则需要私有密钥解密;反之用私有密钥加密,则需要公开密钥解密,是可以互换的。
三、现代的计算机加密算法比较复杂,要弄懂是需要离散数学、高等代数等知识,不可能在这里讲明白。
四、以“凯撒移位密码”这种最古来的简单密码来讲解什么是加密算法和密钥:
4.1)“凯撒密码”在《恺撒传》中有记载,凯撒密码是将每一个字母用字母表中的该字母后的第三个字母代替。尽管历史记载的凯撒密码只用了3个位置的移位,但显然从1到25个位置的移位我们都可以使用, 因此,为了使密码有更高的安全性,单字母替换密码就出现了。
若用每个字母的后11位替换当前字母,可以认为密钥=11。
如此得到的密码表为:
明码表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z(即26个字母表)
密码表 L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
加密的方法很简单,就是讲明码字母换成对应的密码表字母。
如:明文 I LOVE YOU
密文 T WZGP JZF
在当时,这样简单的密码就足够起到保密作用;但到近代都已经很容易被破解了,更不用说现代有计算机秒破了!
4.2)其他加密算法
有兴趣可以了解更复杂的加密算法:如近代的“维吉尼亚算法”,还属于字母位移加密,好懂!而现代计算机文件深度加密常用的“AES加密算法”,原理很复杂,需要高等数学等知识才能读懂。
G. 分组密码加密模式选择有哪些
分组密码工作模式的应用背景:多次使用相同的密钥对多个分组加密,会引发许多安全问题。为了应对不同场合,因而需要开发出不同的工作模式来增强密码算法的安全性。ECB特别适合数据较少的情况,对于很长的信息或者具有特定结构的信息,其大量重复的信息或固定的字符开头将给密码分析者提供大量的已知明密文对。若明文不是完整的分组,ECB需要进行填充。CBC(Cipher Block Chaining)由于加密算法的每次输入和本明文组没有固定的关系,因此就算有重复的明文组,加密后也看不出来了。为了配合算法的需要,有一个初始向量(IV)。与ECB一样有填充机制以保证完整的分组。CFB(Cipher Feedback)和OFB,CTR模式一样,均可将分组密码当做流密码(实际是将分组大小任意缩减)使用。
H. iv的初始向量(IV,Initialization Vector)
在有线等效保密(WEP)协议中,IV是用来和密钥组合成密钥种子,作为RC4算法的输入,来产念橘贺生加密字节流对数据进行加密的。标准的64比特WEP使用40比特的钥匙接上24比特的初向仔派量(Initialization Vector,IV) 成为伍碧 RC4 用的钥匙。
I. iv和is是什么意思
iv指初始向量。is是,be的第三人称单数现在时形式,常放在其他词后携缓缩写为’s。
is是be动词的第三人称单数现在时形式,它的意思为是,也可以作名词,意思为存在明隐春。iv即初始向量,在有线等效保密(WEP)协议中,IV是用来和密钥组合成密钥种子,作为RC4算激耐法的输入,来产生加密字节流对数据进行加密的。
在医学上,iv还是静脉推注的意思。静脉推注是用20或50毫升的注射器,将药品推注到静脉血管里的方法。
J. 数据加密和数据签名的原理作用
加密可以帮助保护数据不被查看和修改,并且可以帮助在本不安全的信道上提供安全的通信方式。例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据,解密数据是很困难的。
在一个使用加密的典型场合中,双方(小红和小明)在不安全的信道上通信。小红和小明想要确保任何可能正在侦听的人无法理解他们之间的通信。而且,由于小红和小明相距遥远,因此小红必须确保她从小明处收到的信息没有在传输期间被任何人修改。此外,她必须确定信息确实是发自小明而不是有人模仿小明发出的。
加密用于达到以下目的:
保密性:帮助保护用户的标识或数据不被读取。
数据完整性:帮助保护数据不更改。
身份验证:确保数据发自特定的一方。
为了达到这些目的,您可以使用算法和惯例的组合(称作加密基元)来创建加密方案。下表列出了加密基元及它们的用法。
加密基元 使用
私钥加密(对称加密) 对数据执行转换,使第三方无法读取该数据。此类型的加密使用单个共享的机密密钥来加密和解密数据。
公钥加密(不对称加密) 对数据执行转换,使第三方无法读取该数据。此类加密使用公钥/私钥对来加密和解密数据。
加密签名 通过创建对特定方唯一的数字签名来帮助验证数据是否发自特定方。此过程还使用哈希函数。
加密哈希 将数据从任意长度映射为定长字节序列。哈希在统计上是唯一的;不同的双字节序列不会哈希为同一个值。
私钥加密
私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到。私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法非常快(与公钥算法相比),特别适用于对较大的数据流执行加密转换。
通常,私钥算法(称为块密码)用于一次加密一个数据块。块密码(如 RC2、DES、TrippleDES 和 Rijndael)通过加密将 n 字节的输入块转换为加密字节的输出块。如果要加密或解密字节序列,必须逐块进行。由于 n 很小(对于 RC2、DES 和 TripleDES,n = 8 字节;n = 16 [默认值];n = 24;对于 Rijndael,n = 32),因此必须对大于 n 的值一次加密一个块。
基类库中提供的块密码类使用称作密码块链 (CBC) 的链模式,它使用一个密钥和一个初始化向量 (IV) 对数据执行加密转换。对于给定的私钥 k,一个不使用初始化向量的简单块密码将把相同的明文输入块加密为同样的密文输出块。如果在明文流中有重复的块,那么在密文流中将存在重复的块。如果未经授权的用户知道有关明文块的结构的任何信息,就可以使用这些信息解密已知的密文块并有可能发现您的密钥。若要克服这个问题,可将上一个块中的信息混合到加密下一个块的过程中。这样,两个相同的明文块的输出就会不同。由于该技术使用上一个块加密下一个块,因此使用了一个 IV 来加密数据的第一个块。使用该系统,未经授权的用户有可能知道的公共消息标头将无法用于对密钥进行反向工程。
可以危及用此类型密码加密的数据的一个方法是,对每个可能的密钥执行穷举搜索。根据用于执行加密的密钥大小,即使使用最快的计算机执行这种搜索,也极其耗时,因此难以实施。使用较大的密钥大小将使解密更加困难。虽然从理论上说加密不会使对手无法检索加密的数据,但这确实极大增加了这样做的成本。如果执行彻底搜索来检索只在几天内有意义的数据需要花费三个月的时间,那么穷举搜索的方法是不实用的。
私钥加密的缺点是它假定双方已就密钥和 IV 达成协议,并且互相传达了密钥和 IV 的值。并且,密钥必须对未经授权的用户保密。由于存在这些问题,私钥加密通常与公钥加密一起使用,来秘密地传达密钥和 IV 的值。
假设小红和小明是要在不安全的信道上进行通信的双方,他们可能按以下方式使用私钥加密。小红和小明都同意使用一种具有特定密钥和 IV 的特定算法(如 Rijndael)。小红撰写一条消息并创建要在其上发送该消息的网络流。接下来,她使用该密钥和 IV 加密该文本,并通过 Internet 发送该文本。她没有将密钥和 IV 发送给小明。小明收到该加密文本并使用预先商定的密钥和 IV 对它进行解密。如果传输的内容被人截获,截获者将无法恢复原始消息,因为截获者并不知道密钥或 IV。在这个方案中,密钥必须保密,但 IV 不需要保密。在一个实际方案中,将由小红或小明生成私钥并使用公钥(不对称)加密将私钥(对称)传递给对方。有关更多信息,请参见本主题后面的有关公钥加密的部分。
.NET Framework 提供以下实现私钥加密算法的类:
DESCryptoServiceProvider
RC2CryptoServiceProvider
RijndaelManaged
公钥加密
公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以提供给任何人;公钥用于对要发送到私钥持有者的数据进行加密。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。
公钥加密算法使用固定的缓冲区大小,而私钥加密算法使用长度可变的缓冲区。公钥算法无法像私钥算法那样将数据链接起来成为流,原因是它只可以加密少量数据。因此,不对称操作不使用与对称操作相同的流模型。
双方(小红和小明)可以按照下列方式使用公钥加密。首先,小红生成一个公钥/私钥对。如果小明想要给小红发送一条加密的消息,他将向她索要她的公钥。小红通过不安全的网络将她的公钥发送给小明,小明接着使用该密钥加密消息。(如果小明在不安全的信道如公共网络上收到小红的密钥,则小明必须同小红验证他具有她的公钥的正确副本。)小明将加密的消息发送给小红,而小红使用她的私钥解密该消息。
但是,在传输小红的公钥期间,未经授权的代理可能截获该密钥。而且,同一代理可能截获来自小明的加密消息。但是,该代理无法用公钥解密该消息。该消息只能用小红的私钥解密,而该私钥没有被传输。小红不使用她的私钥加密给小明的答复消息,原因是任何具有公钥的人都可以解密该消息。如果小红想要将消息发送回小明,她将向小明索要他的公钥并使用该公钥加密她的消息。然后,小明使用与他相关联的私钥来解密该消息。
在一个实际方案中,小红和小明使用公钥(不对称)加密来传输私(对称)钥,而对他们的会话的其余部分使用私钥加密。
公钥加密具有更大的密钥空间(或密钥的可能值范围),因此不大容易受到对每个可能密钥都进行尝试的穷举攻击。由于不必保护公钥,因此它易于分发。公钥算法可用于创建数字签名以验证数据发送方的身份。但是,公钥算法非常慢(与私钥算法相比),不适合用来加密大量数据。公钥算法仅对传输很少量的数据有用。公钥加密通常用于加密一个私钥算法将要使用的密钥和 IV。传输密钥和 IV 后,会话的其余部分将使用私钥加密。
.NET Framework 提供以下实现公钥加密算法的类:
DSACryptoServiceProvider
RSACryptoServiceProvider
数字签名
公钥算法还可用于构成数字签名。数字签名验证发送方的身份(如果您信任发送方的公钥)并帮助保护数据的完整性。使用由小红生成的公钥,小红的数据的接收者可以通过将数字签名与小红的数据和小红的公钥进行比较来验证是否是小红发送了该数据。
为了使用公钥加密对消息进行数字签名,小红首先将哈希算法应用于该消息以创建消息摘要。该消息摘要是数据的紧凑且唯一的表示形式。然后,小红用她的私钥加密该消息摘要以创建她的个人签名。在收到消息和签名时,小明使用小红的公钥解密签名以恢复消息摘要,并使用与小红所使用的相同的哈希算法来散列消息。如果小明计算的消息摘要与从小红那里收到的消息摘要完全一致,小明就可以确定该消息来自私钥的持有人,并且数据未被修改过。如果小明相信小红是私钥的持有人,则他知道该消息来自小红。
请注意,由于发送方的公钥为大家所周知,并且它通常包含在数字签名格式中,因此任何人都可以验证签名。此方法不保守消息的机密;若要使消息保密,还必须对消息进行加密。
.NET Framework 提供以下实现数字签名算法的类:
DSACryptoServiceProvider
RSACryptoServiceProvider
哈希值
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希计算都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。
双方(小红和小明)可按下面的方式使用哈希函数来确保数据的完整性。如果小红对小明编写一条消息并创建该消息的哈希,则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同,则该消息没有被更改;如果值不相同,则该消息在小红编写它之后已被更改。为了使此系统发挥作用,小红必须对除小明外的所有人保密原始的哈希值。
.NET Framework 提供以下实现数字签名算法的类:
HMACSHA1
MACTripleDES
MD5CryptoServiceProvider
SHA1Managed
SHA256Managed
SHA384Managed
SHA512Managed
随机数生成
随机数生成是许多加密操作不可分割的组成部分。例如,加密密钥需要尽可能地随机,以便使生成的密钥很难再现。加密随机数生成器必须生成无法以计算方法推算出(低于 p < .05 的概率)的输出;即,任何推算下一个输出位的方法不得比随机猜测具有更高的成功概率。.NET Framework 中的类使用随机数生成器生成加密密钥。
RNGCryptoServiceProvider 类是随机数生成器算法的实现。