【密码学】SIC模式,一个新的加密模式?
看着Reqable[1]更新了工具箱,然后,本着学习的原则,来学习一下其他软件优秀的设计,然后,一个新的模式突然闯入了我的视野。
对于其他模式,相信各位读者,应该也不陌生,但是对于SIC模式来说,确实是我第一次见,但是其实不是,至于为什么,我们稍后再聊,要不就没了这一篇文章了。
资料搜索
首先,拿到一个新的模式,那肯定是先搜索一下,看看,具体是个啥,如果能找到RFC或者对应的Paper,基本上就稳了,但是,事与愿违,强大的搜索引擎,提示我,是不是要搜索AES SIV MODE
,这就非常的奇怪了。
但是,我们看第一个搜索结果,还是确实出现了SIC的,而对于其他的来说,从这个页面,我们并没有发现什么,所以我们点进去看一下。
不愧是,强大的搜索引擎,上面说,这个SIC模式,就是CTR模式的一个别名,然后这里提到了,dart的默认实现是SIC模式,好了,破案了,那就先来对比一下吧。
这里,可以发现,结果确实是一致的。但是呢,毕竟,我这测试的数据,还是有限的,因此也不能够肯定,这个是完全相同的,但是实际上,维基百科[4]已经说过了,他其实还有个别名叫ICM。
❝
Note: CTR mode (CM) is also known as integer counter mode (ICM) and segmented integer counter (SIC) mode.
❞
然后,那么,我们就来看一下,具体的代码实现吧,反正,看都看到这里了。
代码分析
这里,还是只看dart的实现吧,因为这个库[5, 6],也就dart这么干了,我们直接来看pointycastle[6]
这个就好了,因为实际上前者,是后者的一个封装,完整代码见[7]。然后,有着之前阅读代码的经验呢,加上这个的代码结构非常的清晰,这里就不带着大家一块来找了,因为本篇文章,不是一个源码阅读的文章。
可以快速的找到SIC实现的具体位置,具体的细节,就不展开了,然后我们再来对比看一下CTR。
可以发现,这里,确实是一个alisa,那就没有什么问题了,这里的实现,如果大家用了dart的这个库的默认的AES的模式的话,换到其他的平台,就可以直接切换为CTR模式,这里是一点问题都没有的,这里就不得不提到,在JS的实现当中的一个坑了,因为它的密钥长度和轮数是动态计算的,因此支持了任意长度的密钥,有关这个的分析,可以参考我之前写过的文章[8],这里先不多聊了。
流密码的分组模式
本着,看都看了,顺道稍微多看一点儿,也不吃亏,还能多水一点字数的原则,咳咳,这个库,还给那两个序列模式,给改造成了分组模式,这个其实也非常好理解,只需要添加上对应的Padding,其实就可以换成对应的分组模式了。
这里的核心呢,就是StreamCipherAsBlockCipher
,那么我们来看一下。
可以发现,确实和我说的是一样的,本质上,就是多Padding到了具体分块的结果,那么我们来简单验证一下。
可以发现,这个结论,确实是正确的,好了到这里,基本上就完全的看完了。
总结
本篇文章呢,学到了一个新的知识点,CTR模式还有俩其他的名字,SIC和ICM,而在dart当中呢,默认的实现,给了SIC,其实也就是CTR,这个属于引用库的问题,因此,如果跨语言使用的话,需要自行直接换成CTR就没有什么问题,如果说你要是用了分组的模式,添加了Padding,那么你可能需要手工的自己做一个Unpad了。快乐的时光过得特别快,又到了说再见的时候了,咱们下次再见。
参考资料
-
https://mp.weixin.qq.com/s/m66EBnTZhtwy5QUT_f352A -
https://reqable.com/ -
https://stackoverflow.com/questions/70492520/where-can-i-find-more-information-on-aes-mode-sic -
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_(CTR) -
https://pub.dev/packages/encrypt -
https://pub.dev/packages/pointycastle -
https://github.com/bcgit/pc-dart -
https://mp.weixin.qq.com/s/FPcS9oED9PqC9_g-zfLHjQ
原文始发于微信公众号(Coder小Q):【密码学】SIC模式,一个新的加密模式?
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论