java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误
在解密期間,我得到的是“錯(cuò)誤的密鑰大小”或“給定的最終塊未正確填充”?,這取決于我正在運(yùn)行的操作系統(tǒng)。
在Win7上,使用IBMJCE或SUNJCE(兩者都是Java8),解密在25%的時(shí)間內(nèi)失敗:javax.crypto.BadPaddingException:給com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)的最終塊沒(méi)有正確填充at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294)at javax.crypto.Cipher.doFinal(Cipher.java:2087)
在mac上,使用SUNJCE,解密在100%的時(shí)間內(nèi)失敗:java.security.InvalidKeyException:com.sun.crypto.provider.DESedeCrypt.init(DESedeCrypt.java:69)的密鑰大小錯(cuò)誤,位于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字節(jié),而在mac上,它永遠(yuǎn)不會(huì)是24字節(jié)。
這是起點(diǎn)。 在decryptWithSymmetricKey期間始終拋出異常。 請(qǐng)注意,我對(duì)大部分代碼(特定于DESede)進(jìn)行了短循環(huán),無(wú)法進(jìn)一步縮小代碼(非常新的安全空間)。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);
}
這里我們加密對(duì)稱密鑰,兩個(gè)環(huán)境中的密鑰長(zhǎng)度都是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);
}
這里我們用對(duì)稱密鑰加密我們的字符串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);
}
解密和解碼對(duì)稱密鑰是我第一次看到mac上的可變長(zhǎng)度密鑰。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));
}
故障發(fā)生在這里 - 在Windows上,它在cipher.doFinal 25%的時(shí)間內(nèi)失敗,在mac上,它在100%的時(shí)間在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);
}
我假設(shè)如果我在mac上解決這個(gè)問(wèn)題,它也應(yīng)該在Windows上解決它。
總結(jié)
以上是生活随笔為你收集整理的java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java2d游戏代码_Java 2D游戏
- 下一篇: java语言避免了大多数的什么_Java