请教个关于Java实现AES加解密的问题

Python020

请教个关于Java实现AES加解密的问题,第1张

JDK对DESede算法的支持

密钥长度:128位

工作模式:ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128

填充方式:Nopadding/PKCS5Padding/ISO10126Padding/

AES加密解密的java实现:

package com.kongxincai.encanddecimport java.security.Keyimport java.security.NoSuchAlgorithmExceptionimport javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.SecretKeyimport javax.crypto.spec.SecretKeySpecpublic class AESCoder {   private static final String KEY_ALGORITHM = "AES"  private static final String DEFAULT_CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"//默认的加密算法

public static byte[] initSecretKey() {       //返回生成指定算法密钥生成器的 KeyGenerator 对象

KeyGenerator kg = null      try {

kg = KeyGenerator.getInstance(KEY_ALGORITHM)

} catch (NoSuchAlgorithmException e) {

e.printStackTrace()          return new byte[0]

}       //初始化此密钥生成器,使其具有确定的密钥大小       //AES 要求密钥长度为 128

kg.init(128)      //生成一个密钥

SecretKey  secretKey = kg.generateKey()      return secretKey.getEncoded()

}   private static Key toKey(byte[] key){       //生成密钥

return new SecretKeySpec(key, KEY_ALGORITHM)

}   public static byte[] encrypt(byte[] data,Key key) throws Exception{       return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM)

}   public static byte[] encrypt(byte[] data,byte[] key) throws Exception{       return encrypt(data, key,DEFAULT_CIPHER_ALGORITHM)

}   public static byte[] encrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{       //还原密钥

Key k = toKey(key)      return encrypt(data, k, cipherAlgorithm)

}   public static byte[] encrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{       //实例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm)      //使用密钥初始化,设置为加密模式       cipher.init(Cipher.ENCRYPT_MODE, key)      //执行操作

return cipher.doFinal(data)

}   public static byte[] decrypt(byte[] data,byte[] key) throws Exception{       return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM)

}   public static byte[] decrypt(byte[] data,Key key) throws Exception{       return decrypt(data, key,DEFAULT_CIPHER_ALGORITHM)

}   public static byte[] decrypt(byte[] data,byte[] key,String cipherAlgorithm) throws Exception{       //还原密钥

Key k = toKey(key)      return decrypt(data, k, cipherAlgorithm)

}   public static byte[] decrypt(byte[] data,Key key,String cipherAlgorithm) throws Exception{       //实例化

Cipher cipher = Cipher.getInstance(cipherAlgorithm)      //使用密钥初始化,设置为解密模式       cipher.init(Cipher.DECRYPT_MODE, key)      //执行操作

return cipher.doFinal(data)

}   private static String  showByteArray(byte[] data){       if(null == data){           return null

}

StringBuilder sb = new StringBuilder("{")      for(byte b:data){

sb.append(b).append(",")

}

sb.deleteCharAt(sb.length()-1)

sb.append("}")      return sb.toString()

}   public static void main(String[] args) throws Exception {       byte[] key = initSecretKey()

System.out.println("key:"+showByteArray(key))

Key k = toKey(key)//生成秘钥

String data ="AES数据"

System.out.println("加密前数据: string:"+data)

System.out.println("加密前数据: byte[]:"+showByteArray(data.getBytes()))

System.out.println()      byte[] encryptData = encrypt(data.getBytes(), k)//数据加密

System.out.println("加密后数据: byte[]:"+showByteArray(encryptData))//       System.out.println("加密后数据: hexStr:"+Hex.encodeHexStr(encryptData))      System.out.println()      byte[] decryptData = decrypt(encryptData, k)//数据解密

System.out.println("解密后数据: byte[]:"+showByteArray(decryptData))

System.out.println("解密后数据: string:"+new String(decryptData))

}

}

你解密的key必须是加密的key啊

你看看,你解密的时候又KeyGenerator.getInstance("AES").generateKey()这是重新搞了一个key啊,当然解不出来了

我估计你这代码人家原先是写在一起的吧,加密完了再直接解密给你看,人家只generateKey一次,自然很顺利,你分成了两个例子,居然分别generateKey,自然失败

具体是报什么错误呢?一般解密报错的情况有,输入不满足16的倍数个字节,这种情况会报,AES解密异常Given final block not properly padded,具体参考:http://www.it399.com/blog/web/201805211406 可以使用这个在线工具解密,如果报错会有相应的错误提示,希望能够帮助到你。