AES加密算法在linux下相同輸入每次加密結果都不同的問題

現象描述:

在 windows 操作系統下加解密正常,但部署到 linux 環境中相同的輸入加密結果不正確,並且每次運行返回的結果都不同。

修改後的代碼:

           KeyGenerator kgen = KeyGenerator.getInstance("AES");

           //需手動指定 SecureRandom 隨機數生成規則

           SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

           random.setSeed(key.getBytes());

           kgen.init(128, random);

           SecretKey secretKey = kgen.generateKey();

           byte[] enCodeFormat = secretKey.getEncoded();

           SecretKeySpec keySpec = new SecretKeySpec(enCodeFormat, "AES");

           //創建密碼器

           Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

           byte[] byteContent = content.getBytes("utf-8");

           cipher.init(Cipher.ENCRYPT_MODE, keySpec);

           byte[] result =cipher.doFinal(byteContent);

 

以上是加密過程需手動指定隨機數的生成規則,同理在解密過程中也需手動指定隨機數的生成規則。

java.security.SecureRandom

此類提供加密的強隨機數生成器 (RNG)。許多實現都是僞隨機數生成器 (PRNG) 形式,這意味着它們將使用確定的算法根據實際的隨機種子生成僞隨機序列。其他實現可以生成實際的隨機數,而另一些實現則可能結合使用這兩項技術。

加密的強隨機數至少要遵從《FIPS 140-2, Security Requirements forCryptographic Modules 》中 4.9.1部分指定的統計隨機數生成器測試。另外,SecureRandom 還必須產生非確定性輸出,因此,正如以下文章中所描述的那樣,要求種子材料必須是不可預知的,SecureRandom 的輸出必須是加密的強序列:《RFC 1750:Randomness Recommendationsfor Security 》。

與 Java Security 中其他基於算法的類一樣,SecureRandom 也提供了與實現無關的算法,因此,調用方(應用程序代碼)會請求特定的 RNG 算法並將它傳回到該算法的 SecureRandom 對象中。如果需要,還可以通過特定的提供程序請求特定的算法。請參見 getInstance 方法。

因此,有以下兩種請求 SecureRandom 對象的方法:僅指定算法名稱,或者既指定算法名稱又指定包提供程序。

l  如果僅指定算法名稱,如下所示:

SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG");

系統將確定環境中是否有所請求的算法實現,是否有多個,是否有首選實現。

l  如果既指定了算法名稱又指定了包提供程序,如下所示:

SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG", "SUN");

系統將確定在所請求的包中是否有算法實現;如果沒有,則拋出異常。

SecureRandom實現嘗試完全隨機化生成器本身的內部狀態,除非調用方在調用 getInstance 方法之後又調用了setSeed 方法:

SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(seed);

在調用方從 getInstance 調用中獲得 SecureRandom 對象之後,它可以調用 nextBytes 來生成隨機字節:

byte bytes[] = new byte[20];random.nextBytes(bytes);

調用方還可以調用 generateSeed 方法來生成給定的種子字節數(例如,爲其他隨機數量生成器提供種子):

byte seed[] = random.generateSeed(20);
發佈了98 篇原創文章 · 獲贊 88 · 訪問量 145萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章