Заданный последний блок неправильно заполнен DES
Я использовал шифрование DES для шифрования / дешифрования данных. Этот код работал нормально. Но теперь этот код не работает в Linux с ошибкой заполнения, в Windows я не вижу этой проблемы. Это мои наблюдения
- Старый ключ шифрования работает нормально. Новые сгенерированные вызывает проблему
- Работает на машине с Windows, а не на машине с Linux
Может кто-нибудь сообщить мне, что может быть причиной этой проблемы?
Вот мой код
/**
* Generate the private key using the passed string.
*
* @param keyGeneratorString
* : The string which is to be used to generate the private key.
* @return : SecretKey else null.
*/
public SecretKey getKey(String keyGeneratorString) {
SecretKeyFactory keyFactory = null;
DESKeySpec keySpec = null;
try {
// only the first 8 Bytes of the constructor argument are used
// as material for generating the keySpec
keySpec = new DESKeySpec(keyGeneratorString.getBytes("UTF-8"));
// Get the DES encryption standard instance
keyFactory = SecretKeyFactory.getInstance("DES");
// Generate and return the key.
return keyFactory.generateSecret(keySpec);
} catch (UnsupportedEncodingException uee) {
logger.error("****** Error while generating key : "
+ uee.getMessage());
} catch (InvalidKeyException ike) {
logger.error("****** Error while generating key : "
+ ike.getMessage());
} catch (NoSuchAlgorithmException e) {
logger.error("****** Error while generating key : "
+ e.getMessage());
} catch (InvalidKeySpecException e) {
logger.error("****** Error while generating key : "
+ e.getMessage());
}
// There was error while generating the key hence return null.
return null;
}
/**
* Encrypt the string using the SecretKey.
*
* @param stringToBeEncrypted
* : The String to be encrypted.
* @param key
* : The secret key to be used for encryption.
* @return : Encrypted byte[] or null.
*/
public byte[] encrypt(String stringToBeEncrypted, SecretKey key) {
Cipher cipherInst;
try {
cipherInst = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipherInst.init(Cipher.ENCRYPT_MODE, key);// cipher is not thread
// safe
byte[] encrypted = cipherInst.doFinal(stringToBeEncrypted
.getBytes());
return encrypted;
} catch (NoSuchAlgorithmException e) {
logger.error("****** Error while encrypting : "
+ e.getMessage());
} catch (NoSuchPaddingException e) {
logger.error("****** Error while encrypting : "
+ e.getMessage());
} catch (InvalidKeyException e) {
logger.error("****** Error while encrypting : "
+ e.getMessage());
} catch (IllegalBlockSizeException e) {
logger.error("****** Error while encrypting : "
+ e.getMessage());
} catch (BadPaddingException e) {
logger.error("****** Error while encrypting : "
+ e.getMessage());
}
return null;
}
/**
* Decrypt the string using the SecretKey.
*
* @param stringToBeDecrypted : byte[] to be decrypted.
* @param key : The secret key to be used for decryption.
* @return : Decrypted byte[] or null.
*/
public byte[] decrypt(byte[] stringToBeDecrypted, SecretKey key) {
Cipher cipherInst;
try {
cipherInst = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipherInst.init(Cipher.DECRYPT_MODE, key);
byte[] original = cipherInst
.doFinal(stringToBeDecrypted);
return original;
} catch (NoSuchAlgorithmException e) {
logger.error("****** Error while decrypting : "
+ e.getMessage());
} catch (NoSuchPaddingException e) {
logger.error("****** Error while decrypting : "
+ e.getMessage());
} catch (InvalidKeyException e) {
logger.error("****** Error while decrypting : "
+ e.getMessage());
} catch (IllegalBlockSizeException e) {
logger.error("****** Error while decrypting : "
+ e.getMessage());
} catch (BadPaddingException e) {
logger.error("****** Error while decrypting : "
+ e.getMessage());
}
return null;
}
1 ответ
Будьте осторожны при преобразовании строк в байты, которые всегда используют одну и ту же кодировку. Эта линия
byte[] encrypted = cipherInst.doFinal(stringToBeEncrypted
.getBytes());
использует кодировку символов по умолчанию для вашей машины, которая может отличаться в Linux и Windows. Используйте такую же кодировку, как "UTF8", как для создания keySpec
,
byte[] encrypted = cipherInst.doFinal(stringToBeEncrypted
.getBytes("UTF-8"));
Обратите внимание, что "ошибка заполнения" обычно не такая вещь; это очень вводящее в заблуждение сообщение об ошибке.