介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别

要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现

所以需要一个jar 来支持。bcprov-jdk16-139.jar

下载地址:http://www.bouncycastle.org/archive/139/bcprov-jdk16-139.jar

废话不说了,下面上代码

加解密类
/** *  * @author ngh * AES128 算法 *  * CBC 模式 *  * PKCS7Padding 填充模式 *  * CBC模式需要添加一个参数iv *  * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别 * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现 */public class AES { // 算法名称 final String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 final String algorithmStr = "AES/CBC/PKCS7Padding"; // private Key key; private Cipher cipher; boolean isInited = false;  byte[] iv = { 0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38 }; public void init(byte[] keyBytes) {     // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要  int base = 16;  if (keyBytes.length % base != 0) {   int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);   byte[] temp = new byte[groups * base];   Arrays.fill(temp, (byte) 0);   System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);   keyBytes = temp;  }  // 初始化  Security.addProvider(new BouncyCastleProvider());  // 转化成JAVA的密钥格式  key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);  try {   // 初始化cipher   cipher = Cipher.getInstance(algorithmStr, "BC");  } catch (NoSuchAlgorithmException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchPaddingException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } catch (NoSuchProviderException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } /**  * 加密方法  *   * @param content  *            要加密的字符串  * @param keyBytes  *            加密密钥  * @return  */ public byte[] encrypt(byte[] content, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(content);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; } /**  * 解密方法  *   * @param encryptedData  *            要解密的字符串  * @param keyBytes  *            解密密钥  * @return  */ public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {  byte[] encryptedText = null;  init(keyBytes);  System.out.println("IV:" + new String(iv));  try {   cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));   encryptedText = cipher.doFinal(encryptedData);  } catch (Exception e) {   // TODO Auto-generated catch block   e.printStackTrace();  }  return encryptedText; }}

测试类

public class Test { public static void main(String[] args) {  AES aes = new AES();//   加解密 密钥  byte[] keybytes = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38 };  String content = "1";  // 加密字符串  System.out.println("加密前的:" + content);  System.out.println("加密密钥:" + new String(keybytes));  // 加密方法  byte[] enc = aes.encrypt(content.getBytes(), keybytes);  System.out.println("加密后的内容:" + new String(Hex.encode(enc)));  // 解密方法  byte[] dec = aes.decrypt(enc, keybytes);  System.out.println("解密后的内容:" + new String(dec)); }  }

测试结果:

加密前的:1
加密密钥:12345678
IV:0102030405060708
加密后的内容:b59227d86200d7fedfb8418a59a8eea9
IV:0102030405060708
解密后的内容:1



更多相关文章

  1. android JNI RSA 3DES BASE64 加解密实现
  2. Android(安卓)数据加密方法 AES DES RSA AndroidKeyStore
  3. Android中UDP发送报文
  4. 关于使用谷歌地图的问题
  5. Android(安卓)指纹识别(Touch ID)实例
  6. 【转】申请 android google map API key
  7. react-native打包android
  8. 关于AES在Android和JAVA上加密解密不能对应的问题
  9. 【Android】LitePal安装和使用

随机推荐

  1. Android(安卓)状态栏透明和图标反色
  2. android(27)(显示意图之打开浏览器)
  3. Android那些疑惑(2)-LayoutInflater中inf
  4. Android(Java):onChange效果实现
  5. Android(安卓)向菜单按钮说再见
  6. Android之SharedPreferences轻量数据存储
  7. Android(安卓)Intent 大全 截止到Level 8
  8. IndicatorViewPager (笔记)
  9. android实现双击事件的监听
  10. Port SDL/TinySDGL to android with nati