使用crypto-js时,key,iv,方法,mode,padding都一样,要加密的数据也一样,完全按照下面的方法,加密后的值竟然和这例子上的不一样?这是为什么?
https://mp.weixin.qq.com/s/cKl3XUZtuA3syDh6WrPZGA
例子上的结果是:
我求出来是:
但是我解密也是能解出来的。
使用crypto-js时,key,iv,方法,mode,padding都一样,要加密的数据也一样,完全按照下面的方法,加密后的值竟然和这例子上的不一样?这是为什么?
https://mp.weixin.qq.com/s/cKl3XUZtuA3syDh6WrPZGA
例子上的结果是:
我求出来是:
但是我解密也是能解出来的。
1 回答1.3k 阅读
1 回答2.4k 阅读
结论
情况一
就当前
crypto-js
例子而言,原因大概率是原文作者有一些额外的配置,但是没保留到教程代码中,也就是 代码脱敏 (正常来说,如果要脱敏那运行结果也不会使用他加盐之后生成的密文,但也可能懒得再运行一遍,反正盐没有暴露就问题不大)情况二
还有一种可能性,就是题主所使用的版本和参考文章使用的 版本不一致,我使用最新的版本与题主的加密结果是一致的,(这种 可能性不大,虽然不知道具体版本,但是
CBC
是确定性加密算法,基本不会有大变动的,21 年的文章也不算特别久远)但是可能性不是 0 ,因为不同版本可能会对初始变量的迭代次数作调整,出于这点考虑,还是保留情况二作为参考
总得来说,能正常的加密解密就没有大问题
额外补充
当然,有部分算法也会设计成相同的输入能产生不同的输出,因为如果固定的输入就一定能保证固定的输出,那 安全性就相对降低 了,因为可以用大量的加密案例去套一个【字典】来暴力破解(这就是
md5
会有部分网站能解密的原因)所以现在也有一些算法不会让某个加密文本输出一致(例如
CTR
,会有一个计数器,来确保每次加密都产生不同的结果),虽然加盐(salt
)也足以解决大部分的情况,但从算法本身而言这种设计肯定是更安全的当然,以上不适用于题主的例子,因为
CBC
在参数(秘钥、初始向量、加密值等)一致的情况下,是有固定输出的