如何保证Android与服务器的DES加密保持一致

简介:

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

    在我们的应用程序涉及到比较敏感的数据的时候,我们通常会对数据进行简单的加密。在与服务器之间的数据交互中,除了可以使用post请求来增强数据的安全性之外,我们可以使用常见的加密算法,对数据进行加密。今天主要介绍的是DES加密算法。

    首先,DES属于一种对称的加密算法,所谓对称,就是说加密和解密使用的都是同一个密钥,那么在我们实际应用的时候,就是指服务器和客户端进行加密解密的时候,使用的是一个相同的密钥。除此之外,还有非对称加密算法,就是公钥私钥机制,这种方式可以被用来进行身份验证,这个以后再细说。    

    DES全称为Data EncryptionStandard,即数据加密标准,是一种使用密钥加密的块算法,DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

    下面是在Java或者是Android里面,进行DES加密的代码实现

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.qust.rollcallstudent.utils;  
  2.   
  3. import java.security.InvalidAlgorithmParameterException;  
  4. import java.security.Key;  
  5. import java.security.spec.AlgorithmParameterSpec;  
  6. import java.util.Locale;  
  7.   
  8. import javax.crypto.Cipher;  
  9. import javax.crypto.SecretKeyFactory;  
  10. import javax.crypto.spec.DESKeySpec;  
  11. import javax.crypto.spec.IvParameterSpec;  
  12.   
  13. /** 
  14.  *  
  15.  * @ClassName: com.qust.rollcallstudent.utils.DESUtil 
  16.  * @Description: DES加密解密工具包 
  17.  * @author zhaokaiqiang 
  18.  * @date 2014-11-13 下午8:40:56 
  19.  *  
  20.  */  
  21. public class DESUtil {  
  22.   
  23.     public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";  
  24.   
  25.     /** 
  26.      * DES算法,加密 
  27.      *  
  28.      * @param data 
  29.      *            待加密字符串 
  30.      * @param key 
  31.      *            加密私钥,长度不能够小于8位 
  32.      * @return 加密后的字节数组,一般结合Base64编码使用 
  33.      * @throws InvalidAlgorithmParameterException 
  34.      * @throws Exception 
  35.      */  
  36.     public static String encode(String key, String data) {  
  37.         if (data == null)  
  38.             return null;  
  39.         try {  
  40.             DESKeySpec dks = new DESKeySpec(key.getBytes());  
  41.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  42.             // key的长度不能够小于8位字节  
  43.             Key secretKey = keyFactory.generateSecret(dks);  
  44.             Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
  45.             IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());  
  46.             AlgorithmParameterSpec paramSpec = iv;  
  47.             cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);  
  48.             byte[] bytes = cipher.doFinal(data.getBytes());  
  49.             return byte2String(bytes);  
  50.         } catch (Exception e) {  
  51.             e.printStackTrace();  
  52.             return data;  
  53.         }  
  54.     }  
  55.   
  56.     /** 
  57.      * DES算法,解密 
  58.      *  
  59.      * @param data 
  60.      *            待解密字符串 
  61.      * @param key 
  62.      *            解密私钥,长度不能够小于8位 
  63.      * @return 解密后的字节数组 
  64.      * @throws Exception 
  65.      *             异常 
  66.      */  
  67.     public static String decode(String key, String data) {  
  68.         if (data == null)  
  69.             return null;  
  70.         try {  
  71.             DESKeySpec dks = new DESKeySpec(key.getBytes());  
  72.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
  73.             // key的长度不能够小于8位字节  
  74.             Key secretKey = keyFactory.generateSecret(dks);  
  75.             Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
  76.             IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());  
  77.             AlgorithmParameterSpec paramSpec = iv;  
  78.             cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec);  
  79.             return new String(cipher.doFinal(byte2hex(data.getBytes())));  
  80.         } catch (Exception e) {  
  81.             e.printStackTrace();  
  82.             return data;  
  83.         }  
  84.     }  
  85.   
  86.     /** 
  87.      * 二行制转字符串 
  88.      *  
  89.      * @param b 
  90.      * @return 
  91.      */  
  92.     private static String byte2String(byte[] b) {  
  93.         StringBuilder hs = new StringBuilder();  
  94.         String stmp;  
  95.         for (int n = 0; b != null && n < b.length; n++) {  
  96.             stmp = Integer.toHexString(b[n] & 0XFF);  
  97.             if (stmp.length() == 1)  
  98.                 hs.append('0');  
  99.             hs.append(stmp);  
  100.         }  
  101.         return hs.toString().toUpperCase(Locale.CHINA);  
  102.     }  
  103.   
  104.     /** 
  105.      * 二进制转化成16进制 
  106.      *  
  107.      * @param b 
  108.      * @return 
  109.      */  
  110.     private static byte[] byte2hex(byte[] b) {  
  111.         if ((b.length % 2) != 0)  
  112.             throw new IllegalArgumentException();  
  113.         byte[] b2 = new byte[b.length / 2];  
  114.         for (int n = 0; n < b.length; n += 2) {  
  115.             String item = new String(b, n, 2);  
  116.             b2[n / 2] = (byte) Integer.parseInt(item, 16);  
  117.         }  
  118.         return b2;  
  119.     }  
  120.   
  121. }  

     如果大家只是想用,就可以不用往下看了,下面开始说一些关于DES算法的细节。

    在上面的加密和解密的方法里面,我们在获取Cipher实例的时候,传入了一个字符串"DES/CBC/PKCS5Padding",这三个参数是什么意思呢?

    实际上,这三个参数分别对应的是“算法/模式/填充”,也就是说我们要用DES算法进行加密,采用的是CBC模式,填充方式采用PKCS5Padding。

    除了CBC模式,还有ECB模式等,指的是不同的加密方式。

    那么CBC模式和ECB模式又有什么区别呢?


    ECB模式指的是电子密码本模式,是一种最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;然后每组都用相同的密钥加密, 比如DES算法, 如果最后一个分组长度不够64位,要补齐64位。这种模式的特点是:

    1.每次Key、明文、密文的长度都必须是64位;

    2.数据块重复排序不需要检测;

    3.相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;

    4.一个错误仅仅会对一个密文块产生影响;

    

