java aes加密 linux和windows,AES加密在windows與linux平台下顯示結果不同,解決方案

現象描述:

在 windows 操作系統下加解密正常,但部署到 linux 環境中相同的輸入加密結果不正確,並且每次運行返回的結果都不同。也就是說在windows下加解密都正常,一但部署到linux下,就會提示解密失敗,原因是每次加密后的結果都不同,當然MAC機上也是。

原理:

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

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 對象的方法:僅指定算法名稱,或者既指定算法名稱又指定包提供程序。

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

SecureRandomrandom = SecureRandom.getInstance("SHA1PRNG");

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

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

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

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

現象描述

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

kg.init(128, new SecureRandom(key.getBytes()));

修改后代碼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值