- 浏览: 157728 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
沙舟狼客:
为了方便使用可以配置到环境变量里面MINGW_HOME=C:\ ...
windows下用mingw32+sdl进行简单2d游戏开发(c语言) -
沙舟狼客:
如果安装autotools时不用gcccc相当于gcc的链接n ...
windows下用mingw32+sdl进行简单2d游戏开发(c语言) -
lirihong:
java中文乱码完全解决方案 ?? 高度很高,深度、全面度全 ...
java中文乱码完全解决方案 -
沙舟狼客:
非常适合想写windows游戏的菜鸟
windows下用mingw32+sdl进行简单2d游戏开发(c语言) -
xixilive:
噢喔~~语义全无
京东导航的jquery实现
1、开发环境ubuntu+eclipse+openJDK
本来想在xp下开发,但是JDK1.6中有层层限制:JCA对外出口但是JCE对外不出口,当你实现后调用Cipher会报如下错误:
Exception in thread "main" java.lang.SecurityException: JCE cannot authenticate the provider SecureProvider at javax.crypto.Cipher.getInstance(DashoA13*..) at com.ligson.test.SimpleTest.main(SimpleTest.java:19) Caused by: java.util.jar.JarException: Cannot parse file:/E:/code/itrusca/MyProvider/target/classes/ at javax.crypto.SunJCE_c.a(DashoA13*..) at javax.crypto.SunJCE_b.b(DashoA13*..) at javax.crypto.SunJCE_b.a(DashoA13*..) ... 2 more
意思是让你去用自己产生的CSR提交到SUN的CA中心(IBM旗下也有)产生一张证书,进行代码签名(据我找到的信息,他一般是不会向你颁发证书的,也许你会说BouncyCastle就有自己的Provider,但是人家不是中国的)
2、Provider的实现
package com.ligson.provider; import java.io.IOException; import java.net.URL; import java.security.AccessController; import java.security.AuthProvider; import java.security.CodeSource; import java.security.PrivilegedAction; import java.security.Provider; import java.security.SecurityPermission; import java.util.jar.JarException; import javax.security.auth.Subject; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.login.LoginException; import com.ligson.jce.impl.SM3MessageDigest; public final class SecureProvider extends AuthProvider { private static String name = "SecureProvider"; private static String info = "this is a test provider for sm2/sm3"; private static double version = 1.0d; public SecureProvider() { super(name, version, info); // this.putService(s); //授权 AccessController.doPrivileged(new PrivilegedAction<Object>() { @Override public Object run() { //放入自己的基础实现类 //格式:类型.算法 put("Cipher.SM2", "com.ligson.jce.impl.SM2Cipher"); put("MessageDigest.SM3", SM3MessageDigest.class.getName()); put("Cipher.Simple", "com.ligson.provider.SimpleCipher"); put("KeyGenerator.Simple", "com.ligson.provider.SimpleKeyGenerator"); return null; } }); } private static URL getClassURL(final Class<?> clazz) { return AccessController.doPrivileged(new PrivilegedAction<URL>() { public URL run() { CodeSource cs = clazz.getProtectionDomain().getCodeSource(); return cs.getLocation(); } }); } /** * */ private static final long serialVersionUID = 1L; public String getName() { return name; } public String getInfo() { return info; } public double getVersion() { return version; } public static interface Tst { } @Override public void login(Subject subject, CallbackHandler handler) throws LoginException { SecurityManager sm = System.getSecurityManager(); sm.checkPermission(new SecurityPermission("authProvider." + this.getName())); } @Override public void logout() throws LoginException { // TODO Auto-generated method stub } @Override public void setCallbackHandler(CallbackHandler handler) { // TODO Auto-generated method stub }; }
3、SimpleCipher的实现,原理很简单,就是把输入的byte[]的每一个byte元素加上一个随机数,解密的时候再减去
package com.ligson.provider; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.CipherSpi; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.ShortBufferException; public class SimpleCipher extends CipherSpi { private int mode; private Key key; private byte[] in; @Override protected byte[] engineDoFinal(byte[] arg0, int arg1, int arg2) throws IllegalBlockSizeException, BadPaddingException { return implDoFinal(); } @Override protected int engineDoFinal(byte[] arg0, int arg1, int arg2, byte[] arg3, int arg4) throws ShortBufferException, IllegalBlockSizeException, BadPaddingException { return 0; } @Override protected int engineGetBlockSize() { return 0; } @Override protected byte[] engineGetIV() { return null; } @Override protected int engineGetOutputSize(int arg0) { return 0; } @Override protected AlgorithmParameters engineGetParameters() { return null; } @Override protected void engineInit(int arg0, Key arg1, SecureRandom arg2) throws InvalidKeyException { implInit(arg0, arg1); } @Override protected void engineInit(int arg0, Key arg1, AlgorithmParameterSpec arg2, SecureRandom arg3) throws InvalidKeyException, InvalidAlgorithmParameterException { implInit(arg0, arg1); } @Override protected void engineInit(int arg0, Key arg1, AlgorithmParameters arg2, SecureRandom arg3) throws InvalidKeyException, InvalidAlgorithmParameterException { implInit(arg0, arg1); } @Override protected void engineSetMode(String arg0) throws NoSuchAlgorithmException { } @Override protected void engineSetPadding(String arg0) throws NoSuchPaddingException { } @Override protected byte[] engineUpdate(byte[] arg0, int arg1, int arg2) { return implUpdate(arg0, arg1, arg2); } @Override protected int engineUpdate(byte[] arg0, int arg1, int arg2, byte[] arg3, int arg4) throws ShortBufferException { return 0; } private void implInit(int mode, Key key) { this.mode = mode; if (key instanceof SimpleKey) { this.key = key; } else { throw new RuntimeException("key invalid!"); } } private byte[] implUpdate(byte[] in, int offset, int len) { this.in = in; return in; } private byte[] implDoFinal() { SimpleKey simpleKey = (SimpleKey) key; if (mode == Cipher.ENCRYPT_MODE) { for (int i = 0; i < in.length; i++) { in[i] = (byte) (in[i] + simpleKey.offset); } } else if (mode == Cipher.DECRYPT_MODE) { for (int i = 0; i < in.length; i++) { in[i] = (byte) (in[i] - simpleKey.offset); } } else { throw new RuntimeException("mode must be encrypt or decrypt!"); } return in; } public void init(int mode, Key key) { implInit(mode, key); } public void update(byte[] in, int offset, int len) { implUpdate(in, offset, len); } public byte[] doFinal() { return implDoFinal(); } }
4、SimpleKey(只是一个简单的对称密钥)的实现,里面只保存随机的偏移量、长度等
package com.ligson.provider; import java.security.SecureRandom; import javax.crypto.SecretKey; public class SimpleKey implements SecretKey { protected int len; protected SecureRandom random; protected int offset; SimpleKey(SecureRandom random, int keySize,int offset) { this.len = keySize; this.random = random; this.offset = offset; } @Override public String getAlgorithm() { return "Simple"; } @Override public String getFormat() { return ""; } @Override public byte[] getEncoded() { byte[] b = new byte[len]; random.nextBytes(b); return b; } }
5、SimpleKeyGenerator的实现
package com.ligson.provider; import java.security.InvalidAlgorithmParameterException; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.KeyGeneratorSpi; import javax.crypto.SecretKey; public class SimpleKeyGenerator extends KeyGeneratorSpi { private SecureRandom random = new SecureRandom(); private int keySize = 128; private int offset = 3; @Override protected SecretKey engineGenerateKey() { offset = random.nextInt(); return new SimpleKey(random,keySize,offset); } @Override protected void engineInit(SecureRandom secureRandom) { this.random = secureRandom; } @Override protected void engineInit(AlgorithmParameterSpec arg0, SecureRandom arg1) throws InvalidAlgorithmParameterException { throw new InvalidAlgorithmParameterException("no support operation"); } @Override protected void engineInit(int keySize, SecureRandom secureRandom) { this.keySize = keySize; this.random = secureRandom; } }
6、Provider的测试程序
SecureProvider provider = new SecureProvider(); Security.addProvider(provider); KeyGenerator generator = KeyGenerator.getInstance("Simple",provider); System.out.println(generator); generator.init(512); SecretKey secretKey = generator.generateKey(); System.out.println(Arrays.toString(secretKey.getEncoded())); byte[] plain = "password".getBytes(); System.out.println(Arrays.toString(plain)); Cipher cipher = Cipher.getInstance("Simple"); cipher.init(Cipher.ENCRYPT_MODE,secretKey); cipher.update(plain); byte[] result = cipher.doFinal(); System.out.println(Arrays.toString(result)); cipher.init(Cipher.DECRYPT_MODE,secretKey); cipher.update(result); byte[] result2 = cipher.doFinal(); System.out.println(Arrays.toString(result2)); System.out.println(Arrays.equals(result2,plain));
结果如下:
发表评论
-
java中文乱码完全解决方案
2013-11-18 22:05 23531、代码编码全部用UTF8,特别是配置用的属性文件 2、J ... -
Highcharts动态曲线图(使用jna监视cpu使用率)
2012-01-10 22:30 91841、CPU使用率获取,因为我要用JNA调用,所以用c++调用w ... -
grails验证码插件-JCaptcha
2012-01-10 12:56 23351、安装 grails install-plugin jca ... -
jogl入门之简单的贪吃蛇
2012-01-05 13:43 19791、代码: package org.ligson.jo ... -
jogl入门
2011-12-31 13:19 50681、jogl是什么? jogl是Java OpenGL的 ... -
grails学习之自定义标签
2011-12-30 17:22 57411、在grails项目结构中有一个taglib文件夹(项目名/ ... -
加密机制的发展(JCE/JCA)
2011-12-23 17:56 4733一、对称密钥-------最原始的加密解密 对称 ... -
enum还有人记得吗?
2011-12-21 15:42 1077enum其实挺好用的,特别是对于一些固定的东西! packa ... -
JNA入门1
2011-12-06 22:15 36361、jna是什么 jna是java native acces ... -
利用BC替换X509证书的公钥
2011-11-23 09:54 2155public static X509Certificate r ... -
利用BC的X509v3CertificateBuilder组装X509证书
2011-11-22 17:38 3787// 设置开始日期和结束日期 long year = 3 ... -
grails框架中webService插件的使用(axis2,cxf)
2011-09-17 22:40 3176一、cxf插件的使用: 1、运行命令: grails in ... -
Java直接发送邮件或写好的eml邮件
2011-08-03 13:50 1462import java.io.File; import ... -
利用bouncycastle组装X509证书
2011-08-02 19:02 9296CreateCert.java package com.se ... -
Java中对称密钥、非对称密钥和数字签名的用法
2011-04-16 12:21 31621、非对称密钥: package com.mysec; ... -
eclipse3.6 太阳神版 中文汉化插件
2011-04-09 20:00 1089经常用eclipse,但用多了英文版,突然间想找个新鲜感,于是 ... -
Java中的按位取反运算符,哪位能详解一下?
2011-03-14 23:29 2190最近面试遇到了这样一道题: System.out.print ... -
Java常见排序算法
2011-02-24 17:53 829package test; import java ... -
常见模式例子
2011-02-24 17:37 972工厂模式 package login.sj; ... -
关于Java中各种修饰符与访问修饰符的说明
2011-02-24 15:05 984类: 访问修饰符 修饰符 class 类名称 exte ...
相关推荐
在与银联的对接中,调试过程中报错或使用类似登入加密:java.lang.SecurityException: JCE cannot authenticate the provider BC 进行问题解决,里面包含 bcprov-jdk16-143.jar与bcprov-jdk15-135.jar与具体文件存放...
解决org/bouncycastle/jce/provider/bouncycastlepr错误专用。
微信企业号开发JCE6,JCE包需要根据自己的jdk版本下载,对应JDK6
JAVA 加密 JCE Java密码扩展的基础 关于JCE的基础
1.修改 jre/lib/security/java.security文件 security.provider.9=org.bouncycastle.jce.provider.BouncyCastleProvider, 2.添加2个扩展包到jre/lib/ext目录下:bcprov-jdk15-135.jar bcprov-jdk16-143.jar
微信企业号开发jar包(不含JCE),JCE包需要根据自己的jdk版本下载
Diffie-Hellman密钥一致协议和DES程序需要JCE工具库的支持
jce_policy-8.zip jar包,jdk,安全,security,oracle官网下载 稍微麻烦 上传供大家方便下载
JCE,Java Cryptography Extension 1.8, java jce8 java jce
jar包下载地址 : http://www.rsdown.cn/down/164019.html 下载后将sunjce_provider.jar放入webapp/WEB-INF/lib中
NULL 博文链接:https://lwpsoft.iteye.com/blog/2254348
jce8、jce7下载 jdk8无政策限制权限文件,用于AES加密算法,AES加密扩展包因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制。比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件...
jce_policy-6.zip,jce_policy-8.zip,UnlimitedJCEPolicyJDK7.zip
jce-jdk13-139.jar是提供给java扩展包,放至jre/lib/ext目录下,并..\jre\lib\security\java.security文件中在配置security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider后使用
免费的JCE提供者。Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包。它支持大量的密码术算法,并提供 JCE 1.2.1 的实现。因为 Bouncy Castle 被设计成轻量级的,所以从 J2SE 1.4 到 J2ME(包括 MIDP...
jce_policy-8,JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。 它提供对对称、不对称、块和流密码的加密支持,它还...
joomla JCE最新版本2.3.2.4 繁体中文语言包
jce6到8对应jar.zip,jce6、jce7、jce8对应的jar,详情可以参考https://stackoverflow.com/questions/38203971/javax-net-ssl-sslhandshakeexception-received-fatal-alert-handshake-failure
官网下载地址是...JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。
JCE 加密、解密算法