密码学知识

news/2024/10/21 6:02:46/

密码学是网络安全、信息安全、区块链等产品的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。

明文:加密前的消息叫明文(plain text) 

密文:加密后的文本叫密文(cipher text)

密钥:只有掌握特殊钥匙的人,才能对加密的文本进行解密,这里的钥匙就叫做密钥(key)

 常见的加密算法:

  • MD5信息摘要算法

  • DES是对称性加密算法

  • RSA是一种非对称加密算法

一、消息摘要

摘要算法就是我们常说的散列函数、哈希函数(Hash Function),它能够把任意长度的数据“压缩”成固定长度、而且独一无二的“摘要”字符串,就好像是给这段数据生成了一个数字“指纹”。

作用:保证信息的完整性

特点:

  • 不可逆:只有算法,没有秘钥,只能加密,不能解密

  • 难题友好性:想要破解,只能暴力枚举

  • 发散性:只要对原文进行一点点改动,摘要就会发生剧烈变化抗

  • 碰撞性:原文不同,计算后的摘要也要不同

常见消息摘要算法

  • MD5

  • SHA1

  • SHA256

  • SHA512

二、对称性加密算法

对称加密指的就是加密解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥

对称加密算法

  • DES

  • AES

  • 3DES

特点

  • 加密速度快, 可以加密大文件

  • 密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露

  • 加密后编码表找不到对应字符, 出现乱码

  • 一般结合Base64使用

具体实现:

Java实现AES加解密_十点半的毛毛雨的博客-CSDN博客

三、非对称性加密算法

非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密

非对称加密算法

  • RSA

  • ECC

特点

  • 加密和解密使用不同的密钥

  • 如果使用私钥加密, 只能使用公钥解密

  • 如果使用公钥加密, 只能使用私钥解密

  • 处理数据的速度较慢, 因为安全级别高

3.1代码实现

实现思路

1、先生成对应的公钥和似钥文件
2、读取公钥或者私钥匙文件获取口令
3、加密(如果使用私钥加密, 只能使用公钥解密,如果使用公钥加密, 只能使用私钥解密
4、解密

生成密钥文件

 /*** 生成秘钥* @param algorithm 算法* @param pubPath 公钥保存路径* @param priPath 私钥保存路径*/public static  void generateKey(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {// 1. 获取密钥生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 2. 获取密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 3. 获取公钥PublicKey publicKey = keyPair.getPublic();// 4. 获取私钥PrivateKey privateKey = keyPair.getPrivate();// 5. 获取byte数组byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 6. 编码BASE64编码String publicKeyString = Base64.encode(publicKeyEncoded);String privateKeyString = Base64.encode(privateKeyEncoded);// 7. 保存文件,保存在项目中的target目录下FileUtils.writeStringToFile(new File(pubPath),publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath),privateKeyString, Charset.forName("UTF-8"));}

读取公钥和私钥

 /*** 读取公钥文件* @param publicPath* @param algorithm* @return*/public static PublicKey getPublicKey(String publicPath,String algorithm) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {// 1. 读取文件String s = FileUtils.readFileToString(new File(publicPath), Charset.forName("UTF-8"));// 2. 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 3. 构建秘钥规范X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(s));return keyFactory.generatePublic(x509EncodedKeySpec);}/*** 读取公钥文件* @param PrivatPath 私钥路径* @param algorithm 算法* @return*/public static PrivateKey getPrivatKey(String PrivatPath,String algorithm) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {// 1. 读取文件String s = FileUtils.readFileToString(new File(PrivatPath), Charset.forName("UTF-8"));// 2. 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 3. 构建秘钥规范PKCS8EncodedKeySpec pes = new PKCS8EncodedKeySpec(Base64.decode(s));return keyFactory.generatePrivate(pes);}

3.1.1实现加密

 /*** 加密* @param input 原文* @param key 密钥* @param algorithm 算法* @return*/public static String encryptRSA(String input,Key key,String algorithm) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {// 1. 创建加密对象Cipher cipher = Cipher.getInstance(algorithm);// 2. 初始化加密cipher.init(Cipher.ENCRYPT_MODE,key);// 3. 公钥加密byte[] bytes = cipher.doFinal(input.getBytes());return Base64.encode(bytes);}

调用

public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {// 1. 原文String input = "我是曾阿牛";// 2. 加密算法String  algorithm = "RSA";// 公钥加密 -->  私钥解密// 3. 获取公钥PublicKey publicKey = getPublicKey("a.pub", algorithm);// 4. 加密String s = encryptRSA(input, publicKey, algorithm);}

3.1.2解密

读取私钥文件并解密操作

 public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchPaddingException {// 1. 加密算法String  algorithm = "RSA";// 密文String s = "A密文";// 2、读取私钥PrivateKey privatKey = getPrivatKey("a.pri", algorithm);// 解密String s1 = decryptRSA(s, privatKey, algorithm);System.out.println(s1);}


http://www.ppmy.cn/news/106494.html

相关文章

ubuntu安装yarn

参考https://phoenixnap.com/kb/how-to-install-yarn-ubuntu Follow the steps below to install Yarn using Corepack: Ensure your Node.js version is up-to-date. node -v Corepack requires Node.js 16.10 or later. If the output shows an older version, update Node.…

MGRE 综合实验

配置IP的地址 [R1-GigabitEthernet0/0/0]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [R1-GigabitEthernet0/0/0]int s4/0/0 [R1-Serial4/0/0]ip add 15.0.0.1 24 [R2]int s 4/0/0 [R2-Serial4/0/0]ip add 25.0.0.1 24 [R2-Serial4/0/0]int g 0/0/0 [R2-Giga…

华为OD机试真题B卷 Java 实现【字符统计】,附详细解题思路

一、题目描述 输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。 数据范围:字符串长度满足 1≤len(str)≤1000 。 二、输入描述 一个…

在虚拟机上部署hadoop集群(全流程)

一、单节点部署前置准备 这里一直下一步就好了 接下来需要为该节点固定ip并配置相关网关还有dns解析 这里配置了一个本机dns解析,也配置了一个公网dns解析(主要目的还是为了固定ip

微服务架构打造的供应链系统、采购配送系统,支持SaaS模式

一、开源项目简介 haohan-scm 介绍 基于pig微服务架构打造 供应链系统,采购配送系统。为客户提供仓储管理、订单管理、打单、货源采购、分拣、配送等系统功能。 二、开源协议 使用AGPL-3.0开源协议 三、界面展示 系统截图 四、功能概述 基于pig微服务架构打…

CASA模型:生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟

查看原文>>>生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用 目录 第一章 CASA模型介绍(讲解案例实践) 第二章 CASA初步操作 第三章 CASA数据制备(一) 第四章 CASA数据制备&am…

FinOps云成本管理的新方法

云计算为企业带来了巨大的灵活性和创新机会,但也带来了成本控制的挑战。云服务使企业更容易大规模部署应用程序和服务,但如果不仔细管理,费用可以快速增加。据国际知名厂商Flexera云报告显示,企业云支出浪费平均 30%。 FinOps 是一种新的工作方法,专注于云成本管理…

Three.js教程:对象克隆、复制

推荐:将 NSDT场景编辑器 加入你的3D工具链 其他系列工具: NSDT简石数字孪生 对象克隆.clone()和复制.copy() Threejs大多数对象都有克隆.clone()和复制.copy()两个方法,点模型Points、线模型Line、网格网格模型Mesh一样具有这两个方法。 复制方法.copy…