对称加密算法就是传统的用一个密码进行加密和解密。例如:我们常用的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. 对称式加密和非对称式加密

    本文来说下对称式加密和非对称式加密 文章目录 概述 概述 考察的知识点是对称加密与非对称加密算法,什么是对称加密,什么是非对称加密呢? 对称加密:指加密和解密使用同一密钥,优点是运算速度较快,缺点是如 ...

  2. 常见的对称式加密与非对称式加密算法

    1.概述 对称式加密:对称加密算法就是传统的用一个密码进行加密和解密,通信发送方使用这种算法加密数据,接收方也用同样的算法解密数据. 因此对称式加密本身不是安全的.从程序的角度看,所谓加密,就是这样一 ...

  3. 加密解密-对称加密与非对称加密

    目录 加密-Encryption Symmetric-Key Encryption(对称密钥加密) 凯撒密码-对称加密的例子-aesarCipher 例子 Kercos原理-Kerckhoff's P ...

  4. 哈希算法和·Hmac算法 对称式与非对称式加密对比

    哈希算法( Hash )又称摘要算法( Digest ), 作用:对任意一组输入数据进行计算,得到一个固定长度的输出摘要. 哈希算法的目的:为了验证原始数据是否被篡改. 哈希算法最重要的特点就是: 相 ...

  5. SSH加密密码中的非对称式密码学

    转 wiki https://zh.wikipedia.org/zh-cn/公开密钥加密 公开密钥密码学 (英语:Public-key cryptography),也称为非对称式密码学(英语:asym ...

  6. JackHttp -- 浅谈编码、加密(对称加密,非对称加密,Hash算法)

    如果你还不清楚 JackHttp 是什么,请戳这里!!! JackHttp 是一个网络框架系列,为什么还要分享编码和加密呢?主要有如下几个原因: HTTP 在网络传输过程中是明文的. HTTP 在网络 ...

  7. java祖冲之加密算法_对称加密和非对称加密

    一  非对称加密 非对称加密和解密花费的时间长 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),一般使用公钥进行加密,使用私钥进行解密. 常见的非对称加密 ...

  8. 通俗解释对称加密、非对称加密、散列算法与PKI

    这是我前些年写在51的,现在转过来,其实是CISSP的学习笔记,用自己的语言组织起来的,用通俗的话说明对称加密.非对称加密.散列算法.PKI(CA)到底都是干啥的.OK,进入主题: 密码学要解决的问题 ...

  9. 加解密基础——(对称加密、非对称加密和混合加密)

    本文对之前学习过的加解密相关知识做一简单总结,以备后用. 1. 基本概念 加密算法 通常是复杂的数学公式,这些公式确定如何将明文转化为密文的过程和规则. 密钥 是一串被加入到算法中的随机比特. 待续 ...

  10. 对称加密和非对称加密

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 对称加密 对称密钥是双方使用相同的密钥 . 对称加密的要求 (1)需要强大的加密算法.算法至少应该满足:即使分析人员知道 ...

最新文章

  1. 一分钟详解PCL中点云配准技术
  2. windows部署微服务jar包 yml_杰克布开源项目,低代码开发框架,Docker快速部署
  3. C++类的定义和声明
  4. 堆晶结构_内蒙古苏尼特左旗地区堆晶角闪辉长岩的发现及地质意义
  5. Spark 1.3 新特性 :176个贡献者,1000+ patches
  6. mysql ogg_异构平台mysql-oracle(ogg)安装部署
  7. 寻仙新马源码一键端_强大,腾讯开源前后端接口开发工具!
  8. 【线上直播】深度学习简介与落地实战经验分享
  9. Java应用程序上的Twitter API
  10. 网络流-SAP算法模板
  11. 远程计算机用户名,远程计算机服务
  12. opencv计算机视觉编程攻略 第2版,OpenCV计算机视觉编程攻略(第2版)pdf
  13. react-native this使用笔记
  14. Java -- Thread中start和run方法的区别
  15. 程序员转项目管理之考证PMP
  16. 学会这招,从此解决被知乎封号烦恼
  17. 第一篇:什么是IT行业
  18. 模块一 day06 数据类型(中)
  19. bug_ warning: control reaches end of non-void function
  20. 前端——》H5页面开屏分离特效

热门文章

  1. 机器码、序列号、认证码、注册码的生成算法(三)
  2. MDK Keil 使用STLink仿真,LOAD按钮为灰色解决方法
  3. 链表实现直接选择排序
  4. Windows运维之Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
  5. 【洞察】152号令,重量级行业信息技术法规
  6. php strlen 汉子,php使用strlen()判断中文汉字字符串长度
  7. idea 格式化代码时, 不换行
  8. 前端拼音首字母搜索姓名
  9. Android模仿超级课表,展示多门课程重叠,页面有折角背景
  10. Chrome浏览器插件之---FeHelper