1.加密的相关概念

1.明文:被隐蔽的消息称作明文(plaintext)

2.密文:隐蔽后的消息称作密文(ciphertext)

3.加密:将明文变换成密文的过程称作加密(encryption)

4.解密:由密文恢复出原明文的过程称作解密(decryption)

5.敌方:主要指非授权者,通过各种办法,窃取机密信息

6.被动攻击:获密文进行分析,这类攻击称作被动攻击(passive attack)

7.主动攻击:非法入侵者(tamper)采用篡改、伪造等手段向系统注入假消息,称为主动攻击(active attack)

8.加密算法:对明文进行加密时采用的算法

9.解密算法:对密文进行解密时采用的算法

10.加密密钥和解密密钥:加密算法和解密算法的操作通常是在一组密钥(key)的控制下进行的,分别称为加密密钥(encryption key)和解密密钥(decryption key).

在加密系统中,加密算法和密钥是最重要的两个概念。在这里需要对加密算法和密钥进行一个解释。以最简单的“恺撒加密法”为例。

《高卢战记》有描述恺撒曾经使用密码来传递信息,即所谓的“恺撒密码”。它是一种替代密码,通过将字母按顺序推后3位起到加密作用,如将字母A换作字母D,将字母B换作字母E。如“China”可以变为“Fklqd”;解密过程相反。

在这个简单的加密方法中,“向右移位”,可以理解为加密算法;“3”可以理解为加密密钥。对于解密过程,“向左移位”,可以理解为解密算法;“3”可以理解为解密密钥。显然,密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。

恺撒加密法的安全性来源于两个方面:第一,对加密算法的隐藏;第二,对密钥的隐蔽。单单隐蔽加密算法以保护信息,在学界和业界已有相当讨论,一般认为是不够安全的。公开的加密算法是给黑客长年累月攻击测试,对比隐蔽的加密算法要安全多。一般说来,加密之所以安全,是因为其加密的密钥的隐藏,并非加密解密算法的保密。而流行的一些加密解密算法一般是完全公开的。敌方如果取得已加密的数据,即使得知加密算法,若没有密钥,也不能进行解密。

2.Java密码学结构设计遵循两个原则

1.算法的独立性和可靠性

2.实现的独立想和相互作用性

算法的独立性是通过定义密码服务类来获得。用户只需了解密码算法的概念,而不用去关心如何实现这些概念。实现的独立性和相互作用性通过密码服务提供器来实现。密码服务提供器是实现一个或多个密码服务的一个或多个程序包。软件开发商根据一定接口,将各种算法实现后,打包成一个提供器,用户可以安装不同的提供器。安装和配置提供器,可将包含提供器的ZIP和JAR文件放在CLASSPATH下,再编辑Java安全属性文件来设置定义一个提供器。

3.常见的加密算法

加密算法有很多种,一般可分为对称加密、非对称加密和单向加密三类算法。

对称加密算法过程如下:

1:发送方将明文和加密密钥一起经过加密算法处理,变成密文,发送出去。
2:接收方收到密文后,使用加密密钥及相同算法的逆算法对密文解密,恢复为明文。

非对称加密算法的基本过程是:

1:通信前,接收方随机生成的公钥,发送给发送方,自己保留私钥。
2:发送方利用接收方的公钥加密明文,使其变为密文。
3:接收方收到密文后,使用自己的私钥解密密文。

单向加密算法

该算法在加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,密文无法解密。只有重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新识别后,才能真正解密。

4.用Java实现DES

4.1 DES算法简介

DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

在DES中,使用了一个 56 位的密钥以及附加的8位奇偶校验位,产生最大64 位的分组大小。加密过程中,将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半。循环往复。DES 使用16个循环,但最后一个循环不交换。

4.2 java DES加密解密源码

