PKI - 对称加密算法

2024-04-25 18:38
文章标签 加密算法 对称 pki

本文主要是介绍PKI - 对称加密算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PKI - 对称加密算法

  • 1. 数据加密标准(DES - Data Encryption Standard)
  • 2. 三重DES - DESede
  • 3. 高级数据加密标准(AES - Advanced Encryption Standard)
  • 4. 国际数据加密标准(IDEA - International Data Encryption Algorithm)
  • 5. 基于口令加密(PBE - Password Based Encryption)

  • 1977 DES
  • 1998 AES
  • 1990 IDEA

1. 数据加密标准(DES - Data Encryption Standard)

发送方 接收方 1. 构建密钥(Offline) 2. 公布密钥(Offline) 3. 使用密钥对数据加密(Online) 4. 发送加密数据(online) 5. 使用密钥对数据解密(online) 发送方 接收方
// 密钥算法
public static final String KEY_ALGORITHM = "DES";
// 加密/解密算法 / 工作模式 / 填充方式
public static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding";// 密钥生成(56位)
public byte[] generateDesSecretKey() throws NoSuchAlgorithmException {// generate des keyfinal KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);keyGenerator.init(56);final SecretKey secretKey = keyGenerator.generateKey();return secretKey.getEncoded();
}// 密钥生成(64位)
public byte[] generateDesSecretKey64() throws NoSuchAlgorithmException {// generate des keySecurity.addProvider(new BouncyCastleProvider());final KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);keyGenerator.init(64);final SecretKey secretKey = keyGenerator.generateKey();return secretKey.getEncoded();
}// 根据密钥生成SecretKey对象
public SecretKey generateDesSecretKey(byte[] encodedSk) throws Exception {// create SecretKey object with given secret keyfinal DESKeySpec desKeySpec = new DESKeySpec(encodedSk);final SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);return secretKeyFactory.generateSecret(desKeySpec);
}// 数据加密
public byte[] encryptData(SecretKey secretKey, byte[] rawData) throws Exception {final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(rawData);
}// 数据解密
public byte[] decryptData(SecretKey secretKey, byte[] encryptData) throws Exception {final Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(encryptData);
}@Test
public void testDES() throws Exception {// 生成密钥final byte[] secretKeyBytes = generateDesSecretKey();// 创建SecretKey对象final SecretKey secretKey = generateDesSecretKey(secretKeyBytes);// 原文final String rawMessage = "我是阿汤哥";// 加密后final byte[] encryptBytes = encryptData(secretKey, rawMessage.getBytes());// 解密后final byte[] decryptedBytes = decryptData(secretKey, encryptBytes);// 输出System.out.println("原文:  " + rawMessage + "\n" +"密钥:  " + Base64.toBase64String(secretKeyBytes) + "\n" +"加密后:" + Base64.toBase64String(encryptBytes) + "\n" +"解密后:" + new String(decryptedBytes));
}

执行结果

原文:  我是阿汤哥
密钥:  Am0+0HV5Rp4=
加密后:xoensMBnckMY0H4HAjuqUQ==
解密后:我是阿汤哥

2. 三重DES - DESede

DES算法有三点安全隐患:密钥太短、迭代偏少和半公开性。针对密钥太短和迭代偏少的问题,有人提出了多重DES的方式来克服这些缺陷。比较典型的有两重DES(2DES)、三重DES(3DES)和四重DES(4DES)等几种形式,在实际应用中一般采用三重DES,它还有两个别名 Triple DES和DESede。

三重DES的代码实现需要变更以下内容:

  • KEY_ALGORITHM 调整:由 DES 改为 DESede
  • CIPHER_ALGORITHM 调整:如DESede/ECB/PKCS5Padding
  • 密钥长度调整: Java7支持的密钥长度为 112位 和 168位,Bouncy Castle支持的密钥长度为 128位 和 192位

3. 高级数据加密标准(AES - Advanced Encryption Standard)

1997年,NIST发起了征集DES替代算法 - AES(Advanced Encryption Standard,高级数据加密标准)算法的活动。最终在2000年10月2日,由Daemen和Rijmen两位比利时人提出的Rijndael算法,以其密钥设置快、存储要求低,在硬件实现和限制存储的条件下性能优异当选AES算法。

