linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是:

1 <dependency>
2         <groupId>org.bouncycastle</groupId>
3         <artifactId>bcprov-jdk15on</artifactId>
4         <version>1.56</version>
5 </dependency>

加密解密用的工具类,附上代码:

 1 package com.js.utils;
 2
 3 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 4
 5 import javax.crypto.Cipher;
 6 import javax.crypto.spec.IvParameterSpec;
 7 import javax.crypto.spec.SecretKeySpec;
 8 import java.security.Key;
 9 import java.security.Security;
10 import java.util.Arrays;
11
12 public class AESCBCUtil {
13     // 算法名称
14     final String KEY_ALGORITHM = "AES";
15     // 加解密算法/模式/填充方式
16     final String algorithmStr = "AES/CBC/PKCS7Padding";
17     //
18     private Key key;
19     private Cipher cipher;
20     boolean isInited = false;
21
22     byte[] iv = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
23     public void init(byte[] keyBytes) {
24
25         // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
26         int base = 16;
27         if (keyBytes.length % base != 0) {
28             int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
29             byte[] temp = new byte[groups * base];
30             Arrays.fill(temp, (byte) 0);
31             System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
32             keyBytes = temp;
33         }
34         // 初始化
35         Security.addProvider(new BouncyCastleProvider());
36         // 转化成JAVA的密钥格式
37         key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
38         try {
39             // 初始化cipher
40             cipher = Cipher.getInstance(algorithmStr, "BC");
41         }catch (Exception e){
42             e.printStackTrace();
43         }
44     }
45     /**
46      * 加密方法
47      * @param content 要加密的字符串
48      * @param keyBytes 加密密钥
49      * @return
50      */
51     public byte[] encrypt(byte[] content, byte[] keyBytes) {
52         byte[] encryptedText = null;
53         init(keyBytes);
54         try {
55             cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
56             encryptedText = cipher.doFinal(content);
57         } catch (Exception e) {
58             e.printStackTrace();
59         }
60         return encryptedText;
61     }
62     /**
63      * 解密方法
64      * @param encryptedData 要解密的字符串
65      * @param keyBytes 解密密钥
66      * @return
67      */
68     public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {
69         byte[] encryptedText = null;
70         init(keyBytes);
71         try {
72             cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
73             encryptedText = cipher.doFinal(encryptedData);
74         } catch (Exception e) {
75             e.printStackTrace();
76         }
77         return encryptedText;
78     }
79 }

windows开发mapreduce程序的时候,测试没问题,但是上linux集群就会报错:


愁死人了,从来没有遇到过这种问题,没办法,看博客! 
其实,这是由于linux版本java与windows有一些区别导致的,解决方法如下: 
1、在mvn仓库中找到下载的包bcprov-jdk15on-1.56.jar,或者如果你不用maven,只要能下载到这个包,放到linux的$JAVA_HOME/jre\lib\ext下面; 
2、配置我的安全属性文件:vim /usr/java/jdk1.8.0_112/jre/lib/security/java.security

 1 security.provider.1=sun.security.provider.Sun
 2 security.provider.2=sun.security.rsa.SunRsaSign
 3 security.provider.3=sun.security.ec.SunEC
 4 security.provider.4=com.sun.net.ssl.internal.ssl.Provider
 5 security.provider.5=com.sun.crypto.provider.SunJCE
 6 security.provider.6=sun.security.jgss.SunProvider
 7 security.provider.7=com.sun.security.sasl.Provider
 8 security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
 9 security.provider.9=sun.security.smartcardio.SunPCSC
10 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider 

第10行是我添加的,是由自己文件内容编号来确定的;

由于是分布式集群,每个节点都要环境一样哦!

完成这些配置后,重新执行这个任务,成功!

原文地址:https://www.cnblogs.com/data-magnifier/p/9126265.html

时间: 2024-12-15 17:32:11

linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法的相关文章

