Bouncy Castle Crypto API由一个名为Bouncy Castle Inc的澳大利亚慈善组织维护。负责管理和维护 Bouncy Castle API。希望为这项工作提供支持的朋友可以关注我们的 捐赠页面 或者通过Crypto工作组购买支持服务。非常欢迎为具体功能的改进开发或相关工作提供赞助。
Bouncy Castle Crypto 的Java API包含下列内容:
- 一个轻量级加密解密API。
- Java加密解密扩展和框架Provider。
- 一个JCE 1.2.1的净室实现(a clean-room implementation)。
- 一个针对加密ASN.1对象的读写库。
- TLS轻量级API((RFC 2246、RFC 4346)和 DTLS(RFC 4347)。
- 提供3 X.509证书版本1和版本3 X生成器/处理器、CRL版本2和PKCS12文件。
- 提供X.509证书版本2生成器/处理器。
- 提供S/MIME和CMS(PKCS7/RFC 3852)生成器/处理器。
- 提供OCSP(RFC 2560)生成器/处理器。
- 提供TSP(RFC 3161 & RFC 5544)生成器/处理器。
- 提供CMP和CRMF(RFC 4210 & RFC 4211)生成器/处理器。
- 提供OpenPGP(RFC 4880)生成器/处理器。
- 提供扩展访问控制(EAC)生成器/处理器。
- 提供数据验证和认证服务器(DVCS)—RFC 3029生成器/处理器。
- 提供基于DNS的命名实体认证((DANE)生成器/处理器。
- 适用于JDK 1.4-1.8和Sun JCE的签名 jar 版本。
该轻量级API可以与从J2ME到JDK 1.8的任何版本一起工作。现在还提供了证书生成,提供针对各种JDK版本的 PKCS/CMS/CRMF/CMP/EAC/DANE/DVCS/TSP/TLS/DTLS 和 OpenPGP支持。
除非特殊声明,所有该站点提供的软件都遵循 下列协议 发布。
如果在列表中没有找到想要的资源,可以看看我们的资源页面。
1、为什么要使用BouncyCastle?
我们平常都使用jdk自带的加密包对数据进行加密,加密方式也都是使用的默认的,如果我们想选择别的加密方式,发现会报错,比如如下代码:
-
Cipher cipher = Cipher.getInstance( “AES/ECB/PKCS7Padding” );
-
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec( “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA” .getBytes( “UTF-8″ ), “AES” ));
-
cipher.doFinal( “QWEASDZS” .getBytes( “UTF-8″ ));
这时候我们就需要借助BouncyCastle了。
2、如何使用BouncyCastle?
2.1、方式一
(1)去BouncyCastle官网下载provider的包,然后放入$JAVA_HOME\jre\lib\ext目录下;
(2)修改配置文件$JAVA_HOME\jre\lib\security\java.security,加入一行配置:security.provider.按顺序填数字=org.bouncycastle.jce.provider.BouncyCastleProvider
(3)代码如下:
-
Cipher cipher = Cipher.getInstance( “AES/ECB/PKCS7Padding” );
-
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec( “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA” .getBytes( “UTF-8″ ), “AES” ));
-
cipher.doFinal( “QWEASDZS” .getBytes( “UTF-8″ ));
这个方式不太合适, 因为有时候要替换 环境中的 jdk的, 因此在替换时若是处理不当, 后面就无法工作了。
例如oralce的jdk已经陆续开始收费了, 我们公司已经全部都替换为openjdk了, 因此若是把库房到jdk下面, 就有麻烦了!
2.2、方式二
(1)在代码中通过maven引入BouncyCastle的包
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.56</version>
</dependency>
(2)无需像方式一一样修改配置文件,直接在代码中手动添加provider:
-
Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider());
-
Cipher cipher = Cipher.getInstance( “AES/ECB/PKCS7Padding” );
-
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec( “AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA” .getBytes( “UTF-8″ ), “AES” ));
-
cipher.doFinal( “QWEASDZS” .getBytes( “UTF-8″ ));
下面一个段测试代码(包括MD5,Base64以及AES加密):
public void test() {
String clearText = “Hello World!”;
String password = “hi”;
//md5
MD5Digest digest = new MD5Digest();
digest.update(password.getBytes(), 0, password.length());
int md5Num = digest.getByteLength();
byte[] md5Buf = new byte[md5Num];
digest.doFinal(md5Buf, 0);
//base64
byte[] base64Buf = Base64.encode(md5Buf);
byte[] key = new byte[16];//设置key长度为128位
System.arraycopy(base64Buf, 0, key, 0, 16);
//AES加密
byte[] cipherBuf = null;
cipherBuf = AESEncode(clearText.getBytes(), key);
//AES解密
String decryptText = AESDecode(cipherBuf, key);
System.out.println(“md5:” + new String(md5Buf));
System.out.println(“base64:” + new String(base64Buf));
System.out.println(“key:” + new String(key));
System.out.println(“cipher:” + new String(cipherBuf));
System.out.println(“clear:” + decryptText);
}
Base64编码后的字符串是由a~z,A~Z,+,/这64个字符组合而成,末尾补齐用“=”号表示。
AES加密算法对key的长度有限制,它只支持128,192和256位的key。所以代码中接key设置成16个字节。
下面是AES加密的代码:
public byte[] AESEncode(byte[] clearText, byte[] key) {
byte[] rv = null;
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
cipher.init(true, new KeyParameter(key));
rv = new byte[cipher.getOutputSize(clearText.length)];
int oLen = cipher.processBytes(clearText, 0, clearText.length, rv, 0);
try {
cipher.doFinal(rv, oLen);
} catch (DataLengthException e) {
} catch (IllegalStateException e) {
} catch (InvalidCipherTextException e) {
}
return rv;
}
下面是AES解密的代码:
public String AESDecode(byte[] cipherText, byte[] key) {
byte[] rv = null;
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new AESEngine());
cipher.init(false, new KeyParameter(key));
rv = new byte[cipher.getOutputSize(cipherText.length)]; //该大小会大于实际的大小
int oLen = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);
try
{
cipher.doFinal(rv, oLen);
} catch (DataLengthException e) {
} catch (IllegalStateException e) {
} catch (InvalidCipherTextException e) {
}
return new String(rv).trim();
}
代码中rv的初始化长度会大于实际解密后数据的长度,所以生成的String要去掉空格。
以上所述就是小编给大家介绍的《BouncyCastle使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
高性能JavaScript
【美】Nicholas C. Zakas(尼古拉斯.泽卡斯) / 丁琛 / 电子工业出版社 / 2015-8-1 / 65
如果你使用 JavaScript 构建交互丰富的 Web 应用,那么 JavaScript 代码可能是造成你的Web应用速度变慢的主要原因。《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM 交互、页面生存周期等。雅虎的前端工程师 Nicholas C. Zakas 和其他五位 JavaScript 专家介绍......一起来看看 《高性能JavaScript》 这本书的介绍吧!