可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am developing a web application to encrypt some texts with java 6.
The encrypted that I have to do is a AES (Rijndael) in CBC mode with PKCS7 padding and a 128-bit key.
I saw an article that explains how to encrypt in the same way I have to do, but with PKCS5 padding.
The link of the article is here:
https://bit502.wordpress.com/2014/06/27/codigo-java-encriptar-y-desencriptar-texto-usando-el-algoritmo-aes-con-cifrado-por-bloques-cbc-de-128-bits/
I change
private final static String cI = "AES/CBC/PKCS5Padding";
To
private final static String cI = "AES/CBC/PKCS7Padding";
But Java couldn't find a provider for this.
Could someone tell me how I have to do?
回答1:
Java only provides PKCS#5 padding, but it is the same as PKCS#7 padding. See this question on Crypto.SE:
What is the difference between PKCS#5 padding and PKCS#7 padding
They are interchangeable for the common block ciphers like AES and DES.
回答2:
The Java specification list a number of encryption modes (and paddings) that needs to be supported. PKCS7Padding
is not included.
These are the AES/CBC modes any Java implementation must support.
- AES/CBC/NoPadding (128 bit key)
- AES/CBC/PKCS5Padding (128 bit key)
(See this answer for more information)
Bouncy Castle does however have what you need.
回答3:
Try this method
String KEY_AES = "**************"; public String encrypt(String value) { try { byte[] key = KEY_AES.getBytes("UTF-8"); byte[] ivs = KEY_AES.getBytes("UTF-8"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); AlgorithmParameterSpec paramSpec = new IvParameterSpec(ivs); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, paramSpec); return Base64.encodeToString(cipher.doFinal(value.getBytes("UTF-8")), Base64.DEFAULT); } catch (Exception e) { e.printStackTrace(); } return null; }