java实现基于PKCS7Padding填充方式的AES加解密
2016-05-27 16:46
1011 查看
加解密第四弹,java实现基于PKCS7Padding填充方式的AES加解密。
jdk自带的包只支持PKCS5Padding填充方式,不支持PKCS7Padding填充方式,如果要支持PKCS7Padding填充方式,需要用到一个开源jar包,点此进入jar包下载页
如果你是用maven,则直接添加以下maven依赖即可。
java代码如下:
jdk自带的包只支持PKCS5Padding填充方式,不支持PKCS7Padding填充方式,如果要支持PKCS7Padding填充方式,需要用到一个开源jar包,点此进入jar包下载页
如果你是用maven,则直接添加以下maven依赖即可。
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.47</version> </dependency>
java代码如下:
import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class AESpkcs7paddingUtil { /** * 密钥算法 */ private static final String KEY_ALGORITHM = "AES"; /** * 加密/解密算法 / 工作模式 / 填充方式 * Java 6支持PKCS5Padding填充方式 * Bouncy Castle支持PKCS7Padding填充方式 */ private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding"; static { //如果是PKCS7Padding填充方式,则必须加上下面这行 Security.addProvider(new BouncyCastleProvider()); } /** * 生成密钥 * @return 密钥 * @throws Exception */ public static String generateKey() throws Exception { //实例化密钥生成器 KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); /** * 设置AES密钥长度 * AES要求密钥长度为128位或192位或256位,java默认限制AES密钥长度最多128位 * 如需192位或256位,则需要到oracle官网找到对应版本的jdk下载页,在"Additional Resources"中找到 * "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files",点击[DOWNLOAD]下载 * 将下载后的local_policy.jar和US_export_policy.jar放到jdk安装目录下的jre/lib/security/目录下,替换该目录下的同名文件 */ kg.init(128); //生成密钥 SecretKey secretKey = kg.generateKey(); //获得密钥的字符串形式 return Base64.encodeBase64String(secretKey.getEncoded()); } /** * AES加密 * @param source 源字符串 * @param key 密钥 * @return 加密后的密文 * @throws Exception */ public static String encrypt(String source, String key) throws Exception { byte[] sourceBytes = source.getBytes("UTF-8"); byte[] keyBytes = Base64.decodeBase64(key); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC"); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM)); byte[] decrypted = cipher.doFinal(sourceBytes); return Base64.encodeBase64String(decrypted); } /** * AES解密 * @param encryptStr 加密后的密文 * @param key 密钥 * @return 源字符串 * @throws Exception */ public static String decrypt(String encryptStr, String key) throws Exception { byte[] sourceBytes = Base64.decodeBase64(encryptStr); byte[] keyBytes = Base64.decodeBase64(key); Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC"); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, KEY_ALGORITHM)); byte[] decoded = cipher.doFinal(sourceBytes); return new String(decoded, "UTF-8"); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树