java jce-Cipher(加密、解密)

article/2025/9/18 6:05:54

java jce-Cipher(加密、解密)

在开发时,总要涉及到数据的加密与解密,之前一直有些糊涂,最近看了 jce.jar的源码,来整理记录一下

1、概念

JCA(Java Cryptography Architecture): Java密码体系结构

JCE(Java Cryptography Extension):它是一组包,提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。它提供了对称、不对称、块和流密码的加密支持,并且还支持安全流和密封的对象,不对外出口,开发完成封装后将无法调用。

在早期JDK版本中,由于受美国的密码出口条例约束,Java中涉及加解密功能的API被限制出口,所以Java中安全组件被分成了两部分: 不含加密功能的JCA(Java Cryptography Architecture )和含加密功能的JCE(Java Cryptography Extension)。

在JDK1.1-1.3版本期间,JCE属于扩展包,仅供美国和加拿大的用户下载,JDK1.4+版本后,JCE已经捆绑在JDK中,即jdk中的 jce.jar 包

1.1 加密算法

数据加密的基本过程就是对原来为明文的 文件 或 数据 按某种 算法 进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的 密钥 之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的,常见的加密算法,分为对称加密与非对称加密

1.1.1 对称式加密技术

加密和解密使用同一个密钥,通常称之为“Session Key ” ,如美国政府所采用的 DES 加密标准就是一种典型的 对称式加密法,它的Session Key长度为56bits

请添加图片描述

1.1.2 非对称式加密技术

加密和解密所使用的不是同一个密钥,通常有两个密钥,称为**“公钥”“私钥”,它们两个必需配对使用**,否则不能打开加密文件

“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难不把密钥告诉对方,不管用什么方法都有可能被别人窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题

请添加图片描述

1.1.3 常用的加密算法

算法名称密钥长块长速度说明类型
DES5664较快适用于加密大量数据,不太安全对称加密
3DES112/16864较慢中等安全, 适合加密较小的数据对称加密
AES128, 192, 256128安全对称加密
Blowfish(4至56)*864应该安全, 在安全界尚未被充分分析、论证对称加密
RC440-102464很快安全性不明确,变长密钥对大量数据进行加密对称加密
RSA500-1024很慢512位被视为不安全的;768位不用担心受到危害;1024位几乎是安全的,用于少量数据加密飞对称加密
MD512832普遍、稳定广泛应用于普通数据,不可逆散列算法
SHA1160安全散列算法,但安全性如今被密码学家严重质疑散列算法

总结:

  • 非对称加密普遍会比对称加密慢,取决于密码长度(长度长计算复杂度大)
  • 非对称加密普遍使用RSA,对称加密普遍使用AES
  • 对称加密的密钥管理较为重要,需要保证传输的安全性
  • 散列算法的安全性不高,有被破解的可能

2、核心类与核心方法

以jdk 1.8 为例进行下面的说明

jce.jar 包的核心API都在 javax.crypto 包下,主要包括:加解密、密钥生成(对称)、MAC生成、密钥协商等核心功能

请添加图片描述

核心的一些类/接口如下:

  • Cipher
  • KeyGenerator
  • SecretKeyFactory

这篇主要介绍Cipher,其他的会单独写一些博客来记录一下

Cipher

加解密功能在该类实现,是JCE中最核心的类

  • 加密:是获取数据(称为明文)和 密钥,并生成对不知道密钥的第三方无意义的数据(密文)的过程
  • 解密:加密逆过程,获取密文和密钥并生成明文

请添加图片描述

主要由以下方法:

  • getInstance:创建一个Cipher对象
  • init:Cipher对象初始化
  • update:执行加密或解密数据(多步骤)如果事先不知道数据的长度,或者数据太长,无法一次存储在内存中,则使用该操作
  • doFinal:执行加密或解密数据(单步骤)

下面详细说明:

1 getInstance:创建一个Cipher对象

根据以下三种重载方法获取到一个Cipher对象