AES的代码实现需要变更以下内容:

  • KEY_ALGORITHM 调整:由 DES 改为 AES
  • CIPHER_ALGORITHM 调整:如 AES/ECB/PKCS5Padding
  • 密钥长度调整: AES标准支持三种密钥长度,分别为 128位、192位、256位,默认长度 128位

4. 国际数据加密标准(IDEA - International Data Encryption Algorithm)

IDEA(International Data Encryption Algorithm,国际数据加密标准)算法是由旅居瑞士的中国青年学者来学嘉和著名密码专家JamesMassey于1990年提出的一种对称分组密码,并于1992年修改完成。

IDEA的代码实现需要变更以下内容:

  • KEY_ALGORITHM 调整:由 DES 改为 IDEA
  • CIPHER_ALGORITHM 调整:如 IDEA/ECB/ISO10126Padding
  • 密钥长度调整: 128位

5. 基于口令加密(PBE - Password Based Encryption)

PBE算法是对称加密算法的综合性算法,常见算法如PBE With MD5 And DES,该算法使用了MD5和DES算法构建PBE算法。

发送方 接收方 1. 构建口令(Offline) 2. 公布口令(Offline) 3. 构建盐(Online) 4. 使用口令、盐对数据加密(Online) 5. 发送盐、加密数据(online) 6. 使用口令、盐对数据解密(online) 发送方 接收方

盐可以是消息传递双方按一定规律约定的信息,如时间。也可以是某个不可变物理硬件的编号,如U盘自身的唯一标识。

甲乙双方可以通过约定消息传递时间,并将其作为“盐”的基本信息,根据预定的算法(如MD5)对其处理,最终获得真正的“盐”。这样一来,“盐”就无需传递,提高了安全性。

如果有一种系统,使用者需要将U盘插入计算机,同时输入口令方可登录系统,那么U盘就是“盐”信息的提供者。即使U盘丢失,加密的信息也未必能被窃取。

从另一个角度思考,“盐”和口令就像两把密不可分的钥匙。

/*** Java7支持以下任意一种算法* PBEWithMD5AndDES* PBEWithMD5AndTripleDES* PBEWithSHA1AndDESede* PBEWithSHA1AndRC2_40* PBKDF2WithHmacSHA1*/
public static final String ALGORITHM = "PBEWITHMD5andDES";
/*** 迭代次数*/
public static final int ITERATION_COUNT = 100;public byte[] initPbeSalt() {return SecureRandom.getSeed(8);
}public SecretKey generatePbeSecretKey(String password) throws Exception {// 生成SecretKeyfinal PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());final SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);return secretKeyFactory.generateSecret(pbeKeySpec);
}// 数据加密
public byte[] pbeEncryptData(String password, byte[] salt, byte[] rawData) throws Exception {// 生成SecretKeyfinal SecretKey secretKey = generatePbeSecretKey(password);// 构建PBEParameterSpecfinal PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, ITERATION_COUNT);// 数据加密Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey, pbeParameterSpec);return cipher.doFinal(rawData);
}// 数据解密
public byte[] pbeDecryptData(String password, byte[] salt, byte[] encryptData) throws Exception {// 生成SecretKeyfinal SecretKey secretKey = generatePbeSecretKey(password);// 构建PBEParameterSpecfinal PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, ITERATION_COUNT);// 数据加密Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey, pbeParameterSpec);return cipher.doFinal(encryptData);
}@Test
public void testPbe() throws Exception {// 初始化"盐"final byte[] salt = initPbeSalt();// 生成密钥String password = "password";final SecretKey secretKey = generatePbeSecretKey(password);// 原文final String rawMessage = "我是阿汤哥";// 加密后final byte[] encryptBytes = pbeEncryptData(password, salt, rawMessage.getBytes());// 解密后final byte[] decryptedBytes = pbeDecryptData(password, salt, encryptBytes);// 输出System.out.println("原文:  " + rawMessage + "\n" +"密码:  " + password + "\n" +"盐:    " + Base64.toBase64String(salt) + "\n" +"加密后:" + Base64.toBase64String(encryptBytes) + "\n" +"解密后:" + new String(decryptedBytes));
}

输出结果

