首页 > 名品 > Java密码扩展之JCE的功能分析

Java密码扩展之JCE的功能分析

2017-09-23 13:48   来源:中国新闻发言人培训中心【中国新闻智库】政府|企业|危机公关处理  

什么是JCE

JCE(Java Cryptography Extension)即Java暗码扩大,是JDK1.4的一个重要部分。它是一组包,它们供给用于加密、密钥生成算法和协商以及 Message Authentication Code(MAC)算法的框架和实现。

它供给对对称、纰谬称、块和流暗码的加密支撑,它还支撑安然流和密封的对象。它纰谬外出口,用它开辟完成封装后将无法调用。

供给者是谁

JCE的功能

JCE的API都在javax.crypto包下,核心功能包含:加解密、密钥生成(对称)、MAC生成。

一. 加解密

加解密功能由Cipher组件供给,其也是JCE中最核心的组件。

1、Cipher的几个常识点:

Key pbeSecretKey = getPBEKey();

a. Cipher在应用时需以参数方法指定transformation

b. transformation的格局为algorithm/mode/padding,个中algorithm为必输项,如: DES/CBC/PKCS5Padding

c. 缺省的mode为ECB,缺省的padding为PKCS5Padding

d. 在block算法与流加密模式组应时, 需在mode后面指定每次处理的bit数, 如DES/CFB8/NoPadding, 如未指定则应用缺省值, SunJCE缺省值为64bits

/**

e. Cipher有4种操作模式: ENCRYPT_MODE(加密), DECRYPT_MODE(解密), WRAP_MODE(导出Key), UNWRAP_MODE(导入Key),初始化时需指定某种操作模式。

2、对称加密的算法与密钥长度选择

a. 密钥长度是在生成密钥时指定的,如:

KeyGenerator generator = KeyGenerator.getInstance("AES/CBC/PKCS5PADDING");

SecretKey key = generator.generateKey();

b、生成长度超128bits的密钥,需零丁从Oracle官网下载对应JDK版本的Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files文件,例如JDK7对应的jurisdiction policy files

3、加密示例代码

/**

*根据密钥{@link #getKey()}对指定的明文plainText进行加密.

*

*@param plainText 明文

*@return 加密后的密文.

*/

public static final String encrypt(String plainText) {

Key secretKey = getKey();

try {

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, secretKey);

byte[] p = plainText.getBytes("UTF-8");

byte[] result = cipher.doFinal(p);

BASE64Encoder encoder = new BASE64Encoder();

String encoded = encoder.encode(result);

return encoded;

}catch (Exception e) {

throw new RuntimeException(e);

}

}

4、解密示例代码