// var0 是 transformation    
public static final Cipher getInstance(String var0) throws NoSuchAlgorithmException, NoSuchPaddingException {
}
// var1 是具体的 provider name   java.security.Security根据name获取Prvider
public static final Cipher getInstance(String var0, String var1) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException {
}
// var1 是具体的provider
public static final Cipher getInstance(String var0, Provider var1) throws NoSuchAlgorithmException, NoSuchPaddingException {
}

说明:

1)transformatior有以下两种形式: 具体细节与详情可查看 Java密体系结构标准算法文档 ,算法 algorithm必填,缺省的mode为ECB,缺省的padding为PKCS5Padding

  • algorithm/mode/padding” example:“AES/CBC/PKCS5Padding”
  • algorithm” example:“AES”

algorithm取值:

  • AES / AESWrap
  • ARCFOUR
  • Blowfish
  • RC2 / RC4 / RC5
  • RSA
  • DES / DESede / DESedeWrap / ECIES

mode取值:具体可查看 加密模式介绍(ECB、CBC、PCBC、CFB、OFB、CTR)

  • NONE
  • CBC
  • CCM
  • CFB, CFBx
  • CTR / CTS
  • ECB
  • GCM
  • OFB, OFBx
  • PCBC

padding取值:(分组算法的时候若数据不是块的整数倍,需要进行填充)具体可查看 分组加密中的填充介绍

  • NoPadding
  • ISO10126Padding
  • OAEPPadding / OAEPWithAndPadding
  • PKCS1Padding / PKCS5Padding
  • SSL3Padding

2 init:Cipher对象初始化

根据以下几种重载方法进行Cipher对象初始化

// opmode 操作模式,有四种
// key 密钥,Key 的子类很多,根据具体的加密算法来选择合适的密钥
public void init(int opmode, Key key);// certificate 身份(一个主体对另一个主体证明的公钥的绑定)
public void init(int opmode, Certificate certificate);// random 加密强随机数
public void init(int opmode, Key key, SecureRandom random);public void init(int opmode, Certificate certificate,SecureRandom random);// params 加密参数规范 用于加密的参数必须用于解密
public void init(int opmode, Key key,AlgorithmParameterSpec params);public void init(int opmode, Key key,AlgorithmParameterSpec params, SecureRandom random);public void init(int opmode, Key key,AlgorithmParameters params);public void init(int opmode, Key key,AlgorithmParameters params, SecureRandom random);

Cipher有4种操作模式(即var1有四种取值):

  • ENCRYPT_MODE:加密
  • DECRYPT_MODE:解密
  • WRAP_MODE:将key包装成字节,以便可以安全地传输密钥,导出Key
  • UNWRAP_MODE:将以前包装的密钥解包到key中,导入Key

3 update:执行加密或解密数据(多步骤)

根据以下四种重载方法执行加密/解密,一般用于不知道数据的长度,用该操作

// input:加密数据,返回处理后的byte数组
public byte[] update(byte[] input);
// inputOffset:数据开始位置
// inputLen:数据加密长度 返回处理后的byte数组
public byte[] update(byte[] input, int inputOffset, int inputLen);// output:处理后的数据存储,返回是否成功(0/1)
public int update(byte[] input, int inputOffset, int inputLen,byte[] output);
// output:处理后的数据存储
// outputOffset :处理后的数据存储起始位置,返回是否成功(0/1)
public int update(byte[] input, int inputOffset, int inputLen,byte[] output, int outputOffset)

4 doFinal:执行加密或解密数据(单步骤)

根据以下四种重载方法执行加密/解密

// input:加密数据,返回处理后的byte数组
public byte[] doFinal(byte[] input);
// inputOffset:数据开始位置
// inputLen:数据加密长度 返回处理后的byte数组
public byte[] doFinal(byte[] input, int inputOffset, int inputLen);
// output:处理后的数据存储,返回是否成功(0/1)
public int doFinal(byte[] input, int inputOffset,int inputLen, byte[] output);
// output:处理后的数据存储
// outputOffset :处理后的数据存储起始位置,返回是否成功(0/1)
public int doFinal(byte[] input, int inputOffset,int inputLen, byte[] output, int outputOffset)

