JCE的功能分析

article/2025/9/18 6:09:18

什么是JCE

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

它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。它不对外出口,用它开发完成封装后将无法调用。

 

提供者是谁

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

JCE的功能

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

一. 加解密

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

1、Cipher的几个知识点:

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),初始化时需指定某种操作模式。ssl证书申请

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

一般情况下,不要选择DES算法,推荐使用AES算法。一般认为128bits的密钥已足够安全,如果可以请选择256bits的密钥。注意:

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

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

    generator.init(256);

    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) {

    Key secretKey = getKey();

    try {

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

    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

b. PBEWithMD5AndDES将用到salt和iteration count

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

/**

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

*

* @param plainText 明文

* @return 加密后的密文.

     */

    public static final String pbeEncrypt(String plainText) {

    Key pbeSecretKey = getPBEKey();

    PBEParameterSpec pbeParamSpec = getParamSpec();

    try {

    Cipher cipher = Cipher.getInstance(“PBEWithMD5AndDES”);

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

    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);

    }

    }

     

    /**

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

*

* @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”);

    return plainText;

    } catch (Exception e) {

    throw new RuntimeException(e);

    }

    }

     

    /**

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

* 用户提供的口令务必使用char数组, 而不能使用字符串, 字符数

* 组用完即清空.

*

* @return PBE算法的密钥.

     */

    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;

    PBEKeySpec pbeKeySpec = new PBEKeySpec(pwd);

    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[] salt = { (byte) 0xab, (byte) 0x58, (byte) 0xa1, (byte) 0x8c,

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

    int count = 20;

    PBEParameterSpec paramSpec = new PBEParameterSpec(salt, count);

    return paramSpec;

    }

测试代码:

    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);

String msg = “新庄杨渡10#”;

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

    BASE64Encoder encoder = new BASE64Encoder();

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

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


http://chatgpt.dhexx.cn/article/5H8tpy5P.shtml

相关文章

第四章 数据关联分析方法

基本概念和方法 关联规则和算法应用 基本概念和术语 关联规则算法应用: 一个关联规则分析的例子—————超市购物篮分析 不要看 后面数字看不懂 项集:是指项的集合。包含k个项的项集称为k-项集 支持度:若A是一个项集,则A的…

关联性——典型相关分析

1、作用 典型相关分析是研究多个变量和多个变量之间的线性相关关系,能够揭示出两组变量之间的内在联系。首先在每组变量中找到变量的线性组合,使得两组的线性组合之间具有最大的相关系数。然后选取和最初挑选的这对线性组合不相关的线性组合&#xff0c…

数据挖掘——关联分析基础介绍(上)

一、前提介绍: 啤酒与尿布: 在美国有婴儿的家庭中,一般是母亲在家中照看婴儿,年轻的父 亲前去超市购买尿布。父亲在购买尿布的同时,往往会顺便为自己购 买啤酒,这样就会出现啤酒与尿布这两件看上去不相干…

R语言做关联分析

目录 (一)案例简介 案例使用 数据预处理 分析结果 完整代码 目录 关联分析 理解关联分析的相关概念:关联分析、支持度、置信度、强规则、项集、频繁项集等。 掌握关联分析的基本方法:数据是事务的或关系的,如何由大量…

数据关联分析

数据挖掘算法:关联分析一(基本概念) 一.基本概念 我们来看上面的事务库,如同上表所示的二维数据集就是一个购物篮事务库。该事物库记录的是顾客购买商品的行为。这里的TID表示一次购买行为的编号,items表示顾客购买了…

关联性——灰色关联分析

1、作用 对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高;反之&#xff…

【关联分析实战篇】为什么 BI 软件都搞不定关联分析

文章目录 做不好关联分析的原因在数据模型层面解决关联给业务人员看的懂的数据结构多级关联表自关联表互关联表重复关联表 结语润乾报表资料 事物都是普遍联系的,很难有一个独立的事物不和其它发生关联,数据表也一样,很多有业务意义的查询都会…

因果分析与关联分析的联系

因果分析中的关联分析 因果分析的发现在大数据背景下变得越发重要,在数据分析领域,人们开始尝试着利用人工智能对数据进行因果分析,但一个因果关系的得出是错综复杂的,不单单是通过机器就能够解决的。 在数据分析中,…

灰色关联分析步骤

什么是灰色关联分析 灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。 通常可以运用此方法来分析各个因素对于结…

四.数据关联性分析

数据关联分析用于挖掘数据对象之间的关系,例如啤酒和尿布的案例 一.基本概念 通过实例认识项集,支持度,频繁项集,关联规则,置信度,强关联规则,支持度,置信度 运动器的历史购买数据 TID网球拍网球运动鞋羽毛球111102110031000410105011161100 TID: 表示每一次购物单的序号0…

关联分析(Association analysis)

关联分析(Association analysis) 简介 大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。 …

关联度分析法-灰色关联分析

目录 灰色关联分析介绍灰色关联分析的步骤实例 灰色关联分析介绍 对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高&#…

关联分析之Apriori学习笔记

关联分析(Association analysis) 简介 大量数据中隐藏的关系可以以‘关联规则’和‘频繁项集’的形式表示。rules:{Diapers}–>{Beer}说明两者之间有很强的关系,购买Diapers的消费者通常会购买Beer。 …

关联分析(一)

目录 一 关联分析的应用 二 关联分析定义 关联分析(又称关联挖掘) 常见关系分类 四 基本原理 ​编辑 五 常用算法 5.1 先验算法Apriori 5.2 FP-Growth算法 一 关联分析的应用 在美国国会投票记录中发现关联规则发现毒蘑菇的相似特征在Twitter源中发现一些共现词从网站…

数据分析五、Apriori 算法之关联分析

Apriori 算法 一、相关概念:二、Apriori 算法2.1、确定最小支持度和最小置信度2.2、找出频繁项集和强关联规则2.3、Python 调用 apriori 函数 Apriori---[əpriˈɔri] ---先天的,推测的一、相关概念: 关联分析,是一门分析技术&a…

数据的结构分类:结构化数据,半结构化数据以及非结构化数据

数据结构分类 结构化数据:具有域名与域值,可用二维表表示。例如关系数据库和CSV文档半结构数据:具有域值和域名,但每一笔数据的字段可能不一样。例如JSON以及XML非结构化数据:不具有域值和域名,例如文章&a…

结构化数据与非结构化数据有什么区别?

结构化数据和非结构化数据是大数据的两种类型,这两者之间并不存在真正的冲突。客户如何选择不是基于数据结构,而是基于使用它们的应用程序:关系数据库用于结构化数据,大多数其他类型的应用程序用于非结构化数据。 然而&#xff0…

结构化数据和非结构化数据有何区别?

员工离职,老板最关心的可能并不是工作交接是否滴水不漏,而是离职员工会如何处理他手里的数据。 例如设计人员的设计图纸、项目经理的项目文档等,这些文档属于企业珍贵的资产,而大部分企业却从未真正管控过这部分资产。 可以确定的…

什么是结构化数据、半结构化数据、非结构化数据

一、 结构化数据 结构化数据:即以关系型数据库表形式管理的数据,例如: idnameage1马百万262马龙台1 机构化数据的数据存储和排列都是具有规律性的,对于增删改查等功能支持友好 二、半结构化数据 半结构化数据:非关…

总结非结构化数据分析「十步走」

注:诚然,本文中所提到的内容并使非结构化数据结构化的唯一步骤,但该步骤的可行性,以及在创造可持续模式方面的表现已在实践中得到证实。 如今,数据分析逐渐在企业发展中扮演起愈加重要的角色,为求在业务成长…