java


javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes


I have an ArrayList which contains some objects. Object is a container for login/pass.
I try to decode them because i have to serialize them into local file for recreation after another launch.
Problem is during encryption I recieve
javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
at com.sun.crypto.provider.CipherCore.finalNoPadding(CipherCore.java:1039)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:983)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
And I completely don't understand why. In my opinion Base64 should deal with this. But maybe I don't understand properly its meaning.
I use to encrypt/deccode
public class Move
{
private static Move instance;
String key = "pT5IkWNR90gJo5YM";
String initVector = "RandomInitVector";
Cipher cipher;
private Move()
{
// try
// {
// cipher = Cipher.getInstance("AES/CBC/NoPadding");
// }
// catch (NoSuchAlgorithmException | NoSuchPaddingException e)
// {
// e.printStackTrace();
// }
}
public void saveData(ArrayList<Account> dataToSave)
{
try
{
FileOutputStream fileOut = new FileOutputStream(Config.SERIAL_FILE);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(encrypt(dataToSave));
out.close();
fileOut.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
#SuppressWarnings("unchecked")
public ArrayList<Account> loadData()
{
ArrayList<Account> loadedData = new ArrayList<Account>();
File f = new File(Config.SERIAL_FILE);
if (f.exists())
{
try
{
FileInputStream fileIn = new FileInputStream(Config.SERIAL_FILE);
ObjectInputStream in = new ObjectInputStream(fileIn);
loadedData = (ArrayList<Account>) in.readObject();
in.close();
fileIn.close();
}
catch (IOException | ClassNotFoundException e)
{
e.printStackTrace();
}
loadedData = decrypt(loadedData);
}
else
{
loadedData = new ArrayList<Account>();
}
return loadedData;
}
private ArrayList<Account> encrypt(List<Account> decrypted)
{
ArrayList<Account> encrypted = new ArrayList<Account>();
try
{
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
for (int i = 0; i < decrypted.size(); i++)
{
try
{
byte[] login = cipher.doFinal(Base64.getDecoder().decode(decrypted.get(i).getLogin().getBytes()));
encrypted.add(new Account(login.toString(), "pass"));
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
catch (InvalidKeyException | InvalidAlgorithmParameterException | UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException e)
{
e.printStackTrace();
}
return encrypted;
}
private ArrayList<Account> decrypt(List<Account> encrypted)
{
ArrayList<Account> decrypted = new ArrayList<Account>();
try
{
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
cipher = Cipher.getInstance("AES/CBC/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
for (int i = 0; i < encrypted.size(); i++)
{
byte[] login = cipher.doFinal(Base64.getDecoder().decode(encrypted.get(i).getLogin()));
decrypted.add(new Account(new String(login), "pass"));
}
}
catch (InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException e)
{
e.printStackTrace();
}
return decrypted;
}
public static Move getMove()
{
if (instance == null)
{
instance = new Move();
}
return instance;
}
}
AES block size is always 128bit, it must receive input in multiples of this number.
Smaller input must be padded to 16 bytes, and the type of padding specified to the algorithm.
Using "AES/CBC/PKCS5Padding" will do the trick.
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
If you use NoPadding, then you must implement your own padding for encryption, and make sure to remove it from the resulting string in decryption.

Related Links

Both key column and map-key are PK
How to develop on multiple computers with Libgdx and Intellij Idea
Basic arithmetic on two byte arrays in Java without BigInteger
Desktop in JFrame
App with google play location services crashes on launch
Java inventory project
How to persist tomcat sessions across restarts while using IntelliJ idea
Database Update & Sortable JTable Issues
Is there any way to make Java have the modern flat look? [duplicate]
About String object and pass-by-value in Java [duplicate]
Why is Java pass by value only? [closed]
Setting Block Data from Schematic in Bukkit?
Join two maps by key
No resource identifier found for attribute 'textcolor' in package 'android'
Blocking call to X509ExtendedKeyManager#chooseClientAlias
How to get USABLE screen width and height in Android

Categories

HOME
testing
bluetooth
mfc
smarty
homebrew
syntax
cplex
rsync
cmd
windows-server
enterprise-library-5
networkx
ios-charts
directx
paradox
primary-key
qt-creator
commonmark
angular-ui
oxyplot
openedx
textfield
jprofiler
zapier
jasonette
abi
functional-testing
sylius
p-value
xpages-ssjs
cas
spark-jobserver
url-scheme
kendo-datasource
binary-data
iframe-resizer
kendo-ui-grid
phpfreechat
repo
html5-fullscreen
bytecode-manipulation
neuroscience
splice
tasker
dynamic-reports
http-live-streaming
nxlog
flashair
wptoolkit
dotcover
azure-application-gateway
upstart
errordocument
datastax-startup
tizen-native-app
rdfs
nstextview
composite-key
nodebb
xcb
azure-sdk
file-writing
fody
pcf
skobbler-maps
transmitfile
merge-conflict-resolution
fputcsv
hover-over
dataview
hsv
unity-networking
jmeter-maven-plugin
mutation-observers
atk4
fouc
purge
riak-cs
kineticjs
google-style-guide
codeigniter-routing
wordpress-theme-customize
client-side-templating
ceil
doskey
didselectrowatindexpath
imdbpy
ftps
jplaton
sqlperformance
http-unit
cassini-dev
wsdl-2.0
specification-pattern
chuck
coderush
joyent
yui-datatable
javap
ugc
.net-1.0
paul-graham

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App