Java加密签名算法学习

文章目录

  • 一、加解密
    • 1,RSA
    • 2,DES
    • 3,AES
  • 二、不可逆加密
    • 1,MD5
    • 2,SHA256
  • 三、签名
    • 1,RSA
    • 2,DSA

签名是为了验证数据的来源和完整性
加密是为了保护数据的内容,使其对未授权的用户不可读
在这里插入图片描述

一、加解密

1,RSA

一种非对称加密算法,有两个不同的密钥,一个是公钥,一个是私钥
名称由来:Ron Rivest、Adi Shamir、Leonard Adleman,由三位在麻省理工学院工作的人的姓氏开头首字母组成

public static void cipherRSA(String orgStr){
try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();Cipher encryCipher = Cipher.getInstance("RSA");encryCipher.init(Cipher.ENCRYPT_MODE,publicKey);byte[] encrypted = encryCipher.doFinal(orgStr.getBytes());String encryRes = Base64.getEncoder().encodeToString(encrypted);System.out.println("RSA加密结果==>" + encryRes);Cipher decryCipher = Cipher.getInstance("RSA");decryCipher.init(Cipher.DECRYPT_MODE,privateKey);byte[] decrypted = decryCipher.doFinal(encrypted);String decryRes = new String(decrypted);System.out.println("RSA解密结果==>" + decryRes);}catch (Exception e){e.printStackTrace();
}
}

执行结果:加密结果每次都不一样

RSA加密结果==>P4m9ZPe1ApCWt21cND83Hj4ArPvrjrzWPrR9ktJCPx8IlRWemdd8q4FzHVAYrzzoL58LIlX7yHkOXXKTD9cueHM800HGdLJbpN4Fl21Y81wS+0kqDwDvP1azlsCamTuD2EPR5NbIhbj7TXfNsaM2SKzap38GaTWo+Keu7Nh/ZAgeONPH9VNweRpPrahcgBMZVWJYP9J15Y7Z8bjjSpO5RvaZnqj99A6m4dJTL1l2uOgIqcctAtI+Afc3DrL16PBPXloj/FKR3G3qInOtgT/l14ZoZ/4ixPnKvg/JWcOmpmlf4xPiCg285TFyXGHx+lAEP4FKM45sY2y/gm9Z83TEfA==

RSA解密结果==>山姆超市

2,DES

全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,对称密码体制,加密和解密使用相同的密钥。

public static void cipherDES(String orgStr) {
try {KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");keyGenerator.init(56);SecretKey secretKey = keyGenerator.generateKey();Cipher encryCipher = Cipher.getInstance("DES");encryCipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encrypted = encryCipher.doFinal(orgStr.getBytes());StringBuilder hexString = new StringBuilder();for (byte b : encrypted) {hexString.append(String.format("%02X",b));}String myHash = hexString.toString();System.out.println("DES加密结果==>" + myHash);Cipher decryCipher = Cipher.getInstance("DES");decryCipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] org = decryCipher.doFinal(encrypted);String originalString = new String(org);System.out.println("DES解密结果==>" + originalString);
} catch (Exception e) {e.printStackTrace();
}
}

执行结果:每次加密结果不一样

DES加密结果==>748487D7AA6A088294859D44D672BA40
DES解密结果==>山姆超市

3,AES

高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,为了替换DES
ECB(Electronic Code Book电子密码本)模式
CBC(Cipher Block Chaining,加密块链)模式

public static void cipherAES(String orgStr) {
try {// key长度得是16位byte[] keyBytes = "xmlxmlxmlxmlxml1".getBytes();byte[] iv = "lxmlxmlxmlxmlxm2".getBytes();IvParameterSpec ivSpec = new IvParameterSpec(iv);SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");Cipher encryCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");encryCipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);byte[] encrypted = encryCipher.doFinal(orgStr.getBytes());String res = Base64.getEncoder().encodeToString(encrypted);System.out.println("AES加密结果==>" + res);Cipher decryCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");decryCipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] org = decryCipher.doFinal(encrypted);String originalString = new String(org);System.out.println("AES解密结果==>" + originalString);
} catch (Exception e) {e.printStackTrace();
}
}

