Android 平台DES IV 加密解密随笔

好记性不如烂笔头,所以开始写博客了。一方面加深自己的理解,二方面给后面初学者少走弯路,不论难易,有些东西可能理解的不深,欢迎各位高手指导赐教加吐槽!

DES加密接触过好多次了,但总容易忘,和服务器交互时,加出来不一致后面能解密成功但是头部是乱码导致小坑了一会,在此记录下来~

根据百度百科和自己的理解,DES是一个基于56位密钥的对称的加密算法,就是两边的密钥需要一致,在此就不考虑为什么不用安全性更高的AES或者采用非对称加密方法,比如RSA等等;关于密钥空间小,可以使用DES的派生算法3DES来进行加密。DES算法是把64位的明文输入块变成64位的密文输出块,所以这里需要BASE64编解码工具类,加密需要3个参数(Key、Data、Mode)
Mode是加密还是解密,其它就不解释了,注释写的比较清楚。

下面是加密解密方法:

<span style="font-size:18px;">public class EncryptUtils {
<span style="white-space:pre">	</span>public static String encryptDES(String encryptString, String encryptKey)
<span style="white-space:pre">			</span>throws Exception {
<span style="white-space:pre">		</span>//返回实现指定转换的 Cipher 对象<span style="white-space:pre">	</span>“算法/模式/填充”
<span style="white-space:pre">		</span>Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
<span style="white-space:pre">		</span>//创建一个 DESKeySpec 对象,使用 8 个字节的key作为 DES 密钥的密钥内容。
<span style="white-space:pre">		</span>DESKeySpec desKeySpec = new DESKeySpec(encryptKey.getBytes("UTF-8"));
<span style="white-space:pre">		</span>//返回转换指定算法的秘密密钥的 SecretKeyFactory 对象。 
<span style="white-space:pre">		</span>SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
<span style="white-space:pre">		</span>//根据提供的密钥生成 SecretKey 对象。
<span style="white-space:pre">		</span>SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
<span style="white-space:pre">		</span>//使用 iv 中的字节作为 IV 来构造一个 IvParameterSpec 对象。复制该缓冲区的内容来防止后续修改。
<span style="white-space:pre">		</span>IvParameterSpec iv = new IvParameterSpec(encryptKey.getBytes());
<span style="white-space:pre">		</span>//用密钥和一组算法参数初始化此 Cipher;Cipher:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。
<span style="white-space:pre">		</span>cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
<span style="white-space:pre">		</span>//加密同时解码成字符串返回
<span style="white-space:pre">		</span>return new String(BASE64.encode(cipher.doFinal(encryptString
<span style="white-space:pre">				</span>.getBytes("UTF-8"))));
<span style="white-space:pre">	</span>}

<span style="white-space:pre">	</span>public static String decryptDES(String decodeString, String decodeKey) throws Exception {
<span style="white-space:pre">			</span>//使用指定密钥构造IV
<span style="white-space:pre">			</span>IvParameterSpec iv = new IvParameterSpec(decodeKey.getBytes());
<span style="white-space:pre">			</span>//根据给定的字节数组和指定算法构造一个密钥。 
<span style="white-space:pre">			</span>SecretKeySpec skeySpec = new SecretKeySpec(decodeKey.getBytes(), "DES");
<span style="white-space:pre">			</span>//返回实现指定转换的 Cipher 对象
<span style="white-space:pre">			</span>Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
<span style="white-space:pre">			</span>//解密初始化
<span style="white-space:pre">			</span>cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
<span style="white-space:pre">			</span>//解码返回
<span style="white-space:pre">			</span>byte[] byteMi = BASE64.decode(decodeString.toCharArray());
<span style="white-space:pre">			</span>byte decryptedData[] = cipher.doFinal(byteMi);
<span style="white-space:pre">			</span>return new String(decryptedData);
<span style="white-space:pre">	</span>}
}
</span>

几个错误需要解释下:

java.security.InvalidAlgorithmParameterException: IV must be 8 bytes long.

java.security.InvalidKeyException: key too short

这两种错误都是key的长度造成的,但官方说密钥是56位长度,这个有点不太明白,但你只要记住key的长度必须是8位!这个地方还请高手赐教!

IV向量:主要作用就是防止篡改的,这个地方如果不一致会导致数据的头部解出来是乱码,而后面正常。

BASE64 编解码工具类

