DES/ECB/PKCS7Padding加密算法:在Java开发中,用到的DES的ECB加密模式、PKCS7Padding填充方式,Java目前仅支持PKCS5Padding填充模式
问题描述
java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding
问题分析
java默认支持是PKCS5Padding填充方式 。
目前Java要实现PKCS7Padding填充模式的加密,需要借助第三方Jar包才可以实现,就是在初始化的时候 Security.addProvider 增加第三方的提供者,解密的时候还是按照原来的方式。
解决方案
BouncyCastle官网下载组件以支持PKCS7Padding填充。
2、把下载的bcprov-ext-jdk15to18-166.jar分别复制到
${jdk_home}\jre\lib\ext
(eg:D:\Java\jdk1.8.0_221\jre\lib\ext)
${jre_home}\lib\ext
(eg:D:\Java\jre1.8.0_221\lib\ext)
3、修改java.security文件
${jdk_home}\jre\lib\security\java.security
(eg:D:\Java\jdk1.8.0_221\jre\lib\security\java.security)
${jre_home}\lib\security\java.security
(eg:D:\Java\jre1.8.0_221\lib\security\java.security)
4、在3中找到的两个文件中搜索
security.provider.10=sun.security.mscapi.SunMSCAPI
然后在下面添加Java的默认加密提供者,保存,重启工作空间重新build项目;
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
在使用AES前,加入下面代码即可,如果显示该class还没导入,那就手动导入到该工程就好;
Security.addProvider(new BouncyCastleProvider());
使用DES/ECB加密,加入下面的静态代码块来添加默认加密提供者即可;
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
如果是Maven项目;
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.60</version>
</dependency>
同样使用下面的静态代码块来添加默认加密提供者即可;
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
5.以下是一个亲测可用的采用ECB模式的DES加密,padding使用PKCS7的加密工具类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.Key;
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
public class DESUtil {
private final static String ALGORITHM_DES = "DES/ECB/PKCS7Padding";
//设置java支持PKCS7Padding
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
//获取加密或解密的Cipher对象:负责完成加密或解密工作
private static Cipher GetCipher(int opmode, String key) {
try {
//根据传入的秘钥内容生成符合DES加密解密格式的秘钥内容
DESKeySpec dks = new