热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java实现对称加密

一、对称加密算法概述对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加***(miyue)一起经过特殊加密算法处理后,使其变成复杂的加密

一、对称加密算法概述

对称加密算法是应用较早的加密算法,技术成熟。在对称加密算法中,数据发信方将明文(原始数据)和加***(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的**及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的**只有一个,发收信双方都使用这个**对数据进行加密和解密,这就要求解密方事先必须知道加***。

优缺点:

优点:算法公开、计算量小、加密速度快、加密效率高。

缺点:

(1)交易双方都使用同样钥匙,安全性得不到保证。

(2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,**管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为**管理困难,使用成本较高。

常用对称加密算法:

基于“对称**”的加密算法主要有DES、3DES(TripleDES)、AES、PBE、IDEA、RC2、RC4、RC5和Blowfish等。本文只介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。

二、对称加密算法—DES

DES算法全称为DATA Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:KEY、DATA、MODE。其中KEY为8个字节共64位,是DES算法的工作**;DATA也为8个字节64位,是要被加密或被解密的数据;MODE为DES的工作方式,有两种:加密或解密。

算法原理:

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的**也是64位,其算法主要分为两步:

(1)初始置换

其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结为:L0=D58D50……D8;R0=D57D49……D7。

(2)逆置换

经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。

DES:数据加密标准,是对称加密算法领域中的典型算法
特点:**偏短(56位)、生命周期短(避免被**)

具体算法如下图:

例子:


package rmd_intl_app.Test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Hex;
public class ImoocRSA {

private static String src = "abc123";
public static void main(String[] args) {
jdkDES();
}

public static void jdkDES() {
//生成**
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
//指定keysize
keyGenerator.init(56);
SecretKey secretKey = keyGenerator.generateKey();
byte[] bytesKey = secretKey.getEncoded();
//key转换
DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key cOnvertSecretKey= factory.generateSecret(desKeySpec);
//加密
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] resultBytes = cipher.doFinal(src.getBytes());
System.out.println("jdk des encrypt : " + Hex.encodeHexString(resultBytes));
//解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
resultBytes = cipher.doFinal(resultBytes);
System.out.println("jdk des decrypt : " + new String(resultBytes));
} catch (Exception e) {
e.printStackTrace();
}
//jdk des encrypt : 719e81b53b891b1309b138c3e8c8a068cc6d476aaf51c288
//jdk des decrypt : imooc security des
}
}

三、对称加密算法—3DES

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple DATA Encryption ALGORITHM)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的**长度变得容易被暴力**;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的**长度来避免类似的攻击,而不是设计一种全新的块密码算法。

算法原理

使用3条56位的**对 数据进行三次加密。3DES(即Triple DES)是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准)。

其具体实现如下:设Ek()和Dk()代表DES算法的加密和解密过程,K代表DES算法使用的**,P代表明文,C代表密文,这样:

3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

3DES解密过程为:P=Dk1(EK2(Dk3(C)))


3DES:将**长度增至112位或168位,通过增加迭代次数提高安全性

缺点:处理速度较慢、**计算时间较长、加密效率不高

例子:


package rmd_intl_app.Test;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import org.apache.commons.codec.binary.Hex;
public class ImoocRSA {

private static String src = "abc123";
public static void main(String[] args) {
jdk3des();
}

private static void jdk3des() {
// 生成**
try {
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
// 指定keysize
//keyGenerator.init(168);
//生成默认长度的KEY
keyGenerator.init(new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
byte[] bytesKey = secretKey.getEncoded();
// key转换
DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
Key cOnvertSecretKey= factory.generateSecret(desKeySpec);
// 加密
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] resultBytes = cipher.doFinal(src.getBytes());
System.out.println("jdk 3des encrypt : " + Hex.encodeHexString(resultBytes));
// 解密
cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
resultBytes = cipher.doFinal(resultBytes);
System.out.println("jdk 3des decrypt : " + new String(resultBytes));
} catch (Exception e) {
e.printStackTrace();
}
}
}

四、对称加密算法—AES

AES是目前使用最多的对称加密算法

AES的优势之一是至今尚未被**,AES通常用于移动通信系统加密以及基于SSH协议的软件。


AES:高级数据加密标准,能够有效抵御已知的针对DES算法的所有攻击

特点:**建立时间短、灵敏性好、内存需求低、安全性高

具体算法如下图:

例子:


package rmd_intl_app.Test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class ImoocRSA {

private static String src = "abc123";
public static void main(String[] args) {
jdkAES();
}

public static void jdkAES() {
try {
// 生成key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keybytes = secretKey.getEncoded();
// key的转换
Key key = new SecretKeySpec(keybytes, "AES");
// 加密
// AES/工作模式/填充方式
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdk aes encrypt : " + Base64.encodeBase64String(result));
// 解密
cipher.init(Cipher.DECRYPT_MODE, key);
result = cipher.doFinal(result);
System.out.println("jdk aes decrypt : " + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

五、对称加密算法—PBE

通过前面的例子,会发现AES、DES和3重DES在使用上比较一致。

PBE算法结合了消息摘要算法和对称加密算法的优点

PBE(PASSWORD Based Encryption)基于口令加密

具体算法如下图:

例子:


package rmd_intl_app.Test;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Base64;
public class ImoocRSA {

private static String src = "abc123";
public static void main(String[] args) {
jdkPBE();
}

public static void jdkPBE() {
try {
//初始化盐
SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(8);
//加密
//定义密码
String password = "imooc";
//把密码转换成**
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
Key key = factory.generateSecret(pbeKeySpec);
//加密过程
PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("jdk pbe encrypt : " + Base64.encodeBase64String(result));
//解密
cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);
result = cipher.doFinal(result);
System.out.println("jdk pbe decrypt : " + new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}

注意:推荐使用AES算法



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 标题: ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有