浅谈DES加密算法

一、DES加密算法介绍

1、要求密钥必须是8个字节,即64bit长度

2、因为密钥是byte[8] , 代表字符串也可以是非可见的字节,可以与Base64编码算法一起使用

3、加密、解密都需要通过字节数组作为数据和密钥进行处理

二、对称加密

DES加密算法属于对称加密。

即利用指定的密钥,按照密码的长度截取数据,分成数据块,和密钥进行复杂的移位、算数运算或者数据处理等操作,形成只有特定的密码才能够解开的数据。 加密与解密用的是同一个密钥

三、相关类

1、Cipher:

Java/Android要使用任何加密,都需要使用Cipher这个类

使用Cipher进行加密,解密处理,需要创建实例对象并初始化。采用工厂模式创建对象

Cipher cipher = Cipher.getInstance("算法名称");

cipher.init(加密/解密模式,Key秒);

2、Key:

Key类是Java加密系统所有密码的父类

3、SecretKeyFactory:

对于DES加密解密,使用SecretKeyFactory生成,生成时需指定DESKeySpec

四、加密代码步骤

1. 获取Cipher对象,设置加密算法

Cipher cipher = Cipher.getInstance("DES");

2、准备Key对象

  2.1 DES加密算法使用DESKeySpec类,构造方法参数需要为8个字节的密码

  创建DESKeySpec类对象

  参数为密钥,8个字节

DESKeySpec keySpec = new DESKeySpec(new byte[1,2,3,4,5,6,7,8]);

  2.2 转换成Key对象

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("EDS");

SecretKey key = keyFactory.generateSecret(keySpec);

 3.设置Cipher模式,加密/解密 ,参数一 :模式 ,参数二:Key对象,返回字节数组

Cipher.DECRYPT_MODE 解密
Cipher.ENCRYPT_MODE 加密

cipher.init(Cipher.ENCRYPT_MODE,key);

4.返回加密结果,参数为加密内容

bytep[] ret = cipher.doFinal(data);

因为对称加密加密与解密是相逆的。所以解密步骤和加密步骤一样,只是cipher.init()的模式不同,所以我们可以写一个工具类来进行DES加密算法的加密解密

 1 /**
 2      * DES加密算法
 3      * @param mode     模式: 加密,解密
 4      * @param data     需要加密的内容
 5      * @param keyData  密钥 8个字节数组
 6      * @return         将内容加密后的结果也是byte[]格式的
 7      */
 8     public static byte[] des(int mode,byte[] data,byte[] keyData)
 9     {
10         byte[] ret = null;
11         //加密的内容存在并且密钥存在且长度为8个字节
12         if (data != null
13                 && data.length>0
14                 &&keyData!=null
15                 && keyData.length==8) {
16 
17             try {
18                 Cipher cipher = Cipher.getInstance("DES");
19 
20                 DESKeySpec keySpec = new DESKeySpec(keyData);
21 
22                 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
23 
24                 SecretKey key = keyFactory.generateSecret(keySpec);
25 
26                 cipher.init(mode, key);
27 
28                 ret = cipher.doFinal(data);
29 
30             } catch (NoSuchAlgorithmException e) {
31                 e.printStackTrace();
32             } catch (NoSuchPaddingException e) {
33                 e.printStackTrace();
34             } catch (IllegalBlockSizeException e) {
35                 e.printStackTrace();
36             } catch (BadPaddingException e) {
37                 e.printStackTrace();
38             } catch (InvalidKeySpecException e) {
39                 e.printStackTrace();
40             } catch (InvalidKeyException e) {
41                 e.printStackTrace();
42             }
43         }
44 
45         return ret;
46     }
47 
48     //DES 加密
49     public static byte[] desEncrypt(byte[] data,byte[] keyData){
50         return des(Cipher.ENCRYPT_MODE,data,keyData);
51     }
52     //DES 解密
53     public static byte[] desDecrypt(byte[] data,byte[] keyData){
54         return des(Cipher.DECRYPT_MODE,data,keyData);
55     }

五、示例

 1 package com.xqx.encrypsthow;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Base64;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.widget.EditText;
 9 import android.widget.Toast;