*根据密钥{@link #getKey()}对指定的密文cipherText进行解密.

*

*@param cipherText 密文

*@return 解密后的明文.

*/

public static final String decrypt(String cipherText) {

*获取PBE算法的密钥. 留意PBE密钥由用户供给的口令构造出来的,

Key secretKey = getKey();

try {

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

byte[] p = plainText.getBytes("UTF-8");

cipher.init(Cipher.DECRYPT_MODE, secretKey);

BASE64Decoder decoder = new BASE64Decoder();

byte[] c = decoder.decodeBuffer(cipherText);

byte[] result = cipher.doFinal(c);

String plainText = new String(result, "UTF-8");

return plainText;

}catch (Exception e) {

throw new RuntimeException(e);

}

}

5、带算法参数的加解密

Cipher可能用到算法参数(AlgorithmParameterSpec或AlgorithmParameters)的情况:

a. DES, DES-EDE, and Blowfish应用feedback模式时(如CBC, CFB, OFB或PCBC), 将用到IV

System.out.println(encoder.encode(result));

b. PBEWithMD5AndDES将用到salt和iteration count

下面是采取PBE算法进行加解密的示例:

/**

*供给基于口令的加密功能.

*

*

*@param plainText 明文

*@return 加密后的密文.

*/

public static final String pbeEncrypt(String plainText) {

PBEParameterSpec pbeParamSpec = getParamSpec();

}

try {

Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

generator.init(256);

cipher.init(Cipher.ENCRYPT_MODE, pbeSecretKey, pbeParamSpec);

byte[] result = cipher.doFinal(p);

BASE64Encoder encoder = new BASE64Encoder();

String encoded = encoder.encode(result);

return encoded;

}catch (Exception e) {

throw new RuntimeException(e);

byte[] salt = { (byte) 0xab, (byte) 0x58, (byte) 0xa1, (byte) 0x8c,

/**

*供给基于口令的解密功能.

*@param cipherText 密文

*@return 解密后的明文.

*/

public static final String pbeDecrypt(String cipherText) {

Key pbeSecretKey = getPBEKey();

PBEParameterSpec pbeParamSpec = getParamSpec();

try {

Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");

cipher.init(Cipher.DECRYPT_MODE, pbeSecretKey, pbeParamSpec);

BASE64Decoder decoder = new BASE64Decoder();

byte[] c = decoder.decodeBuffer(cipherText);

}

byte[] result = cipher.doFinal(c);

String plainText = new String(result, "UTF-8");

}catch (Exception e) {

throw new RuntimeException(e);

}

}

/**

*用户供给的口令务必应用char数组, 而不克不及应用字符串, 字符数

*组用完即清空.

*

*@return PBE算法的密钥.

*/

return plainText;

private static final Key getPBEKey() {

// TODO come from db or System.in, NOTE: MUST be char array, not java.lang.String

char[] pwd = {'%', '_', 'A', 's', '9', 'K'};

SecretKey pbeKey = null;

try {

SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");

pbeKey = keyFac.generateSecret(pbeKeySpec);

return pbeKey;

}catch (Exception e) {

throw new RuntimeException(e);

}finally {

Arrays.fill(pwd, ' ');

}

}

/**

}

*获取PBE的算法参数, 涉及salt和iterate count两个参数.

*

*@return PBE的算法参数.

*/

private static final PBEParameterSpec getParamSpec() {

(byte) 0x3e, (byte) 0xc8, (byte) 0x9d, (byte) 0x7a };

int count = 20;

PBEParameterSpec paramSpec = new PBEParameterSpec(salt, count);

return paramSpec;

byte[] result = mac.doFinal(msg.getBytes("UTF-8"));

测试代码:

String pbePlainText = "127Kjk$%2^";

String pbeCipherText = pbeEncrypt(pbePlainText);

String pbePlainText2 = pbeDecrypt(pbeCipherText);

if (!pbePlainText.equals(pbePlainText2)) {

System.out.println("PBE Something wrong");

}

二、密钥生成

非对称密钥的生成请参考security.KeyPairGenerator,样例代码请参考JCA中的示例,对称密钥生成的示例代码如下:

KeyGenerator gen = KeyGenerator.getInstance("DES");

gen.init(56, new SecureRandom());

Key key= gen.generateKey();

三、 MAC生成

MAC技巧用于确认数据的完全性,Mac请求通信两边共享一个secret key,示例代码如下:

Key key = KeyGeneratorDemo.generateMac();

Mac mac = Mac.getInstance("HmacSHA256");

mac.init(key);

PBEKeySpec pbeKeySpec = new PBEKeySpec(pwd);

供给者是特定加密算法的实现者,有的供给者(供给的加密技巧)是免费的,有的不免费,IBM, Bouncy Castle, 和 RSA都是一些(加密)供给者。

String msg = "新庄杨渡10#";

BASE64Encoder encoder = new BASE64Encoder();

MAC优于数据摘要的处地点于:MAC两边要共享一个密钥,所以其也有互相认证的功能,可有效防止数据摘要中明文和数据摘要被同时调换而无法发明的问题。

GDCA致力于收集信息安然,已经由过程WebTrust 的国际认证,是全球可托任的证书签发机构。GDCA专业技巧团队将根据用户具体情况为其供给最优的产品选择建议,并针对不合的应用或办事器请求供给专业对应的HTTPS解决筹划。GDCA一向以"构建收集信赖体系,办事现代数字生活"的主旨,致力于供给全球化的数字证书认证办事。其自立品牌--信鉴易 TrustAUTH SSL证书:包含 OVSSL、EVSSL、代码签名证书等。为涉足互联网的企业打造更安然的生态情况,建立更具公信力的企业网站形象。

化学师长教师:你过来闻一下

化学方程式写错,师长教师问:这是你们家家传配方吗?

我:好刺鼻

化学师长教师:这个液体有毒,今后不要闻了。

地舆师长教师充公了我的鬼吹灯,第二天顶着两个黑眼圈问我,你晚上看真的不害怕嘛?

班主任出了车祸,右手骨折,来上课的时刻还打着石膏,进班的第一句话就是"没想到吧!我杨过又回来了"。

Java密码扩展之JCE的功能分析

关于博主 / About

提利昂·兰尼斯特(Tyrion Lannister)是泰温公爵和乔安娜夫人的第三个也是最小的孩子。因为是个侏儒,他有时候被戏称为小恶魔和半人。他利用自己的智慧屡次化险为夷,帮助兰尼斯特家族赢得了五王之战,但命运的不公使得他成为了一个弑亲者和通缉犯,踏上了流亡之路。

VIEW MORE