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协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Caching
Duane Wessels / O'Reilly Media, Inc. / 2001-6 / 39.95美元
On the World Wide Web, speed and efficiency are vital. Users have little patience for slow web pages, while network administrators want to make the most of their available bandwidth. A properly design......一起来看看 《Web Caching》 这本书的介绍吧!