5 举例

使用流程:

  1. 创建Cipher对象
  2. 初始化(指明具体操作)
  3. 加密/解密

加密 example:

// 用于加强的seed
private static String strKey = "diaxxxxoft@201Y10";
// 获取密钥key
private static Key getKey(String strKey) throws NoSuchAlgorithmException {KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128 ,new SecureRandom(strKey.getBytes()));SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();return new SecretKeySpec(enCodeFormat, "AES");
}
/**
* 根据密钥{@link #getKey()}对指定的明文 plainText进行加密.** @param plainText 明文* @return 加密后的密文.*/
public static void encryptData(String plaintext) {System.out.println("-------Encrypting data using AES algorithm-------");try {byte[] plaintTextByteArray = plaintext.getBytes("UTF8");// 定义Cipher cipher = Cipher.getInstance("AES");// 初始化cipher.init(Cipher.ENCRYPT_MODE, getKey(strKey));// 加密byte[] cipherText = cipher.doFinal(plaintTextByteArray);System.out.println("Original data: " + plaintext);System.out.println("Encrypted data:");for (int i = 0; i < cipherText.length; i++) {System.out.print(cipherText[i] + " ");}
//            BASE64Encoder encoder = new BASE64Encoder();
//            String encoded = encoder.encode(cipherText);
//            decryptData(encoded);}catch(Exception ex){ex.printStackTrace();}
}
输出:
Original data: mlpan@019
Encrypted data:
96 -82 -108 -12 31 54 -24 69 94 -80 52 -93 -3 121 77 62 

解密 example:

public static void decryptData(String cipherText) {System.out.println();System.out.println("-------Decrypting data using AES algorithm-------");try {BASE64Decoder decoder = new BASE64Decoder();byte[] c = decoder.decodeBuffer(cipherText);System.out.println("Encrypted data:" + cipherText);// 创建Cipher cipher = Cipher.getInstance("AES");// 初始化cipher.init(Cipher.DECRYPT_MODE, getKey(strKey));// 解密byte[] bytes = cipher.doFinal(c);System.out.println("Original data: " + new String(bytes));} catch (Exception ex) {ex.printStackTrace();}
}
输出:
Encrypted data:nEgCrS0YxLzCO+TO8ZO4ng==
Original data: mlpan@019

相关链接

1、JCA

java JCA参考指南

Java密体系结构标准算法文档


http://chatgpt.dhexx.cn/article/htWdJjZ4.shtml

相关文章

什么是文件扩展名 JCE?

有没有人给您发送过 JCE文件&#xff0c;而您却不知道该如何打开&#xff1f;可能您在电脑上发现了一个 JCE文件却不知道这是做什么用的&#xff1f;Windows 可能会告诉您无法打开文件&#xff0c;或者最糟糕的是&#xff0c;您可能会收到一个JCE文件相关的错误信息。 打开JCE文…

JAVA加密--JCA、JCE、CSP概念、体系架构与使用示例

1 概念 JCA: Java密码体系结构 Java Cryptography Architecture JCE&#xff08;Java Cryptography Extension&#xff09;&#xff0c;在早期JDK版本中&#xff0c;由于受美国的密码出口条例约束&#xff0c;Java中涉及加解密功能的API被限制出口&#xff0c;所以Java中安全组…

JCE的功能分析

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

第四章 数据关联分析方法

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

关联性——典型相关分析

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

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

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

R语言做关联分析

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

数据关联分析

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

关联性——灰色关联分析

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

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

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

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

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

灰色关联分析步骤

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

四.数据关联性分析

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

关联分析(Association analysis)

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

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

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

关联分析之Apriori学习笔记

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

关联分析(一)

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

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

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

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

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

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

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