crypto.js是google開發的加密套件,SJCL是斯坦福大學開發的aes加密工具,二者都是js對aes加密算法的實現。
二者的不同之處,首先是對密文是否被篡改的校驗上。SJCL內置並強制使用校驗功能,把校驗碼附加在密文的末尾,而crypto.js提供了各種hmac算法以供選擇,但不強制使用。
再者二者雖然都是aes加密的實現,但支持的模式是不同的。crypto.js支持「ECB、CBC、CFB、CTR、OFB」,而SJCL支持「CCM、GCM、OCB2」。
我依靠grok和gemini做了個網頁加密工具,來對比二者的加密結果。
把玩地址:
https://ejsoon.vip/crypto-sjcl/
之所以做這個,是為了搞明白「到底aes加密結果除了密文之外還要保存什麼」。現在我知道了,除了鹽,還有iv,mac,等等。換句話說,你想在兩個不同的程式實現加密—解密,需要這些複雜的配置完全一樣,非常麻煩。
同時,我認為結果的JSON數據結構中仍然漏掉了PBKDF2所用的哈希函數,我用的是默認的SHA1。
UPDATE:得知crypto-js已經於兩年前停止開發,理由是可被WEB Crypto API取代。但是WEB Crypto API只支援CBC、CTR、GCM三種模式,所以並沒有被完全取代。是我的信息落後了。