pkcs7python
Ⅰ AES加解密使用总结
AES, 高级加密标准, 是采用区块加密的一种标准, 又称Rijndael加密法. 严格上来讲, AES和Rijndael又不是完全一样, AES的区块长度固定为128比特, 秘钥长度可以是128, 192或者256. Rijndael加密法可以支持更大范围的区块和密钥长度, Rijndael使用的密钥和区块长度均可以是128,192或256比特. AES是对称加密最流行的算法之一.
我们不去讨论具体的AES的实现, 因为其中要运用到大量的高等数学知识, 单纯的了解AES流程其实也没什么意义(没有数学基础难以理解), 所以我们今天着重来总结一些使用过程中的小点.
当然了分组密码的加密模式不仅仅是ECB和CBC这两种, 其他的我们暂不涉及.
上面说的AES是一种区块加密的标准, 那加密模式其实可以理解为处理不同区块的方式和联系.
ECB可以看做最简单的模式, 需要加密的数据按照区块的大小分为N个块, 并对每个块独立的进行加密
此种方法的缺点在于同样的明文块会被加密成相同的密文块, 因此, 在某些场合, 这种方法不能提供严格的数据保密性. 通过下面图示例子大家就很容易明白了
我们的项目中使用的就是这种模式, 在CBC模式中, 每个明文块与前一个块的加密结果进行异或后, 在进行加密, 所以每个块的加密都依赖前面块的加密结果的, 同时为了保证第一个块的加密, 在第一个块中需要引入初始化向量iv.
CBC是最常用的模式. 他的缺点是加密过程只能是串行的, 无法并行, 因为每个块的加密要依赖到前一个块的加密结果, 同时在加密的时候明文中的细微改变, 会导致后面所有的密文块都发生变化. 但此种模式也是有优点的, 在解密的过程中, 每个块的解密依赖上一个块的加密结果, 所以我们要解密一个块的时候, 只需要把他前面一个块也一起读取, 就可以完成本块的解密, 所以这个过程是可以并行操作的.
AES加密每个块blockSize是128比特, 那如果我们要加密的数据不是128比特的倍数, 就会存在最后一个分块不足128比特, 那这个块怎么处理, 就用到了填充模式. 下面是常用的填充模式.
PKCS7可用于填充的块大小为1-255比特, 填充方式也很容易理解, 使用需填充长度的数值paddingSize 所表示的ASCII码 paddingChar = chr(paddingSize)对数据进行冗余填充. (后面有解释)
PKCS5只能用来填充8字节的块
我们以AES(128)为例, 数据块长度为128比特, 16字节, 使用PKCS7填充时, 填充长度为1-16. 注意, 当加密长度是16整数倍时, 反而填充长度是最大的, 要填充16字节. 原因是 "PKCS7" 拆包时会按协议取最后一个字节所表征的数值长度作为数据填充长度, 如果因真实数据长度恰好为16的整数倍而不进行填充, 则拆包时会导致真实数据丢失.
举一个blockSize为8字节的例子
第二个块中不足8字节, 差4个字节, 所以用4个4来填充
严格来讲 PKCS5不能用于AES, 因为AES最小是128比特(16字节), 只有在使用DES此类blockSize为64比特算法时, 考虑使用PKCS5
我们的项目最开始加解密库使用了CryptoSwift, 后来发现有性能问题, 就改为使用IDZSwiftCommonCrypto.
这里咱们结合项目中边下边播边解密来提一个点, 具体的可以参考之前写的 边下边播的总结 . 因为播放器支持拖动, 所以我们在拖拽到一个点, 去网络拉取对应数据时, 应做好range的修正, 一般我们都会以range的start和end为基准, 向前后找到包含这个range的所有块范围. 打比方说我们需要的range时10-20, 这是我们应该修正range为0-31, 因为起点10在0-15中, 20 在16-31中. 这是常规的range修正.(第一步 找16倍数点).
但是在实际中, 我们请求一段数据时, 还涉及到解密器的初始化问题, 如果我们是请求的0-31的数据, 因为是从0开始, 所以我们的解密器只需要用key和初始的iv来进行初始化, 那如果经过了第一步的基本range修正后, 我们请求的数据不是从0开始, 那我们则还需要继续往前读取16个字节的数据, 举个例子, 经过第一步修正后的range为16-31, 那我们应该再往前读取16字节, 应该是要0-31 这32个字节数据, 拿到数据后,使用前16个字节(上一个块的密文)当做iv来初始化解密器.
还有一个要注意的点是, 数据解密的过程中, 还有可能会吞掉后面16个字节的数据, 我暂时没看源码, 不知道具体因为什么, 所以保险起见, 我们的range最好是再向后读取6个字节.
感谢阅读
参考资料
https://zh.wikipedia.org/zh-cn/%E9%AB%98%E7%BA%A7%E5%8A%A0%E5%AF%86%E6%A0%87%E5%87%86
https://segmentfault.com/a/1190000019793040
https://ithelp.ithome.com.tw/articles/10250386
Ⅱ “JS 逆向 AES逆向加密”python爬虫实战,日子越来越有判头了
大家好,我是辣条。
一个建筑行业的堂哥为了搞一些商业数据前前后后花了1w,辣条我半个小时就能解决的事情,这就是技术的魅力【爬取是的公开数据!】
网址:监管平台
开发工具:pycharm 开发环境:python3.7, Windows10 使用工具包:requests,AES,json
进去h里面 (鼠标光标放到 h上面 会显示他的 js地址 如果没有显示 就是证明你还没有执行到这里 需要在前面打上断点 刷新页面调试)
发现这个采用AES加密算法 使用模型CBC模式 采用填充方式为 Pkcs7
证明数据推导正确 在 return r.toString() 打上断点
r里面数据正常返回
Ⅲ 网络安全-哈希算法和数字签名
常见 HASH 算法:
HASH 算法主要应用:
1)文件校验
我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
2)数字签名
Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
3)鉴权协议
如下的鉴权协议又被称作"挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。
数字签名签署和验证数据的步骤如图所示:
PKCS1 和 PKCS7 标准格式的签名:
1. PKCS1签名:即裸签名,签名值中只有签名信息。
2. PKCS7签名:签名中可以带有其他的附加信息,例如签名证书信息、签名原文信息、时间戳信息等。
PKCS7 的 attached 和 detached 方式的数字签名:
1. attached 方式是将签名内容和原文放在一起,按 PKCS7 的格式打包。PKCS7的结构中有一段可以放明文,但明文必需进行ASN.1编码。在进行数字签名验证的同时,提取明文。这里的明文实际上是真正内容的摘要。
2. detached 方式打包的 PKCS7格式包中不包含明文信息。因此在验证的时候,还需要传递明文才能验证成功。同理,这里的明文实际上是真正内容的摘要。
Ⅳ python安装错误求解
安装python依赖文件
pip install docopt pygments
然后再执行
sudo python setup.py install
Ⅳ Python进行 AES CBC-128bit PKCS7/PKCS5 填充加密解密
你看一下这个例子吧。可以参考下面的地址:前面加上http,把句号改成点。
likang。me/blog/2013/06/05/python-pycrypto-aes-ecb-pkcs-5/
#-*-coding:utf-8-*-
fromCrypto.CipherimportAES
importos
BS=AES.block_size
pad=lambdas:s+(BS-len(s)%BS)*chr(BS-len(s)%BS)
unpad=lambdas:s[0:-ord(s[-1])]
key=os.urandom(16)#thelengthcanbe(16,24,32)
text='tobeencrypted'
cipher=AES.new(key)
encrypted=cipher.encrypt(pad(text)).encode('hex')
printencrypted#willbesomethinglike''
decrypted=unpad(cipher.decrypt(encrypted.decode('hex')))
printdecrypted#willbe'tobeencrypted'