android -------- AES加密解密算法
AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度可以为128、192或256位,分组长度128位,算法应易在各种硬件和软件上实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。
AES是一种对称的加密算法,可基于相同的密钥进行加密和解密
这个网上有很多种写法,
我就在网上找了两种作为参考
1:秘钥必须为16位字符串
// 加密
public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));
//此处使用BASE64做转码功能,同时能起到2次加密的作用。
//return new Base64().encodeToString(encrypted);
return Base64.encode(encrypted);
} // 解密
public static String Decrypt(String sSrc, String sKey) throws Exception {
try {
// 判断Key是否正确
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16位
if (sKey.length() != 16) {
System.out.print("Key长度不是16位");
return null;
}
byte[] raw = sKey.getBytes("utf-8");
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
//先用base64转码
//byte[] encrypted1 = new Base64().decode(sSrc);
byte[] encrypted1 = Base64.decode(sSrc);
try {
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original,"utf-8");
return originalString;
} catch (Exception e) {
System.out.println(e.toString());
return null;
}
} catch (Exception ex) {
System.out.println(ex.toString());
return null;
}
}
2:加密解密的秘钥没有长度限制
//加密
public static String encrypt(String content, String password) {
try {
//将秘钥补全为128位
KeyGenerator kgen = KeyGenerator.getInstance("AES");
//若想改为DES加密,则需要将秘钥位数改为64位
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
//创建密码器
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
//初始化
cipher.init(Cipher.ENCRYPT_MODE, key);
//加密
byte[] result = cipher.doFinal(byteContent);
//Base64转码
return Base64.encode(result);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
} //解密
public static String decrypt(String content, String password) throws Exception {
try {
//将秘钥补全为128位
KeyGenerator kgen = KeyGenerator.getInstance("AES");
//若想改为DES加密,则需要将秘钥位数改为64位
kgen.init(128, new SecureRandom(password.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
//创建密码器
Cipher cipher = Cipher.getInstance("AES");
//初始化
cipher.init(Cipher.DECRYPT_MODE, key);
//Base64转码
byte[] encrypted1 = Base64.decode(content);
//解密
byte[] result = cipher.doFinal(encrypted1);
//二进制转为字符串
return new String(result, "utf-8");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
main方法
//使用
public static void main(String[] args) throws Exception {
//秘钥--16位
//AES和DES同属对称加密算法
//
String cKey = "abcdefghabcdefgh";
//需要加密的字串
String cSrc = "Hello 小笨蛋";
System.out.println(cSrc);
//加密
String enString = DESAES.Encrypt(cSrc, cKey);
System.out.println("加密后的字串是:" + enString);
//解密
String DeString = DESAES.Decrypt(enString, cKey);
System.out.println("解密后的字串是:" + DeString); String keyN = "123456789"; String content = encrypt(cSrc,keyN);
System.out.println("加密后的字串是:" + content);
System.out.println("加密后的字串是:" + decrypt(content,keyN));
}
日志:

android -------- AES加密解密算法的更多相关文章
- php与java通用AES加密解密算法
		
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...
 - AES加密解密算法---java
		
package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...
 - android AES  加密解密
		
import java.security.Provider; import java.security.SecureRandom; import javax.crypto.Cipher; import ...
 - C# AES加密解密算法
		
/// <summary> /// AES加密 /// </summary> /// <param name="encryptStr">明文&l ...
 - AES加密解密算法
		
class Aes { /** * AES加密 * @param $data * @param $secret_key * @return string */ public static functi ...
 - C与C#之间使用AES加密解密算法
		
目的:C语言写的客户端加密数据,数据发送到C#写的服务端,服务端解密. 保证C与C#之间加密解密AES的配置和模式一直. AES: AES是对称加密算法,关键点: 密钥长度,明文长度,密文长度 密钥长 ...
 - android -------- RSA加密解密算法
		
RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计 ...
 - android -------- DES加密解密算法
		
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...
 - android -------- Base64 加密解密算法
		
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法.可查看RFC2045-RFC2049,上面有MIME的详细规范. Ba ...
 
随机推荐
- npm 更换阿里淘宝源
			
执行命令 npm config set registry https://registry.npm.taobao.org/ 查看是否已经更换成功 npm config get registry
 - C语言中指针是什么?
			
学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 --- ==恶名昭著的指针究竟是什么== " 指针是一种保存变量地址的变量,在 ...
 - Jmeter连接mysql,如何用delete、update、insert真正删除、更改、插入数据库里的数据;
			
1.如下图,当插入数据的时候如图对应填写,查询数据的时候上面插入的那条数据就会显示,但是如果不执行下图的提交数据:到数据库里查的时候,插入的这条数据实际上并没有插入成功: . 结果:如果没有提交数据, ...
 - LGOJP3959 宝藏
			
题目链接 题目链接 题解 一开始想了一个错误的状压dp,水了40分. 这里先记录一下错误的做法: 错解: 设\(g[i,j,S]\)从\(i\)到\(j\),只经过集合\(S\)中的点的最短路,这个可 ...
 - Visual Studio Code 写Python代码
			
之前用nodepad++,sublime text3,ultraedit,最近上手微软的vsc感觉上手还行,如果没有pycharm照样可以使用它 https://code.visualstudio.c ...
 - easyui_验证扩展
			
本文为转载,并非原创 easyui validatebox 验证类型 分类: jquery-easyUI -- : 11000人阅读 评论() 收藏 举报 easyuiValidateBox requ ...
 - Linux——自定义服务命令
			
前言 这个写部署禅道的时候包含了这个内容,但是今天弄的时候突然忘记了,所以还是重新写下. 步骤 有的同学可能会不知道一些系统自带的目录是什么意思,所以我这里就拆分下,不直接创建 进入到系统服务目录 c ...
 - volatile原理
			
内存可见性 内存可见性相关概念:线程对共享变量修改的可见性.当一个线程修改了共享变量的值,其他线程能够立刻得知这个修改. 后面会继续总结一篇<Java内存模型(JMM)总结>以详细描述内存 ...
 - Cocos2d-x学习小结 配置篇
			
Cocos2d-x学习小结 配置篇 学习工具:Cocos2d-x用户手册,<Cocos2d-x游戏开发之旅> 首先官网下载cocos2d-x源码,安装vs2019.如果没有安装python ...
 - 英语听力,如何成为更好的交谈着https://www.bilibili.com/video/av4279405?from=search&seid=5889429711390689339
			
and how many of you know at least one person that you because you just do not want to talk to them.y ...