java.lang.SecurityException: JCE cannot authenticate the provider BC

和X公司对接数据,他们的开发语言是java,我们是php,双方数据通信的时候采用的加密方法是:bouncycastle 由于这个时间大神的限制,我们暂时不用PHP开发自己的加密算法,而是采用对方已有的加密包. 具体思路是: 1.将java写的的加密方法封装成jar包: 2.然后在php里面直接调用:exec("java -jar encrypt.jar")系统命令执行,实现加密解密 这里主要遇到2个问题: 1.cannot load mian class 2.调试过程中报错:java.

java.lang.SecurityException:JCE cannot authenticate the provider BC

出现:java.lang.SecurityException:JCE cannot authenticate the provider BC 2种方法:修改jdk的提供者: 在jdk/jre/lib/sercurity/java.security 增加 security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider 导入bcprov-jdk15-145.jar

Java Base64加密、解密原理Java代码

Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范.Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为

EJBCA在Linux上的安装

在windows上安装为了测试用,装在linux服务器上的因为CN用的ip需要重装.....又是折腾一番,下面介绍一些需要注意的地方 一.所需文件 准备的内容就不说了,参考我的上上篇<EJBCA在windows上的安装>,需要下载的上面提供的有 二.准备条件 1.jboss配置 1.1.JBOSS端口号配置 作为服务器JBOSS的默认端口8080和8009肯定被占用了,修改jboss的端口号.由于JBOSS的版本不同所以修改的位置也不一样 JBOSS-5.1.0GA 修改的位置是:jboss-

【Java】Java程序打包成jar包在Linux上运行

当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在MyEclipse中选中需要打包的项目,点击右键,选择:Export... 如下图所示: (2)然后在弹出的窗口中选择:Java-->Runnable JAR file,然后点击:Next,如下图所示: (3)然后选择需要打包的程序和保存的地方,然后点击:Finish,如下图所示: 这样Java程序

JProtector java应用加密工具

JProtector 高强度java应用加密工具 目前对于java应用的加密技术流行两种加密: 代码混淆加密: 通过对源码进行外形混淆.控制混淆.数据混淆等进行处理,加大了对class文件进行反编译后的源码分析难度,但依旧存在被破解的风险. agentlib动态链接库的加密: 对class文件进行加密处理,应用程序启动时加载解密主类,将解密主类作为程序入口从而实现对代码的保护.但这种情况下解密主类是不能进行加密处理的,程序发布时会将解密主类随着程序交给客户,客户对解密主类进行解密便可以得到解密后

在Linux上使用cmake创建CodeBlocks工程

最近在linux上使用cmake,对于使用GUI习惯的还真不能适应,真是想尽一切办法把原来使用cmake的工程创建成CodeBlocks工程.工程小了还能接受,工程大了太麻烦了. 看了一下cmake的官方文档从2.2.8以后的版本可以直接使用命令生成codeblocks工程,我的小心脏啊...不过相关文章不太多,可能有我这想法的也不太多,一般使用CMake的都是高手了,不会再这么倒腾,废话不多说了,下面直接从最简单的工程开始吧. 因为cmake官方建议使用外部编译,我们最好也用外部编译.新建一个

java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里面支持PKCS7Padding填充. 説辣么多不如上代码: public class AESUtil { /** * Encodes a String in AES-256 with a given key * * @param context * @param password * @param

JAVA AES CBC 加密 解密

AES 256 , KEY 的长度为 32字节(32*8=256bit). AES 128 , KEY 的长度为 16字节(16*8=128bit) CBC 模式需要IV, IV的值是固定写死,还是当参数传入,自己看情况.IV的长度没研究,这里用的是16字符. java PKCS5Padding 对应 C#.NET 的 PKCS7 . 明文,KEY和IV 三者 string 转 byte[] 时要统一编码,如UTF-8. 加密后 cipher.doFinal() 得到密文byte[] ,是直接转