失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误

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

时间:2019-06-15 23:22:55

相关推荐

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)进行了短循环,无法进一步缩小代码(非常新的安全空间)。publicstaticvoidruntest()throwsException{

StringsymmPad="DESede/CBC/PKCS5Padding";

StringasymmPad="RSA/ECB/OAEPWithSHA-256AndMGF1Padding";

StringpubKeyFp="somekey";

StringstringToEncrypt="abcdefg";

KeyGeneratorkgen=KeyGenerator.getInstance(DESEDE);

kgen.init(112);

SecretKeysecKey=kgen.generateKey();

StringencryptedKey=encryptSymmetricKey(secKey,asymmPad);

StringencryptedData=encryptDataWithSymmetricKey(stringToEncrypt,secKey,symmPad);

StringdecryptedKey=decryptWithPrivateKey(encryptedKey,pubKeyFp,asymmPad);

StringdecryptedData=decryptWithSymmetricKey(encryptedData,decryptedKey,symmPad);

}

这里我们加密对称密钥,两个环境中的密钥长度都是24privatestaticStringencryptSymmetricKey(SecretKeysecKey,StringasymmPadding)throwsException{

KeyPairkeyPair=getKeyPair("self4");

Ciphercipher=Cipher.getInstance(asymmPadding);

OAEPParameterSpecospec=newOAEPParameterSpec(SHA256,MGF1,MGF1ParameterSpec.SHA256,PSource.PSpecified.DEFAULT);

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

StringsecKeyEncoded=newString(secKey.getEncoded());

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

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

returnnewString(encoded);

}

这里我们用对称密钥加密我们的字符串privatestaticStringencryptDataWithSymmetricKey(Stringdata,SecretKeysecretKey,StringsymmPadding)throwsException{

Ciphercipher=Cipher.getInstance(symmPadding);

IvParameterSpeciv=newIvParameterSpec(newbyte[8]);

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

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

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

returnnewString(encoded);

}

解密和解码对称密钥是我第一次看到mac上的可变长度密钥。publicStringdecryptWithPrivateKey(StringencryptedData,StringpubKeyFp,StringasymmPadding)throwsException{

loadKeystores();

Stringalias=fingerPrintAliasMap.get(pubKeyFp);

KeyPairkeyPair=getKeyPair(alias);

Ciphercipher=Cipher.getInstance(asymmPadding);

OAEPParameterSpecoParamSpec=newOAEPParameterSpec(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("decodedanddecryptedkeylength:"+decrypted.length);//24onwindows,randomonmac

returnnewString(Hex.encodeHex(decrypted));

}

故障发生在这里 - 在Windows上,它在cipher.doFinal 25%的时间内失败,在mac上,它在100%的时间在cipher.init失败。publicStringdecryptWithSymmetricKey(StringencryptedHexData,StringsymmKey,StringsymmPadding)throwsException{

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

SecretKeyskeySpec=newSecretKeySpec(key,DESEDE);

IvParameterSpeciv=newIvParameterSpec(newbyte[8]);

Ciphercipher=Cipher.getInstance(symmPadding);

cipher.init(Cipher.DECRYPT_MODE,skeySpec,iv);//mac:Wrongkeysize

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

byte[]deciphered=cipher.doFinal(decoded);//windows:Givenfinalblocknotproperlypadded

returnnewString(deciphered);

}

我假设如果我在mac上解决这个问题,它也应该在Windows上解决它。

如果觉得《java获取密钥长度_java.security.InvalidKeyException:解密期间密钥大小错误》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。