<span style="font-size:18px;">public class BASE64 {
	static public char[] encode(byte[] data) {
		char[] out = new char[((data.length + 2) / 3) * 4];
		for (int i = 0, index = 0; i < data.length; i += 3, index += 4) {
			boolean quad = false;
			boolean trip = false;
			int val = (0xFF & (int) data[i]);
			val <<= 8;
			if ((i + 1) < data.length) {
				val |= (0xFF & (int) data[i + 1]);
				trip = true;
			}
			val <<= 8;
			if ((i + 2) < data.length) {
				val |= (0xFF & (int) data[i + 2]);
				quad = true;
			}
			out[index + 3] = alphabet[(quad ? (val & 0x3F) : 64)];
			val >>= 6;
			out[index + 2] = alphabet[(trip ? (val & 0x3F) : 64)];
			val >>= 6;
			out[index + 1] = alphabet[val & 0x3F];
			val >>= 6;
			out[index + 0] = alphabet[val & 0x3F];
		}
		return out;
	}

	static public byte[] decode(char[] data) {
		int len = ((data.length + 3) / 4) * 3;
		if (data.length > 0 && data[data.length - 1] == '=')
			--len;
		if (data.length > 1 && data[data.length - 2] == '=')
			--len;
		byte[] out = new byte[len];
		int shift = 0;
		int accum = 0;
		int index = 0;
		for (int ix = 0; ix < data.length; ix++) {
			int value = codes[data[ix] & 0xFF];
			if (value >= 0) {
				accum <<= 6;
				shift += 6;
				accum |= value;
				if (shift >= 8) {
					shift -= 8;
					out[index++] = (byte) ((accum >> shift) & 0xff);
				}
			}
		}
		if (index != out.length)
			throw new Error("miscalculated data length!");
		return out;
	}

	static private char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
			.toCharArray();
	static private byte[] codes = new byte[256];
	static {
		for (int i = 0; i < 256; i++)
			codes[i] = -1;
		for (int i = 'A'; i <= 'Z'; i++)
			codes[i] = (byte) (i - 'A');
		for (int i = 'a'; i <= 'z'; i++)
			codes[i] = (byte) (26 + i - 'a');
		for (int i = '0'; i <= '9'; i++)
			codes[i] = (byte) (52 + i - '0');
		codes['+'] = 62;
		codes['/'] = 63;
	}
}</span>

加密解密使用

时间: 2024-08-26 19:07:04

Android 平台DES IV 加密解密随笔的相关文章

PHP使用DES进行加密解密

DES是一种对称加密算法,也就是通过密文和合法的密钥能够将明文还原出来,在程序开发过程中有些 接口可能需要获取原始数据,而发送的数据又比较敏感(比如用户的密码等信息),这时可以选择DES加密算法,DES的安全性还算可靠,只要加密密钥不泄 露,目前破解的方法只有穷举法进行破解. 再说一下应用时需要注意的地方, 1.DES加密时需要的key(密钥)长度不能超过8位,一般我们设置8位就可以了. 2.DES加密后的数据是二进制数据,如果使用GET方式传输应该将其处理一下才可以(比如可以转换成16进制.b

Java android DES+Base64加密解密

服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Base64加密解密不一致,只好不使用java或android的Base64重新在网上找了一个,感谢以下两位提供的代码,两段分别转载自以下博客. https://www.cnblogs.com/xuhaiqing/archive/2013/03/12/2955837.html https://www.c

DES非对称加密解密跨平台(C#,安卓,ios)

#region 跨平台加解密(c# 安卓 IOS) public static string sKey = "123456"; /// <summary> /// 解密 /// </summary> /// <param name="pToDecrypt">要解密的以Base64</param> /// <param name="sKey">密钥,且必须为8位</param>

JAVA使用DES加密算法加密解密

程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数 一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码 properties文件全是unicode编码明文存储,程序打包交付后,其他人能够很容易使用解压软件打开jar查看你的.properties文件 所以一些敏感变量需要加密处理 首先需要了解一些基本的加密算法,比如MD5,比如DES和RSA MD5是一种不可逆的加密算法,使用散列后特征码的方式表现需要加密的字符或者文件,常用在系统登陆的密码比对

android base64 和 aes 加密 解密

package pioneerbarcode.ccw.com.encryptanddecode; import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.text.TextUtils;import android.util.Base64;import android.view.View;import android.widget.Button;import android.wi

iOS,Android,Jave后台AES加密解密

AES256 在iOS和Android上的相关代码: http://www.tuicool.com/articles/RVFbmmU 里面可以下载相关的代码. 我们遇到的问题是: 把Android的代码移动到Java 后台出现无法加密. 遇到如下的2个问题 1. no cipher getinstance support for AES/CBC/PKCS7Padding 解决方案: http://www.codeweblog.com/java-%E4%BD%BF%E7%94%A8aes-cbc-

C#/IOS/Android通用加密解密方法

原文:C#/IOS/Android通用加密解密方法 公司在做移动端ios/android,服务器提供接口使用的.net,用到加密解密这一块,也在网上找了一些方法,有些是.net加密了android解密不了,或者反之.下面的是三个平台都可以加密解密的方法.加密解密中用到的key="1234578";在调取方法时传值即可. C#代码 #region 跨平台加解密(c#) /// <summary> /// 对字符串进行DES加密 /// </summary> ///

C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)

一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应位其中一个为1另一个为0,则返回1. //对数字加密 int P_int_Num, P_int_Key;//定义两个值类型变量 string Encryptstr = (P_int_Num ^ P_int_Key).ToString();//加密数值 //对数字解密 int P_int_Key, P_int_

des加密解密——java加密,php解密

最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混杂,好不容易测试在php这边测试加密和解密成功了.为确保安卓app端提交过来的加密参数能够解密出来,给定安卓人员一个字符串,让他们把des加密后的字符串给我,在php这边解密.结果一看,加密出来的字符串跟我这边加密出来的结果不一致,自然是解密不出来. 要来java的des算法代码,研究加密的过程,其