对称式加密与非对称式加密的对比
对称加密算法就是传统的用一个密码进行加密和解密。例如:我们常用的WinZip和WinRAR对压缩包的加密和解密就是使用的对称加密算法。
常见的对称加密算法有:
目前主流的对称式加密算法为AES加密算法
我们以AES算法,ECB工作模式为例,看看如如计算哈希:
一:加密:
1、创建加密对象Cipher
2、根据key内容,恢复密钥对象
3、初始化密钥,设置加密模式
4、根据原始内容进行加密
5、输出加密结果
二:解密
1、创建解密对象Cipher
2、根据key内容,恢复密钥对象
3、初始化密钥,设置解密模式
4、根据原始内容进行解密
5、输出解密结果
public class Demo07 {public static void main(String[] args) {// 对称加密算法// AES算法 ECB模式try {// 密文byte[] messageByte = "12346".getBytes();// 密钥byte[] keyByte = "1234567891234567".getBytes();// 加密// 创建密码对象Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 根据key内容,恢复密钥对象SecretKey keySpec = new SecretKeySpec(keyByte, "AES");// 初始化密钥,设置加密模式cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 根据原始内容,进行加密byte[] resByteArray = cipher.doFinal(messageByte);// 输出加密内容System.out.println(Base64.getEncoder().encodeToString(resByteArray));// 解密cipher.init(Cipher.DECRYPT_MODE, keySpec);byte[] aaaByteArray = cipher.doFinal(resByteArray);// 输出加密内容System.out.println(new String(aaaByteArray));} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchPaddingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvalidKeyException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalBlockSizeException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (BadPaddingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
加解密结果:
根据结果可以发现,加解密步骤大致相同,但是要保证双方密钥在交换的过程中保证安全性,一般我们会采用DH算法,也就是密钥交换算法,使用了这种算法可以保证双方的共享密钥一致,并且保证了密钥的安全性。一般情况下,对称式加密算法都是与密钥交换算法配合起来使用的。
再来看非对称式加密算法:
非对称加密算法使用的是一对密钥,使用公钥加密私钥解密的方法,这就使得在通信初期,要想双方可以通信,必须让A方先发送公钥给B方,B方通过接受的公钥进行加密,再将密文发送给A方,A方再使用私钥进行解密。尽管这样会使效率降低,但能大幅度保证安全传输。一般情况下,都是对称式加密算法与非对称式加密算法配合起来使用。
非对称式加密算法如下:
public class Main04 {public static void main(String[] args) {// Bob和Alice:Person bob = new Person("Bob");Person alice = new Person("Alice");// 各自生成KeyPair: 公钥+私钥bob.generateKeyPair();alice.generateKeyPair();// 双方交换各自的PublicKey(公钥):// Bob根据Alice的PublicKey生成自己的本地密钥(共享公钥):bob.generateSecretKey(alice.publicKey.getEncoded());// Alice根据Bob的PublicKey生成自己的本地密钥(共享公钥):alice.generateSecretKey(bob.publicKey.getEncoded());// 检查双方的本地密钥是否相同:bob.printKeys();alice.printKeys();// 双方的SecretKey相同,后续通信将使用SecretKey作为密钥进行AES加解密...}
}// 用户类
class Person {public final String name; // 姓名// 密钥public PublicKey publicKey; // 公钥private PrivateKey privateKey; // 私钥private byte[] secretKey; // 本地秘钥(共享密钥)// 构造方法public Person(String name) {this.name = name;}// 生成本地KeyPair:(公钥+私钥)public void generateKeyPair() {try {// 创建DH算法的“秘钥对”生成器KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DH");kpGen.initialize(512);// 生成一个"密钥对"KeyPair kp = kpGen.generateKeyPair();this.privateKey = kp.getPrivate(); // 私钥this.publicKey = kp.getPublic(); // 公钥} catch (GeneralSecurityException e) {throw new RuntimeException(e);}}// 按照 "对方的公钥" => 生成"共享密钥"public void generateSecretKey(byte[] receivedPubKeyBytes) {try {// 从byte[]恢复PublicKey:X509EncodedKeySpec keySpec = new X509EncodedKeySpec(receivedPubKeyBytes);// 根据DH算法获取KeyFactoryKeyFactory kf = KeyFactory.getInstance("DH");// 通过KeyFactory创建公钥PublicKey receivedPublicKey = kf.generatePublic(keySpec);// 生成本地密钥(共享公钥)KeyAgreement keyAgreement = KeyAgreement.getInstance("DH");keyAgreement.init(this.privateKey); // 初始化"自己的PrivateKey"keyAgreement.doPhase(receivedPublicKey, true); // 根据"对方的PublicKey"// 生成SecretKey本地密钥(共享公钥)this.secretKey = keyAgreement.generateSecret();} catch (GeneralSecurityException e) {throw new RuntimeException(e);}}public void printKeys() {System.out.printf("Name: %s\n", this.name);System.out.printf("Private key: %x\n", new BigInteger(1, this.privateKey.getEncoded()));System.out.printf("Public key: %x\n", new BigInteger(1, this.publicKey.getEncoded()));System.out.printf("Secret key: %x\n", new BigInteger(1, this.secretKey));}
}
结果如下:
总的来说:对称式加密使用同一个密钥进行加密和解密。而非对称式加密就是加密和解密使用的是不同的密钥,只有同一对的公钥和私钥才能正常进行加密和解密。
对称式加密与非对称式加密的对比相关推荐
- 对称式加密和非对称式加密
本文来说下对称式加密和非对称式加密 文章目录 概述 概述 考察的知识点是对称加密与非对称加密算法,什么是对称加密,什么是非对称加密呢? 对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如 ...
- 常见的对称式加密与非对称式加密算法
1.概述 对称式加密:对称加密算法就是传统的用一个密码进行加密和解密,通信发送方使用这种算法加密数据,接收方也用同样的算法解密数据. 因此对称式加密本身不是安全的.从程序的角度看,所谓加密,就是这样一 ...
- 加密解密-对称加密与非对称加密
目录 加密-Encryption Symmetric-Key Encryption(对称密钥加密) 凯撒密码-对称加密的例子-aesarCipher 例子 Kercos原理-Kerckhoff's P ...
- 哈希算法和·Hmac算法 对称式与非对称式加密对比
哈希算法( Hash )又称摘要算法( Digest ), 作用:对任意一组输入数据进行计算,得到一个固定长度的输出摘要. 哈希算法的目的:为了验证原始数据是否被篡改. 哈希算法最重要的特点就是: 相 ...
- SSH加密密码中的非对称式密码学
转 wiki https://zh.wikipedia.org/zh-cn/公开密钥加密 公开密钥密码学 (英语:Public-key cryptography),也称为非对称式密码学(英语:asym ...
- JackHttp -- 浅谈编码、加密(对称加密,非对称加密,Hash算法)
如果你还不清楚 JackHttp 是什么,请戳这里!!! JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因: HTTP 在网络传输过程中是明文的. HTTP 在网络 ...
- java祖冲之加密算法_对称加密和非对称加密
一 非对称加密 非对称加密和解密花费的时间长 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),一般使用公钥进行加密,使用私钥进行解密. 常见的非对称加密 ...
- 通俗解释对称加密、非对称加密、散列算法与PKI
这是我前些年写在51的,现在转过来,其实是CISSP的学习笔记,用自己的语言组织起来的,用通俗的话说明对称加密.非对称加密.散列算法.PKI(CA)到底都是干啥的.OK,进入主题: 密码学要解决的问题 ...
- 加解密基础——(对称加密、非对称加密和混合加密)
本文对之前学习过的加解密相关知识做一简单总结,以备后用. 1. 基本概念 加密算法 通常是复杂的数学公式,这些公式确定如何将明文转化为密文的过程和规则. 密钥 是一串被加入到算法中的随机比特. 待续 ...
- 对称加密和非对称加密
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 对称加密 对称密钥是双方使用相同的密钥 . 对称加密的要求 (1)需要强大的加密算法.算法至少应该满足:即使分析人员知道 ...
最新文章
- 一分钟详解PCL中点云配准技术
- windows部署微服务jar包 yml_杰克布开源项目,低代码开发框架,Docker快速部署
- C++类的定义和声明
- 堆晶结构_内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义
- Spark 1.3 新特性 :176个贡献者,1000+ patches
- mysql ogg_异构平台mysql-oracle(ogg)安装部署
- 寻仙新马源码一键端_强大,腾讯开源前后端接口开发工具!
- 【线上直播】深度学习简介与落地实战经验分享
- Java应用程序上的Twitter API
- 网络流-SAP算法模板
- 远程计算机用户名,远程计算机服务
- opencv计算机视觉编程攻略 第2版,OpenCV计算机视觉编程攻略(第2版)pdf
- react-native this使用笔记
- Java -- Thread中start和run方法的区别
- 程序员转项目管理之考证PMP
- 学会这招,从此解决被知乎封号烦恼
- 第一篇:什么是IT行业
- 模块一 day06 数据类型(中)
- bug_ warning: control reaches end of non-void function
- 前端——》H5页面开屏分离特效