执行结果:加密结果每次都一样

AES加密结果==>Wmk5xZq6NbDHA02C8uqJ0g==
AES解密结果==>山姆超市

二、不可逆加密

只能加密,不能解密,散列是单向不可逆
黑客可通过彩虹表和字典来破解哈希(散列),应对方法是加盐(在密码的随机位置加入随机字符串)
彩虹表就是通过预先计算并存储大量的哈希值与对应的明文密码之间的关系,从而允许快速地从哈希值恢复出原始密码,这种表的大小通常很大,主流的彩虹表大小超过100GB。

1,MD5

Message-Digest Algorithm 5,中文名为消息摘要算法第五版,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

public static void encryptMD5(String orgStr){
try {MessageDigest messageDigest = MessageDigest.getInstance("MD5");messageDigest.update(orgStr.getBytes());byte[] digest = messageDigest.digest();StringBuilder stringBuilder = new StringBuilder();for(byte b:digest){stringBuilder.append(String.format("%02x",b));}String myHash = stringBuilder.toString();System.out.println("MD5加密结果==>" + myHash);
}catch (Exception e){e.printStackTrace();
}
}

输入:

encryptMD5(“山姆超市”);

执行结果:字符串长度为32位

MD5加密结果==>d680cd5e34b94a88ea9be28d028cd648

2,SHA256

是SHA 2系列算法细分出的一种算法,其中SHA是 Secure Hash Algorithm(安全散列算法) 的缩写,256值代表最终的哈希值摘要
目前最受推荐的哈希加密算法,被认为是 MD5 的继承者

public static void encryptSHA256(String orgStr) {
try {MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");messageDigest.update(orgStr.getBytes());byte[] digest = messageDigest.digest();StringBuilder hexString = new StringBuilder();for (byte b : digest) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}String myHash = hexString.toString();System.out.println("SHA-256加密结果==>" + myHash);
} catch (Exception e) {e.printStackTrace();
}
}

输入:

encryptSHA256("山姆超市");

执行结果:字符串长度为64位

SHA-256加密结果==>19b0a9ff44f815b1dc88751b02ad4b14eb0192253f78fd5baf711f04a4068a77

三、签名

1,RSA

私钥签名,公钥验证