package com.silvery.security.encrypt.impl;import java.io.IOException;
import java.security.SecureRandom;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;public class DESEncoder {private final static String DES = "DES";
// 默认密钥,DES加密和解密过程中,密钥长度都必须是8的倍数
public static String DEFAULT_KEY = "DJ!+LC$_Q.7T*&K~";/*** Description 根据键值进行加密* * @param data* @param key*            加密键byte数组* @return* @throws Exception*/public static String encrypt(String data, String key) {try {// data.getBytes()使用平台的默认字符集将此 String 编码为 byte 序列,// 并将结果存储到一个新的 byte 数组中。byte[] bt = encrypt(data.getBytes(), key.getBytes());String strs = new BASE64Encoder().encode(bt);return strs;} catch (Exception e) {e.printStackTrace();return "";}}/*** Description 根据键值进行解密* * @param data* @param key*            加密键byte数组* @return* @throws IOException* @throws Exception*/public static String decrypt(String data, String key) {if (data == null)return null;try {BASE64Decoder decoder = new BASE64Decoder();byte[] buf = decoder.decodeBuffer(data);byte[] bt = decrypt(buf, key.getBytes());return new String(bt);} catch (Exception e) {e.printStackTrace();return "";}}/*** Description 根据键值进行加密* * @param data* @param key*            加密键byte数组* @return* @throws Exception*/private static byte[] encrypt(byte[] data, byte[] key) throws Exception {// 生成一个可信任的随机数源SecureRandom sr = new SecureRandom();// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象,负责保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey securekey = keyFactory.generateSecret(dks);// Cipher对象实际完成加密操作,指定其支持DES算法Cipher cipher = Cipher.getInstance(DES);// 用密钥初始化Cipher对象,ENCRYPT_MODE表示加密模式cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);// 返回密文return cipher.doFinal(data);}/*** Description 根据键值进行解密* * @param data* @param key*            加密键byte数组* @return* @throws Exception*/private static byte[] decrypt(byte[] data, byte[] key) throws Exception {// 生成一个可信任的随机数源SecureRandom sr = new SecureRandom();// 从原始密钥数据创建DESKeySpec对象DESKeySpec dks = new DESKeySpec(key);// 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象,负责保存对称密钥SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);SecretKey securekey = keyFactory.generateSecret(dks);// Cipher对象实际完成解密操作,指定其支持DES算法Cipher cipher = Cipher.getInstance(DES);// 用密钥初始化Cipher对象,DECRYPT_MODE表示解密模式cipher.init(Cipher.DECRYPT_MODE, securekey, sr);// 返回明文return cipher.doFinal(data);}public static void main(String[] args) throws Exception {String str = "java加密与解密的实现";System.out.println("明文是:"+str);String enc = encrypt(str, DEFAULT_KEY);System.out.println("密文是:"+enc);String dec = decrypt(enc, DEFAULT_KEY);System.out.println("解密后的结果是:"+dec);}}

5.参考文献

http://www.oschina.net/code/snippet_727646_18383

ChinaSEI系列讲义(By郭克华) java加密解密大全

Java DES 加密解密相关推荐

  1. java des加密解密_Java实现的DES加密解密工具类实例

    本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import ...

  2. java des加密解密_DES加密和解密的JAVA实现方式

    import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import ...

  3. Java Des加密解密工具类

    原文链接: 1.http://www.java2s.com/Code/Java/Security/EncryptingaStringwithDES.htm 2.http://www.avajava.c ...

  4. java des加密解密_JAVA和c# 之间数据通讯时通过DES进行加密解密

    c#开发前端时调用java开发的接口,需要数据加密后通讯.两边都需要同时通过DES(BASE64)进行加解密. 代码如下 c#端: 加密 public static String Encrypt(St ...

  5. java des加密解密

    public class Des {/*** 对给定的字符串以指定的编码方式和密钥进行加密* @param srcStr 待加密的字符串* @param charset 字符集,如utf8* @par ...

  6. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  7. DES加密解密算法Java实现

    DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小.这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半.使用子密钥对其中一半应 ...

  8. java des加密类_java的DES加密解密辅助类

    java的DES加密解密辅助类 package temptest; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  9. Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    为什么80%的码农都做不了架构师?>>>    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DE ...

最新文章

  1. mongoDB 入门指南、示例
  2. 每个人眼中都有一个哈姆雷特
  3. 单行Bash无限while循环的语法
  4. if test project can't be opened in devenv
  5. 计算机网上作业系统论文,网上作业提交系统的设计与实现
  6. C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)
  7. svg标签的CSS3动画特效 - 经典特效
  8. SQL Server 日期函数:EOMonth、DateFormat、Format、DatePart、DateName
  9. 玉米叶片病害识别与分类的优化密集卷积神经网络模型
  10. 调用登录_微信小程序登录那些事
  11. 安装Linux操作系统(RHEL5.0)
  12. Informatica通过人工智能重新定义数据管理助力数据驱动型数字化转型
  13. 最简单的省市区三级联动
  14. 蓝色音箱改装电源_神改装:用小度音箱改装DIY音频AUX口,结局是大跌眼镜
  15. Building Worlds In Unreal 学习笔记——07-11 岩石树落木灌木绘制/溪水着色器/潮湿与焦散贴花/后处理
  16. case class 和 class的区别
  17. 所有职位 岗位 大全 看看都有些什么岗位 职位
  18. charles抓包提示unknow
  19. swift之网络请求框架Alamofire
  20. 【转载】儒林外史人物——严贡生和严监生(一)

热门文章

  1. php+一些常用小技巧,PHP 7 中的一些小技巧,你知道的有哪些
  2. emacs 基本配置
  3. 解决低版本ios使用html2canvas截图空白问题
  4. ShardingSphere5.1.0 +JPA的分表配置
  5. 如何使用TF卡和阿里云盘给surface pro扩容
  6. Android 搭建局域网服务器
  7. 京瓷1025打印机打印有底灰简单处理
  8. C++ 之父 Bjarne Stroustrup : 简单的表述方式才是最优的方案
  9. 天梯赛 L2-001 紧急救援 (25 分)
  10. Android 内存泄露分析