原文:  我是阿汤哥
密码:  password
盐:    ZDdkibobCyE=
加密后:3PIwmYdqtJ7OPtvbPfkdLQ==
解密后:我是阿汤哥

这篇关于PKI - 对称加密算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935482

相关文章

线性代数 第六讲 特征值和特征向量_相似对角化_实对称矩阵_重点题型总结详细解析

文章目录 1.特征值和特征向量1.1 特征值和特征向量的定义1.2 特征值和特征向量的求法1.3 特征值特征向量的主要结论 2.相似2.1 相似的定义2.2 相似的性质2.3 相似的结论 3.相似对角化4.实对称矩阵4.1 实对称矩阵的基本性质4.2 施密特正交化 5.重难点题型总结5.1 判断矩阵能否相似对角化5.2 已知两个矩阵相似,求某个矩阵中的未知参数5.3 相似时,求可逆矩阵P,使

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[

AES加密算法说明

首先,我们得了解AES加密算法的一些基本概念。AES是一种对称加密算法,所谓对称,是说它的加密、解密过程使用相同的密钥。还有非对称加密算法,例如RSA,加密解密使用的是公私钥对。 AES同时是一种分组加密算法,分组的长度一般是16字节(128bit)。分组是什么意思呢?假设我有一段很长的明文T,我没法用AES加密整个T,只能将T分成若干16byte的明文组,接着对这些明文组逐个进行加密,得到一堆密

RS485差分信号不对称

在RS485总线通信中,差分信号不对称的问题时常出现,尤其是在总线未接从机设备的情况下。这一问题不仅影响通信质量,还可能导致信号传输错误。通过对实际波形、芯片手册及电路的深入分析,可以找出引发差分信号不对称的根本原因,并采取相应的解决措施。 问题描述 在RS485通信测试中,当总线上没有从机设备连接时,观察到RS485差分信号(A、B)关于地(GND)不对称。理想情况下,RS485的差分信

【网络安全】服务基础第一阶段——第十一节:Windows系统管理基础----PKI技术与应用

目录​​​​​​​ 一、加密技术 1.1 基本保密通信模型 1.2 密码学发展 1.2.1 古典密码学(1949年前) 1.2.2 近代密码学(1949~1975年) 1.2.3 现代密码学(1976年以后) 1.3 古典密码 1.3.1 古典密码学的特点: 1.3.2 古典密码学的主要分类 1.4 近代密码学 1.5 现代密码学 1.5.1 非对称密钥密码学的基本概念

【SM系列】简单说说SM2,SM3,SM4加密算法

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是SM2加密?2.1 应用场景2.2 与RSA算法的区别 三、什么是SM3加密?3.1 应用场景 四、什么是SM4加密?4.1 应用场景 五、最后 开篇说明 之前我们说过了几种常见加密算法,今天我

对称的二叉树 java实现

题目描述: 请实现一个函数,用来判断一棵二叉树是不是对称的,如果一棵二叉树和他的镜像是一样的,那么它是对称的; 解题思路:首先 理解镜像的概念,进行就是一棵二叉树左右节点反转过后形成的二叉树和原来的二叉树是一样的。这道题目中判断条件是使用和元二叉树的镜像相同,那么最low的方法是对原二叉树进行重构,重构后的二叉树和原二叉树进行比较,相同即是对称,不同就是不对称喽。那么这种方法需要额外空间的,我

数据结构:(LeetCode101)对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3]输出:true 示例 2: 输入:root = [1,2,2,null,3,null,3]输出:false 提示: 树中节点数目在范围 [1, 1000] 内-100 <= Node.val <= 100 进阶:你可以运用递归和迭

对称密码学

1. 使用OpenSSL 命令行         在 Ubuntu Linux Distribution (发行版)中, OpenSSL 通常可用。当然,如果不可用的话,也可以使用下以下命令安装 OpenSSL: $ sudo apt-get install openssl 安装完后可以使用以下命令检查 OpenSSL 版本: $ openssl version 其输出将如下所示: O

判断一棵二叉树是否为对称树之java实现

package com.cb.java.algorithms.jianzhioffer.tree;public class SymmetricTree {class TreeNode {int data; // 数据域TreeNode left;// 左子节点TreeNode right; // 右子节点public TreeNode(int data) {this.data = data;}}p