日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误

發布時間:2025/3/21 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在解密期間,我得到的是“錯誤的密鑰大小”或“給定的最終塊未正確填充”?,這取決于我正在運行的操作系統。

在Win7上,使用IBMJCE或SUNJCE(兩者都是Java8),解密在25%的時間內失敗:javax.crypto.BadPaddingException:給com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)的最終塊沒有正確填充at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294)at javax.crypto.Cipher.doFinal(Cipher.java:2087)

在mac上,使用SUNJCE,解密在100%的時間內失敗:java.security.InvalidKeyException:com.sun.crypto.provider.DESedeCrypt.init(DESedeCrypt.java:69)的密鑰大小錯誤,位于com的com.sun.crypto.provider.CipherBlockChaining.init(CipherBlockChaining.java:91)。 sun.crypto.provider.CipherCore.init(CipherCore.java:469)at com.sun.crypto.provider.DESedeCipher.engineInit(DESedeCipher.java:197)at javax.crypto.Cipher.implInit(Cipher.java:791)在javax.crypto.Cipher.chooseProvider(Cipher.java:849)javax.crypto.Cipher.init(Cipher.java:1348)

使用DESEde,我相信密鑰大小需要為24,我可以看到在Windows上,解密后,它總是24字節,而在mac上,它永遠不會是24字節。

這是起點。 在decryptWithSymmetricKey期間始終拋出異常。 請注意,我對大部分代碼(特定于DESede)進行了短循環,無法進一步縮小代碼(非常新的安全空間)。public?static?void?runtest()?throws?Exception?{

String?symmPad?=?"DESede/CBC/PKCS5Padding";

String?asymmPad?=?"RSA/ECB/OAEPWithSHA-256AndMGF1Padding";

String?pubKeyFp?=?"somekey";

String?stringToEncrypt?=?"abcdefg";

KeyGenerator?kgen?=?KeyGenerator.getInstance(DESEDE);

kgen.init(112);

SecretKey?secKey?=?kgen.generateKey();

String?encryptedKey?=?encryptSymmetricKey(secKey,?asymmPad);

String?encryptedData?=?encryptDataWithSymmetricKey(stringToEncrypt,?secKey,?symmPad);

String?decryptedKey?=?decryptWithPrivateKey(encryptedKey,?pubKeyFp,?asymmPad);

String?decryptedData?=?decryptWithSymmetricKey(encryptedData,?decryptedKey,?symmPad);

}

這里我們加密對稱密鑰,兩個環境中的密鑰長度都是24private?static?String?encryptSymmetricKey(SecretKey?secKey,?String?asymmPadding)?throws?Exception?{

KeyPair?keyPair?=?getKeyPair("self4");

Cipher?cipher?=?Cipher.getInstance(asymmPadding);

OAEPParameterSpec?ospec?=?new?OAEPParameterSpec(SHA256,?MGF1,?MGF1ParameterSpec.SHA256,?PSource.PSpecified.DEFAULT);

cipher.init(Cipher.ENCRYPT_MODE,?keyPair.getPublic(),?ospec);

String?secKeyEncoded?=?new?String(secKey.getEncoded());

byte[]?encrypted?=?cipher.doFinal(secKeyEncoded.getBytes());

char[]?encoded?=?Hex.encodeHex(encrypted);

return?new?String(encoded);

}

這里我們用對稱密鑰加密我們的字符串private?static?String?encryptDataWithSymmetricKey(String?data,?SecretKey?secretKey,?String?symmPadding)?throws?Exception?{

Cipher?cipher?=?Cipher.getInstance(symmPadding);

IvParameterSpec?iv?=?new?IvParameterSpec(new?byte[8]);

cipher.init(Cipher.ENCRYPT_MODE,?secretKey,?iv);

byte[]?encrypted?=?cipher.doFinal(data.getBytes());

char[]?encoded?=?Hex.encodeHex(encrypted);

return?new?String(encoded);

}

解密和解碼對稱密鑰是我第一次看到mac上的可變長度密鑰。public?String?decryptWithPrivateKey(String?encryptedData,?String?pubKeyFp,?String?asymmPadding)?throws?Exception?{

loadKeystores();

String?alias?=?fingerPrintAliasMap.get(pubKeyFp);

KeyPair?keyPair?=?getKeyPair(alias);

Cipher?cipher?=?Cipher.getInstance(asymmPadding);

OAEPParameterSpec?oParamSpec?=?new?OAEPParameterSpec(SHA256,?MGF1,?MGF1ParameterSpec.SHA256,?PSource.PSpecified.DEFAULT);

cipher.init(Cipher.DECRYPT_MODE,?keyPair.getPrivate(),?oParamSpec);

byte[]?decoded?=?Hex.decodeHex(encryptedData.toCharArray());

byte[]?decrypted?=?cipher.doFinal(decoded);

System.out.println("decoded?and?decrypted?key?length:?"?+?decrypted.length);?//?24?on?windows,?random?on?mac

return?new?String(Hex.encodeHex(decrypted));

}

故障發生在這里 - 在Windows上,它在cipher.doFinal 25%的時間內失敗,在mac上,它在100%的時間在cipher.init失敗。public?String?decryptWithSymmetricKey(String?encryptedHexData,?String?symmKey,?String?symmPadding)?throws?Exception?{

byte[]?key?=?Hex.decodeHex(symmKey.toCharArray());

SecretKey?skeySpec?=?new?SecretKeySpec(key,?DESEDE);

IvParameterSpec?iv?=?new?IvParameterSpec(new?byte[8]);

Cipher?cipher?=?Cipher.getInstance(symmPadding);

cipher.init(Cipher.DECRYPT_MODE,?skeySpec,?iv);?//?mac:?Wrong?key?size

byte[]?decoded?=?Hex.decodeHex(encryptedHexData.toCharArray());

byte[]?deciphered?=?cipher.doFinal(decoded);?//?windows:?Given?final?block?not?properly?padded

return?new?String(deciphered);

}

我假設如果我在mac上解決這個問題,它也應該在Windows上解決它。

總結

以上是生活随笔為你收集整理的java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。