问题
I have a couple of library, C#, PHP and Android where they all encrypt/decrypt a string in the same way so they are all compatible with each other, i.e. C# writes and encrypts data to a database and PHP can successfully decrypt it and return the original string.
I now need to do the same thing with a standard Java application, so I've taken the code from my Android library and need libraries but I am getting an exception. As far as I know the code wasn't Android specific so it shouldn't be a problem.
Below is my encryption function
public static String encrypt(String plainPasword)
{
String password = "";
try
{
SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");
IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US-ASCII"));
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] encoded = cipher.doFinal(plainPasword.getBytes());
password = new String(Base64.encodeBase64(encoded));
}
catch (Exception ex)
{
System.err.println("Encryption Exception: " + ex.toString());
}
return password;
}
When I call Encryption.encrypt("myString")
I get the following exception:
Encryption Exception: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
As I said this code is working fine on Android and it shouldn't make any difference where it is running from.
Update
I found that I needed PKCS5Padding instead of 7 thanks to a link on a comment. I am now though getting the following exception:
Encryption Exception: java.security.InvalidKeyException: Illegal key size
回答1:
First, in Java, the standard padding name is PKCS5Padding, not PKCS7Padding. Java is actually performing PKCS #7 padding, but in the JCA specification, PKCS5Padding is the name given.
Next, you are trying to use AES-256, so you'll need to install the Unlimited Strength Jurisdiction policy files.
Hopefully this is just an example and you aren't using the same IV for every message, right?
回答2:
@Boardy If you are still facing the issue then i think you have to use MessageDigest which is compatible for both for C# and Java. I have faced the similar issue for AES 256 encryption and decryption. The sample code will be as follows.
public static String encryptWithAES256(String strToEncrypt) throws Exception
{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] encodedhash = digest.digest(KEY.getBytes(StandardCharsets.UTF_8));
IvParameterSpec ivspec = new IvParameterSpec(Arrays.copyOf(KEY.getBytes(),16));
SecretKeySpec secretKey = new SecretKeySpec(encodedhash, AES_ENCRYPTION_ALGORITHM);
Cipher cipher = Cipher.getInstance(CIPHER_TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
return new String(Base64.encodeBase64(cipher.doFinal(strToEncrypt.getBytes(CHARACTER_ENCODING))));
}
来源:https://stackoverflow.com/questions/25942165/aes-256-and-pkcs7padding-fails-in-java