CBC模式指的是加密块链模式,与ECB模式最大的不同是加入了初始向量。下面的代码就是获取一个初始向量,

    IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());

    这种模式的特点是:

    1.每次加密的密文长度为64位(8个字节);

    2.当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;

    3.密文块要依赖以前的操作结果,所以密文块不能进行重新排列;

    4.可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;

    5.一个错误发生以后,当前和以后的密文都会被影响;

    

    PKCS5Padding参数则是在说明当数据位数不足的时候要采用的数据补齐方式,也可以叫做数据填充方式。

    PKCS5Padding这种填充方式,具体来说就是“填充的数字代表所填字节的总数”

    比如说,差两个字节,就是######22,差5个字节就是###55555,这样根据最后一个自己就可以知道填充的数字和数量。

   

    介绍完DES的这些细节之后,我们就可以知道,在不同的平台上,只要能保证这几个参数的一致,就可以实现加密和解密的一致性。

    1.加密和解密的密钥一致

    2.采用CBC模式的时候,要保证初始向量一致

    3.采用相同的填充模式

相关文章
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
315 1
|
10月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
195 4
2023/11/10学习记录-C/C++对称分组加密DES
|
10月前
|
算法 数据安全/隐私保护 Python
DES加密初探
本文介绍了Python中常用的DES和3DES加解密方法,包括ECB和CBC模式。通过示例代码展示了如何使用`Crypto`和`pyDes`库实现加解密,并讨论了不同的填充方式。最后,通过一道CTF例题,详细解析了从图像中提取密文、进行ASCII转换、Base64解码、凯撒解码和最终的DES解密过程。
354 4
DES加密初探
|
8月前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
207 0
|
11月前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
2063 5
|
12月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
2000 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
616 1
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
477 1
|
C# 数据安全/隐私保护
Des加密和解密
Des加密和解密
146 0
|
7天前
|
弹性计算 运维 安全
阿里云轻量应用服务器详解——2025升级到200M峰值带宽
阿里云轻量应用服务器(Simple Application Server)是面向个人开发者及中小企业的轻量级云服务,适用于网站搭建、开发测试、小程序后端等场景。2025年升级至200M峰值带宽,支持WordPress、宝塔面板、Docker等应用镜像一键部署,操作简单,运维便捷。按套餐售卖,不支持自定义CPU内存配置,价格低至38元/年起,是快速上云的高性价比选择。

热门文章

最新文章