引言
如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android、ios、java平台的使用方法;
DES加密是目前最常用的对称加密方式,性能优于非对称加密(RSA),是手机app请求数据加密的优先选择。
DES简介:
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法, 算法的入口参数有三个:Key、Data、Mode。
Key:为7个字节共56位,是DES算法的工作密钥;
Data:为8个字节64位,是要被加密或被解密的数据;
Mode:为DES的工作方式,有两种:加密或解密。
3DES简介:
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。因此比起最初的DES,3DES更为安全。
加密实例:
java版
package com.v1.linxun.portal.utils; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; /** * 3DES加密工具类 */ public class Des3Util { // 密钥 长度不得小于24 private final static String secretKey = "123456789012345678901234" ; // 向量 可有可无 终端后台也要约定 private final static String iv = "01234567"; // 加解密统一使用的编码方式 private final static String encoding = "utf-8"; /** * 3DES加密 * * @param plainText * 普通文本 * @return * @throws Exception */ public static String encode(String plainText) throws Exception { Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec(secretKey .getBytes()); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede"); deskey = keyfactory.generateSecret( spec); Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec( iv.getBytes()); cipher.init(Cipher. ENCRYPT_MODE, deskey, ips); byte[] encryptData = cipher.doFinal( plainText.getBytes( encoding)); return Base64. encode( encryptData); } /** * 3DES解密 * * @param encryptText * 加密文本 * @return * @throws Exception */ public static String decode(String encryptText) throws Exception { Key deskey = null; DESedeKeySpec spec = new DESedeKeySpec( secretKey.getBytes()); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede"); deskey = keyfactory. generateSecret( spec); Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" ); IvParameterSpec ips = new IvParameterSpec( iv.getBytes()); cipher. init(Cipher. DECRYPT_MODE, deskey, ips); byte[] decryptData = cipher. doFinal(Base64. decode(encryptText )); return new String( decryptData, encoding); } public static void main(String args[]) throws Exception{ String str = "你好" ; System. out.println( "----加密前-----:" + str ); String encodeStr = Des3Util. encode( str); System. out.println( "----加密后-----:" + encodeStr ); System. out.println( "----解密后-----:" + Des3Util.decode( encodeStr)); } } |
Android版:
package com.inn.test; import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import javax.crypto.spec.IvParameterSpec; import android.util.Base64; /** * Android 3DES加密工具类 */ public class AndroidDes3Util { // 密钥 长度不得小于24 private final static String secretKey = "123456789012345678901234" ; // 向量 可有可无 终端后台也要约定 private final static String iv = "01234567" ; // 加解密统一使用的编码方式 private final static String encoding = "utf-8" ; /** * 3DES加密 * * @param plainText * 普通文本 * @return * @throws Exception */ public static String encode(String plainText) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec(secretKey .getBytes()); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede"); deskey = keyfactory.generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding"); IvParameterSpec ips = new IvParameterSpec( iv.getBytes()); cipher.init(Cipher. ENCRYPT_MODE , deskey, ips); byte [] encryptData = cipher.doFinal(plainText.getBytes(encoding )); return Base64.encodeToString(encryptData,Base64. DEFAULT ); } /** * 3DES解密 * * @param encryptText * 加密文本 * @return * @throws Exception */ public static String decode(String encryptText) throws Exception { Key deskey = null ; DESedeKeySpec spec = new DESedeKeySpec( secretKey.getBytes()); SecretKeyFactory keyfactory = SecretKeyFactory.getInstance( "desede" ); deskey = keyfactory. generateSecret(spec); Cipher cipher = Cipher.getInstance( "desede/CBC/PKCS5Padding" ); IvParameterSpec ips = new IvParameterSpec( iv.getBytes()); cipher. init(Cipher. DECRYPT_MODE, deskey, ips); byte [] decryptData = cipher.doFinal(Base64. decode(encryptText, Base64. DEFAULT)); return new String (decryptData, encoding); } } |
IOS版:
// // DES3EncryptUtil.h // DES3加解密工具 // // Created by xc on 15/12/18. // Copyright © 2015年 xc. All rights reserved. // #import <Foundation/Foundation.h> @interface DES3EncryptUtil : NSObject // 加密方法 // 解密方法 @end |
// // DES3EncryptUtil.m // DES3加解密工具 // Created by xc on 15/12/18. // Copyright © 2015年 xc. All rights reserved. #import <Foundation/Foundation.h> //秘钥 @implementation DES3EncryptUtil : NSObject // 加密方法 // 解密方法 @end |
IOS加密工具中会将加密后的密文 转化程Base64的字符串,用到了Base64编码工具,如下
// // CommonFunc.h // PRJ_base64 // // Created by wangzhipeng on 12-11-29. // Copyright (c) 2012年 com.comsoft. All rights reserved. // #import <Foundation/Foundation.h> #define __BASE64( text ) [CommonFunc base64StringFromText:text] @interface MyBase64 : NSObject /****************************************************************************** /****************************************************************************** /****************************************************************************** /****************************************************************************** @end |
// #import "MyBase64.h" //引入IOS自带密码库 //空字符串 static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; @implementation MyBase64 : NSObject + (NSString *)base64StringFromText:(NSString *)text + (NSString *)textFromBase64String:(NSString *)base64 /****************************************************************************** /****************************************************************************** /****************************************************************************** /****************************************************************************** @end |
到此为止,三平台的加密已经全部结束,代码可以直接使用。