回覆列表
-
1 # 深入淺出話圍棋
-
2 # 網路圈
涉及到資料加密場景的專案都離不開加密演算法,程式語言那麼多,每款語言都有自己的加密實現,這就會導致不同開發語言間即使是同一加密演算法,可能也無法相互間加解密。
什麼是AES加密?AES是高階加密標準的英文縮寫,它是對稱加密(加密和解密用的是同一套金鑰)演算法中最為流行的演算法之一,在安全性上優於DES(DES安全性較差)。比如說微信小程式加密方式中就用到了AES加密。
AES加密特性1、AES金鑰長度一般是:128位、192位、256位
我們常說的AES128指的就是AES加密金鑰長度是128位。金鑰長度越長,安全性越高。
2、AES是分組加密的
AES會對固定大小的分組資料進行處理,每次處理16位元組的輸入,當資料不足16位元組長時,就需要進行填充。
AES加密結果會受到加密模式及填充方式影響上面說到了,AES是分組加密的,當待加密資料長度不定時,為了能在各種場景下安全的使用分組密碼,就需要設定工作模式和填充方式。
1、AES加密模式有:ECB(電碼本模式)、CBC(密碼分組鏈模式)、OFB(輸出反饋模式)、CTR(計數器模式)等。
2、AES填充方式有:NoPadding、PKCS5、PKCS7等。
雖說都是AES加密演算法,但是選擇不同的加密模式和填充方式就直接影響了資料的加密解密正確性!不同程式語言在實現AES演算法時,對於預設的加密模式和填充方式是不同的,所以也就導致了在Java中的AES加密串無法在PHP中進行解密!
如果要確保不同語言間AES加密解密的互通,那加密模式和填充方式必須一致!
加密演算法和語言是沒有關係的。 所以這個只能解釋為你自己的程式碼有什麼問題。
令明文為P, 密文為S, 金鑰為K,加密方法為E, 解密方法為D。 我們可以用下面的公式表示加密和解密的過程:
S = E(P, K) P = D(P, K)可以看出來, 這是個條件封閉的計算公式, 理論上和語言是沒有關係的。
那到底哪裡出問題了, 你不貼程式碼,我也沒法給出準確的回覆。 不過可以提供一些排查的思路:
把明文, 金鑰, 密文打印出來。 比較它們是否一樣, 特別要注意前後的空格,可以結束size函式來判斷位數是否一樣。
如果用相同明文 + 相同金鑰得到相同的密文, 說明加密過程是沒問題的。 再用上面提到的方法,比較解密的過程。
當某個過程不一致的時候,除了比較字串, 另外可以看看原始碼或者換一種實現。 理論上這是不可能的。