android三种常⽤的加密⽅式
android应⽤中常⽤的加密⽅式有三种:MD5,AES,RSA。在进⾏实际的开发过程中,⼀般是⼏种加密⽅式配合使⽤,这样加密效果会更好,被破解的概率会越⼩。下⾯我们就分别讲⼀下三种加密⽅式的实现过程。
⼀、MD5
MD5本质是⼀种散列函数,⽤以提供消息的完整性保护。
特点:
1.压缩性:任意长度的数据,算出的MD5值长度都是固定的;
2.容易计算:从原数据计算出MD5值很容易;
3.抗修改性:对原数据进⾏任何改动,哪怕只修改1个字节,所得到的MD5值都有很⼤的区别;
4.强抗碰撞:已知原数据和其MD5值,想到⼀个具有相同MD5值的数据(及伪造数据)是⾮常困难的;
5.不可逆:MD5理论上是不可逆的(但是现在已经可以暴⼒破解了)。
使⽤场景:
1.验证密码:只要算法不变,就能和服务器上的MD5匹配;
2.⽂件完整性的校验:当下载⼀个⽂件时,服务器返回的信息包括这个⽂件的md5,在本地下载完毕时进⾏md5加密,将两个md5值进⾏⽐较,如果⼀致则说明⽂件完整没有丢包现象。
⼯具类代码:
ample.zhangbin.md5codedemo.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//MD5加密
public class MD5Utils {
//加密字符串
public String getMD5Code(String info){
try {
MessageDigest Instance("MD5");
md5.Bytes("utf-8"));
byte[]encryption=md5.digest();
StringBuffer stringBuffer=new StringBuffer();
for(int i=0;i<encryption.length;i++){
HexString(0xff &encryption[i]).length()==1){
stringBuffer.append("0").HexString(0xff&encryption[i]));
}else {
stringBuffer.HexString(0xff&encryption[i]));
}
}
String();
} catch (Exception e) {
// e.printStackTrace();
return "";
}
}
//加密⽂件
public static String md5ForFile(File file){
int buffersize = 1024;
FileInputStream fis = null;
DigestInputStream dis = null;
try {
//创建MD5转换器和⽂件流
MessageDigest messageDigest =Instance("MD5");
fis = new FileInputStream(file);
dis = new DigestInputStream(fis,messageDigest);
byte[] buffer = new byte[buffersize];
//DigestInputStream实际上在流处理⽂件时就在内部就进⾏了⼀定的处理
while (ad(buffer) > 0);
//通过DigestInputStream对象得到⼀个最终的MessageDigest对象。
messageDigest = MessageDigest();
// 通过messageDigest拿到结果,也是字节数组,包含16个元素
byte[] array = messageDigest.digest();
// 同样,把字节数组转换成字符串
StringBuilder hex = new StringBuilder(array.length * 2);
for (byte b : array) {
if ((b & 0xFF) < 0x10){
hex.append("0");
}
hex.HexString(b & 0xFF));
}
String();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
⼆、RSA加密
RSA加密算法是⼀种⾮对称加密算法,⾮对称加密算法需要两个密钥:公共密钥和私有密钥。公钥和私钥是配对的,⽤公钥加密的数据只有配对的私钥才能解密。
RSA对加密数据的长度有限制,⼀般为密钥的长度值-11,要加密较长的数据,可以采⽤数据截取的⽅法,分段加密。
使⽤场景:
⽂件或数据在本地使⽤公钥或私钥加密,加密后的数据传送到服务器,服务器使⽤同⼀套密钥中的私钥或者公钥进⾏解密。
ample.zhangbin.md5codedemo.utils;
import android.util.Base64;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PrivateKey;
import java.security.PublicKey;
pto.Cipher;
pto.NoSuchPaddingException;
public class RSAUtils {
//构建Cipher实例时所传⼊的的字符串,默认为"RSA/NONE/PKCS1Padding"
private static String sTransform = "RSA/NONE/PKCS1Padding";
//进⾏Base64转码时的flag设置,默认为Base64.DEFAULT
private static int sBase64Mode = Base64.DEFAULT;
//初始化⽅法,设置参数
java加密方式有哪些public static void init(String transform,int base64Mode){
sTransform = transform;
sBase64Mode = base64Mode;
}
//产⽣密钥对
public static KeyPair generateRSAKeyPair(int keyLength){
KeyPair keyPair=null;
try {
KeyPairGenerator Instance("RSA");
//设置密钥长度
keyPairGenerator.initialize(keyLength);
//产⽣密钥对
ateKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return keyPair;
}
/**
* 加密或解密数据的通⽤的⽅法,srcData:待处理的数据;key:公钥或者私钥,mode指
* 加密还是解密,值为Cipher.ENCRYPT_MODE或者Cipher.DECRYPT_MODE
*/
public static byte[]processDAta(byte[]srcData, Key key,int mode){
//⽤来保存处理的结果
byte[]resultBytes=null;
/
/构建Cipher对象,需要传⼊⼀个字符串,格式必须为"algorithm/mode/padding"或者"algorithm/",意为"算法/加密模式/填充⽅式" try {
Cipher Instance("RSA/NONE/PKCS1Padding");
//初始化Cipher,mode指定是加密还是解密,key为公钥或密钥
cipher.init(mode,key);
//处理数据
resultBytes=cipher.doFinal(srcData);
} catch (Exception e) {
e.printStackTrace();
}
return resultBytes;
}
//使⽤公钥加密数据,结果⽤Base64转码
public static String encryptDataByPublicKey(byte[]srcData, PublicKey publicKey){
byte[]resultBytes=processDAta(srcData,publicKey,Cipher.ENCRYPT_MODE);
deToString(resultBytes,sBase64Mode);
}
//使⽤私钥解密,结果⽤Base64转码
public static byte[]decryptDataByPrivate(String encryptedData, PrivateKey privateKey){
byte[]bytes=Base64.decode(encryptedData,sBase64Mode);
return processDAta(bytes,privateKey,Cipher.DECRYPT_MODE);
}
//使⽤私钥解密,返回解码数据
public static String decryptToStrByPrivate(String encryptedData,PrivateKey privateKey){
return new String(decryptDataByPrivate(encryptedData,privateKey));
}
}
}
三、AES加密
AES加密是⼀种⾼级加密标准,是⼀种区块加密标准。它是⼀个对称密码,就是说加密和解密⽤相同的密钥。WPA/WPA2经常⽤的加密⽅式就是AES加密算法。
⽰意图:
⼯具类代码:
ample.zhangbin.md5codedemo.utils;
import java.io.UnsupportedEncodingException;
pto.Cipher;
pto.spec.SecretKeySpec;
public class AESUtils3 {
/* 算法/模式/填充 */
private static final String CipherMode = "AES/ECB/PKCS5Padding";
/* 创建密钥 */
private static SecretKeySpec createKey(String password) {
byte[] data = null;
if (password == null) {
password = "";
}
StringBuffer sb = new StringBuffer(32);
sb.append(password);
while (sb.length() < 32) {
sb.append("0");
}
if (sb.length() > 32) {
sb.setLength(32);
}
try {
data = sb.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new SecretKeySpec(data, "AES");
}
/* 加密字节数据 */
public static byte[] encrypt(byte[] content, String password) {
try {
SecretKeySpec key = createKey(password);
System.out.println(key);
Cipher cipher = Instance(CipherMode);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*加密(结果为16进制字符串) */
public static String encrypt(String content, String password) { byte[] data = null;
try {
data = Bytes("UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
data = encrypt(data, password);
String result = byte2hex(data);
return result;
}
/*解密字节数组*/
public static byte[] decrypt(byte[] content, String password) { try {
SecretKeySpec key = createKey(password);
Cipher cipher = Instance(CipherMode);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/
*解密16进制的字符串为字符串 */
public static String decrypt(String content, String password) { byte[] data = null;
try {
data = hex2byte(content);
} catch (Exception e) {
e.printStackTrace();
}
data = decrypt(data, password);
if (data == null) return null;
String result = null;
try {
result = new String(data, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/*字节数组转成16进制字符串 */
public static String byte2hex(byte[] b) { // ⼀个字节的数,
StringBuffer sb = new StringBuffer(b.length * 2);
String tmp = "";
for (int n = 0; n < b.length; n++) {
/
/ 整数转成⼗六进制表⽰
tmp = (java.HexString(b[n] & 0XFF));
if (tmp.length() == 1) {
sb.append("0");
}
sb.append(tmp);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论