10 import utils.EncryptUtil;
11 
12 import javax.crypto.*;
13 import javax.crypto.spec.DESKeySpec;
14 import java.security.InvalidKeyException;
15 import java.security.NoSuchAlgorithmException;
16 import java.security.spec.InvalidKeySpecException;
17 import java.util.Arrays;
18 
19 /**
20  * Created by Administrator on 2015/10/16.
21  */
22 
23 /**
24  * 对称加密
25  */
26 public class SythEncryptActivity extends Activity {
27 
28     private EditText txtContent;
29     private EditText txtPassword;
30     private EditText txtResult;
31 
32 
33     @Override
34     public void onCreate(Bundle savedInstanceState) {
35         super.onCreate(savedInstanceState);
36         setContentView(R.layout.sythencrypylayout);
37 
38         txtContent = (EditText) findViewById(R.id.txt_content);
39         txtPassword = (EditText) findViewById(R.id.txt_password);
40         txtResult = (EditText) findViewById(R.id.txt_result);
41 
42 
43     }
44 
45     /**
46      * DES加密,要求密码必须8个字节,64bit长度 byte[8]
47      * @param view
48      */
49     public void btnDESEncrypt(View view) {
50 
51         //获取需要加密的内容
52         String content = txtContent.getText().toString();
53         //获取密钥
54         String password = txtPassword.getText().toString();
55         //注意,加密,解密,秘钥都需要是字节数组
56         byte[] keyData = password.getBytes();
57         //需要加密的内容
58         byte[] contentData = content.getBytes();
59         if(keyData.length == 8) {
60             byte[] encryptedData = EncryptUtil.des(Cipher.ENCRYPT_MODE, contentData, keyData);
61             //获取加密后的数据(记住是byte[]类型的),用Base64编码 成可见的字符串形式
62             String s = Base64.encodeToString(encryptedData, Base64.NO_WRAP);
63             //显示加密后的内容
64             txtResult.setText(s);
65         }
66 
67     }
68 
69     /**
70      * DES的解密
71      * @param view
72      */
73     public void btnDESDecrypt(View view) {
74         String encryptedStr = txtResult.getText().toString();
75         if(encryptedStr.length()>0){
76             String password = txtPassword.getText().toString();
77             //因为在加密方法中,使用Base64对加密的内容进行编码,要解密的时候需要Base64的解码
78             byte[] encryptedData = Base64.decode(encryptedStr, Base64.NO_WRAP);
79             byte[] keyData = password.getBytes();
80             //DES 要求 8个字节
81             if(keyData.length == 8){
82                 //形成原始数据
83                 byte[] decryptedData = EncryptUtil.des(Cipher.DECRYPT_MODE, encryptedData, keyData);
84                 txtResult.setText(new String(decryptedData));
85             }
86 
87         }
88     }
89 }
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3               android:orientation="vertical"
 4               android:layout_width="match_parent"
 5               android:layout_height="match_parent">
 6     <EditText
 7             android:id="@+id/txt_content"
 8             android:layout_width="match_parent"
 9             android:layout_height="wrap_content"
10             android:hint="请输入内容"
11             />
12 
13     <EditText
14             android:id="@+id/txt_password"
15             android:layout_width="match_parent"
16             android:layout_height="wrap_content"
17             android:hint="DES密钥"
18             android:text="12345678"
19             android:inputType="textVisiblePassword"
20             />
21     <EditText
22             android:id="@+id/txt_result"
23             android:layout_width="match_parent"
24             android:layout_height="wrap_content"
25             />
26 
27     <Button
28             android:layout_width="wrap_content"
29             android:layout_height="wrap_content"
30             android:text="DES加密"
31             android:onClick="btnDESEncrypt"
32             />
33 
34     <Button
35             android:layout_width="wrap_content"
36             android:layout_height="wrap_content"
37             android:text="DES解密"
38             android:onClick="btnDESDecrypt"
39             />
40 
41 </LinearLayout>

工具类参考 四:加密代码步骤

效果图:

相关知识:

浅谈RSA加密算法

浅谈Base64编码算法

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

仿12306查询火车票功能

首先感谢http://www.zuidaima.com/share/1861712958622720.html对我的帮助,我在此基础上修改了页面的显示, 先上效...

2328
来自专栏小灰灰

java与openssl的rsa算法互

说明    1.java生成的公私钥格式为 pkcs8, 而openssl默认生成的公私钥格式为 pkcs1,两者的密钥实际上是不能直接互用的     2.j...

4708
来自专栏数据结构与算法

08:Vigenère密码

08:Vigenère密码 总时间限制: 1000ms 内存限制: 65536kB描述 16世纪法国外交家Blaise de Vigenère设计了一种多表...

4639
来自专栏码农二狗

php实现rsa签名和验签

9584
来自专栏三流程序员的挣扎

RxJava 辅助操作符

上例中,Observer 在收到 5 这个整数时,就 dispose(),最后进了 using 第三个参数设置的 disposer 释放资源。

3352
来自专栏小工匠技术圈

【小工匠聊密码学】--消息摘要--SHA算法

2015
来自专栏web开发

JavaScript前端和Java后端的AES加密和解密

在实际开发项目中,有些数据在前后端的传输过程中需要进行加密,那就需要保证前端和后端的加解密需要统一。这里给大家简单演示AES在JavaScript前端和Java...

7496
来自专栏Danny的专栏

RSA公钥加密私钥解密实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1.3K2
来自专栏技术博文

php des 加密解密实例

des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展...

50910
来自专栏WindCoder

进击微信小程序-Java版AES/CBC/PKCS7Padding加解密字符串

进击微信小程序,最初找到腾讯云给的解决方案,无奈后端是node.js,而且才一开始配上去还不能用,之后仔细看readme,摸到它开源的Wafer,本来以为找到终...

4392

扫码关注云+社区

领取腾讯云代金券