Android加密和解密(DES,AES,MD5)
加密是通过加密算法和加密密钥将明文转变为密文的过程,解密是其逆过程。加密算法有很多种,一般可以分为对称加密(如DES、AES等)、非对称加密(如RSA等)和单向加密(如MD5等)3类算法。
1)在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道加密密钥。这类加密算法技术较为成熟,加密效率高。
2)在非对称加密算法中,收发双方使用不同的密钥,发方使用公开密钥对消息进行加密,收发使用私有密钥机型解密,保密性更高,但效率更低。
3)单向加密算法在加密过程中不需要使用密钥,输入明文后由算法直接加密成密文,密文无法解密,只有重新输入密文,并经过同样的加密算法处理,得到形同的密文并被系统重新识别后,才能真正的解密,这种算法非常复杂,通常只在数据量有限的情形下使用,如广泛应用在计算机系统中的口令加密等。
下面给大家介绍DES、AES、MD5三种算法。三种算法具体的加解密过程设计的内容较多,这里只做一个简要的介绍。
1)DES是数据加密标准(Data Encryption Standard)的简称,他是第一代公开的、完全说明细节的商用密码算法。它在保护金融数据的安全,如自动取款机中,使用较多。DES算法经过16论迭代,使用56比特长度密钥加密64比特长度(分组长度)的明文获得64比特的密文。
2)AES是高级加密标准(Advanced Encryption Standard)的简称,用于替代原先的DES,保护敏感信息。AES算法的分组长度为128比特,其密钥长度分别为128比特,192比特,256比特。
3)MD5全称是Message-digest Algorithm5(信息摘要算法),用于确保信息传输完整的一致。MD5用的是散列函数(Hash函数),其典型应用是对一段信息产生信息摘要,从而事先数字签名,登录口令的认证,为文档生成“数字指纹”等。MD5算法的基本思想是以512位分组来处理输入的信息,且每一分组又被划分位16个32分组,经过一系列的处理后算法输出由4个32位分组组成,将这4个32位分组级联后将生产一个128位的散列值。
一、DES加密和解密
Android中实现DES加密和解密的核心代码如下:
import android.util.Base64; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * Created by 宫智耀 on 2016/10/13. */ public class DES {//初始化向量,随意填写 private static byte[]iv={1,2,3,4,5,6,7,8}; /** * * @param encryptString 明文 * @param encryptKey 密钥 * @return 加密后的密文 */ public static String encryptDES(String encryptString,String encryptKey){try {//实例化IvParameterSpec对象,使用指定的初始化向量 IvParameterSpec zeroIv=new IvParameterSpec(iv); //实例化SecretKeySpec,根据传入的密钥获得字节数组来构造SecretKeySpec SecretKeySpec key =new SecretKeySpec(encryptKey.getBytes(),"DES"); //创建密码器 Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); //用密钥初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE,key,zeroIv); //执行加密操作 byte[]encryptedData=cipher.doFinal(encryptString.getBytes()); return Base64.encodeToString(encryptedData,0); } catch (NoSuchAlgorithmException e) {e.printStackTrace(); } catch (NoSuchPaddingException e) {e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) {e.printStackTrace(); } catch (InvalidKeyException e) {e.printStackTrace(); } catch (BadPaddingException e) {e.printStackTrace(); } catch (IllegalBlockSizeException e) {e.printStackTrace(); }return null; }/** * 解密的过程与加密的过程大致相同 * @param decryptString 密文 * @param decryptKey 密钥 * @return 返回明文 */ public static String decryptDES(String decryptString,String decryptKey){try {//先使用Base64解密 byte[]byteMi=Base64.decode(decryptString,0); //实例化IvParameterSpec对象使用指定的初始化向量 IvParameterSpec zeroIv=new IvParameterSpec(iv); //实例化SecretKeySpec,根据传入的密钥获得字节数组来构造SecretKeySpec, SecretKeySpec key=new SecretKeySpec(decryptKey.getBytes(),"DES"); //创建密码器 Cipher cipher=Cipher.getInstance("DES/CBC/PKCS5Padding"); //用密钥初始化Cipher对象,上面是加密,这是解密模式 cipher.init(Cipher.DECRYPT_MODE,key,zeroIv); //获取解密后的数据 byte [] decryptedData=cipher.doFinal(byteMi); return new String(decryptedData); } catch (NoSuchAlgorithmException e) {e.printStackTrace(); } catch (NoSuchPaddingException e) {e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) {e.printStackTrace(); } catch (InvalidKeyException e) {e.printStackTrace(); } catch (BadPaddingException e) {e.printStackTrace(); } catch (IllegalBlockSizeException e) {e.printStackTrace(); }return null; } }
如何调用DES加密和解密的方法在这里就不在赘述了。
二、AES解密和解密
Android中AES加密和解密的核心代码如下:
import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * Created by 宫智耀 on 2016/10/13. */ public class AES {/** * AES 加密 * * @param seed 密钥 * @param cleartext 明文 * @return 密文 */ public static String encrypt(String seed, String cleartext) {//对密钥进行加密 byte[] rawkey = getRawKey(seed.getBytes()); //加密数据 byte[] result = encrypt(rawkey, cleartext.getBytes()); //将十进制数转换为十六进制数 return toHex(result); }/** * AES 解密 * * @param seed 密钥 * @param encrypted 密文 * @return 明文 */ public static String decrypt(String seed, String encrypted) {byte[] rawKey = getRawKey(seed.getBytes()); byte[] enc = toByte(encrypted); byte[] result = decrypt(rawKey, enc); return new String(result); }private static byte[] getRawKey(byte[] seed) {try {//获取密钥生成器 KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(seed); //生成位的AES密码生成器 kgen.init(128, sr); //生成密钥 SecretKey skey = kgen.generateKey(); //编码格式 byte[] raw = skey.getEncoded(); return raw; } catch (NoSuchAlgorithmException e) {e.printStackTrace(); }return null; }private static byte[] encrypt(byte[] raw, byte[] clear) {try {//生成一系列扩展密钥,并放入一个数组中 SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); //使用ENCRYPT_MODE模式,用skeySpec密码组,生成AES加密方法 cipher.init(Cipher.ENCRYPT_MODE, skeySpec); //得到加密数据 byte[] encrypted = cipher.doFinal(clear); return encrypted; } catch (NoSuchAlgorithmException e) {e.printStackTrace(); } catch (NoSuchPaddingException e) {e.printStackTrace(); } catch (InvalidKeyException e) {e.printStackTrace(); } catch (BadPaddingException e) {e.printStackTrace(); } catch (IllegalBlockSizeException e) {e.printStackTrace(); }return null; }private static byte[] decrypt(byte[] raw, byte[] encrypted) {try {//生成一系列扩展密钥,并放入一个数组中 SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = null; cipher = Cipher.getInstance("AES"); //使用DECRYPT_MODE模式,用skeySpec密码组,生成AES解密方法 cipher.init(Cipher.DECRYPT_MODE, skeySpec); //得到加密数据 byte[] decrypted = cipher.doFinal(encrypted); return decrypted; } catch (NoSuchAlgorithmException e) {e.printStackTrace(); } catch (NoSuchPaddingException e) {e.printStackTrace(); } catch (BadPaddingException e) {e.printStackTrace(); } catch (IllegalBlockSizeException e) {e.printStackTrace(); } catch (InvalidKeyException e) {e.printStackTrace(); }return null; }//将十进制数转为十六进制 public static String toHex(String txt) {return toHex(txt.getBytes()); }//将十六进制字符串转换位十进制字符串 public static String fromHex(String hex) {return new String(toByte(hex)); }//将十六进制字符串转为十进制字节数组 public static byte[] toByte(String hexString) {int len = hexString.length() / 2; byte[] result = new byte[len]; for (int i = 0; i < len; i++) {result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue(); }return result; }//将十进制字节数组转换为十六进制 public static String toHex(byte[]buf){if(buf==null){return ""; }StringBuffer result=new StringBuffer(2*buf.length); for(int i=0;i<buf.length;i++){appendHex(result,buf[i]); }return result.toString(); }private final static String HEX="0123456789ABCDEF"; private static void appendHex(StringBuffer sb,byte b){sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f)); }}
三、MD5加密
关于MD5的加密算法,在前面我已经给大家介绍过,地址是http://blog.csdn.net/gongzhiyao3739124/article/details/51729085
,这里就不在重述。
好了,这就是DES,AES,和MD5三种加密算法的简单介绍和使用。
Android加密和解密(DES,AES,MD5)相关推荐
- C#加密解密(DES,AES,Base64,md5,SHA256,RSA,RC4)
一:异或^简单加解密(数字类型) 1:原理: 异或用于比较两个二进制数的相应位,在执行按位"异或"运算时,如果两个二进制数的相应位都为1或者都为0,则返回0;如果两个二进制数的相应 ...
- 【Android】Android加密和解密方式
一.不可逆加密 不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相 ...
- android 十六进制加密,使用十六进制十进制值的Android加密和解密?
本问题已经有最佳答案,请猛点这里访问. 我需要在Android中进行加密和解密, 现在我使用"aes"算法加密,我得到了一些加密值,比如"?*?1FO??'但我需要这样的 ...
- Android加密 看雪,Android加密与解密入门两题
写在最前面 本次题目来自看雪2w班9月题.密码学一直是安全的基础,Android安全也不例外,这次9月份的题分别从java层和C层考察了密码学中常用的对称加密.hash函数以及一些基础的编码,但是不是 ...
- Asp.Net C# - AES加密、解密
Asp.Net C#续上次的DES加密.解密之后,再发一个AES的加密.解密.AES要注意的是32位密匙. private static readonly String strAesKey = &qu ...
- ESP32学习笔记(47)——加密算法AES/MD5/SHA
一.简介 1.1 SSL SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层.SSL通过互相认证.使用数字签名确保完整性.使用 ...
- 《图解密码技术》笔记3:对称密码(共享密钥密码)-用相同的密钥进行加密和解密
目录 3.1 炒鸡蛋与对称密码 3.2 本章学习主要内容 3.3 从文字密码到比特序列密码 3.3.1 编码 3.3.2 XOR(异或) 3.4 一次性密码本–绝对不会被破译的密码 3.4.4 一次性 ...
- 返回结果乱码_Spring请求参数和响应结果全局加密和解密(1)
阅读文本大概需要25分钟. 前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数 ...
- springmvc 全局编码_SpringMVC请求参数和响应结果全局加密和解密
前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...
最新文章
- python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...
- 关于Adapter对数据库的查询、删除操作
- Android SDCard Mount 流程分析(一)
- idea debug调试_大牛都会用的 IDEA 调试技巧!!!
- Android多线程分析之三:Handler,Looper的实现
- 穿透还原12.1新变种病毒样本
- 使用阿里云容器监控服务与第三方监控框架集成搭建自己的容器看板
- Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4
- 灌浆料的弹性模量计算_cgm-c80风电基础用灌浆料
- Python入门经典(2K超清)
- linux下封装命令,linux系统怎么封装
- 工业视觉检测厂家十大排名
- ECShop 二次开发常用网站
- 【有限位移旋量理论】罗德里格旋转公式(Rodrigues Rotation Formula)
- 基于PHP和MySql的学生成绩管理系统(附完整版代码)
- linux audacity,linux下编译安装音频处理audacity-2.0.3教程
- 年薪20万、50万、100万的算法工程师,到底有什么区别?
- int与Integer、new Integer()
- 小鸟飞行c语言报告,C/C++编程笔记:飞翔的小鸟(Flappy Bird)——C语言版本
- 云笔记有哪些好用的功能,这4款云笔记一定要试试
热门文章
- matlab中好看的色调,选色,套色,调出一个好看的色调就是这么简单!
- 【Python】Conda 安装 | GYM-Box2D CarRacing 环境准备
- 浏览器如何查看已保存密码
- DHT11传感器简介
- docker python tool_Docker实现Python3.5、Python2.7 在线测试执行代码工具-toolfk.com
- 大数据 | 如何为企业构建用户画像体系
- video 视屏播放器详细控制
- python核心编程第三版(一)学习笔记:正则表达式
- linux如何查看丢弃数据包,导致Linux服务器丢弃数据包?
- PDF万能转换器绿色下载