public static void signRSA(String src){try {// 生成RSA密钥对KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey =  keyPair.getPublic();PrivateKey privateKey =  keyPair.getPrivate();// 私钥签名Signature signature = Signature.getInstance("SHA256withRSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] realSign = signature.sign();// 公钥验签signature.initVerify(publicKey);signature.update(src.getBytes());boolean isValid = signature.verify(realSign);System.out.println("RSA Signature is " + (isValid ? "valid" : "invalid"));}catch (Exception e){e.printStackTrace();}}

执行结果

RSA Signature is valid

2,DSA

DSA(Digital Signature Algorithm)是一种数字签名算法,它被广泛用于确保电子文档的完整性和认证。DSA 是美国政府开发的,并在 1994 年成为 FIPS 186 标准的一部分。
可以用于文件签名和数字证书,拥有很高的安全性和唯一性,但速度较慢
ECDSA 和 EdDSA可以用来代替DSA

public static void signDSA(String src){
try {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();KeyFactory keyFactory = KeyFactory.getInstance("DSA");// 获取私钥PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);// 初始化签名Signature dsaSign = Signature.getInstance("SHA1withDSA");dsaSign.initSign(privateKey);dsaSign.update(src.getBytes());// 签名byte[] realSign = dsaSign.sign();// 获取公钥X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);// 验签dsaSign.initVerify(publicKey);dsaSign.update(src.getBytes());boolean isValid = dsaSign.verify(realSign);System.out.println("DSA Signature is " + (isValid ? "valid" : "invalid"));}catch (Exception e){e.printStackTrace();
}
}
signDSA("helloworld");

执行结果;

DSA Signature is valid

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/706810.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置

本节博客主要是通过“在排序数组中查找元素的第一个和最后一个位置”总结关于二分算法的左右界代码模板,有需要借鉴即可。 目录 1.题目2.二分边界算法2.1查找区间左端点2.1.1循环条件2.1.2求中点的操作2.1.3总结 2.2查找区间右端点2.1.1循环条件2.1.2求中点的操作2.…

JavaScript-基本数据类型和变量

基本数据类型 JavaScript支持数字、字符串和布尔值3种基本数据类型 字符串型 字符串型是JavaScript用来表示文本的数据类型,字符串通常由单引号或双引号括起来,如果字符串存在特殊字符,可以用转义字符代替 数字型 数字型也是JavaScript中的基…

每日一题——力扣206. 反转链表(举一反三、思想解读)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三题目链接 目录 菜鸡写法​编辑 代码点评 代码分析 时间复杂度 空间复杂度 专业点评 另一种方法​编辑 代码点评 代码逻辑 时间复杂度 空间…

Django Celery 的配置及使用---最详细教程

Django Celery 的配置及使用 Redis提供队列消息功能 一、安装redis 系统版本:Ubuntu 20.041、获取最新软件包 sudo apt update sudo apt install redis-server2、安装完成后,Redis服务器会自动启动。查看redis是否启动成功 sudo systemctl status …

iOS ------ 多线程基础

一,进程和线程 1,进程 定义: 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专有的且受保护的内存进程是系统进行资源分配和调度的一个独立单位 补充:iOS系统是相对封闭的系统&a…

工厂自动化升级改造(3)-Modbus与MQTT的转换

什么是MQTT,Modbus,见下面文章 工厂自动化升级改造参考(01)--设备通信协议详解及选型-CSDN博客文章浏览阅读608次,点赞9次,收藏6次。>>特点:基于标准的以太网技术,使用TCP/IP协议栈,支持高速数据传输和局域网内的设备通信。>>>特点:跨平台的通信协议,…

ArrayList和LinkedList的使用

ArrayList List<> list new ArrayList<>(); LinkedList

XML文件转TXT文件 yolo标签转换(代码可直接使用) 可批量转换

像这样的xml文件&#xff0c;我们可以通过代码批量转换为txt文件格式&#xff1a; 新建一个xml2txt.py文件&#xff0c; 上代码&#xff0c;直接复制粘贴 import xml.etree.ElementTree as ET import osdef convert(size, box):x_center (box[0] box[1]) / 2.0y_center (box…

怎么把照片变小做头像?多种方法教你图片改尺寸

现在在社交媒体平台或者是社交软件上&#xff0c;我们经常会去更改头像来展示自己&#xff0c;但是有时候我们拍摄的照片太大无法直接用作头像&#xff0c;这时候就需要去修改图片尺寸&#xff0c;将图片改大小到合适的数值才能使用&#xff0c;那么如何快速的将图片改大小呢&a…

使用Python处理Excel数据:去除列中的双引号

目录 引言 技术背景 步骤概述 代码示例 案例分析 扩展内容 1. 处理多个列中的双引号 2. 处理大型Excel文件 3. 自定义函数处理数据 4. 错误处理和日志记录 结论 引言 在当今信息爆炸的时代&#xff0c;数据已经成为了各个行业最宝贵的资源之一。而Excel&#xff0c…

Python自学之路--004:Python使用注意点(原始字符串‘r’\字符转换\‘wb’与‘w区别’\‘\‘与‘\\’区别)

目录 1、原始字符串‘r’ 2、字符转换问题 3、open与write函数’wb’与’w’区分 4、Python里面\与\\的区别 1、原始字符串‘r’ 以前的脚本通过Python2.7写的&#xff0c;通过Python3.12去编译发现不通用了&#xff0c;其实也是从一个初学者的角度去看待这些问题。 其中的\…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…