Android 加密 MD5和Base64简单介绍



今天了解了下加密,因为我的账号系统的密码是没有进行加密的,是将密码,用户名等信息作为post参数传递的。


MD5加密

先看下MD5加密,网上搜索到了很多方法,我挑一个简单的方法先展示出来,以后有兴趣再深入学习。

转载自:http://blog.csdn.net/randyjiawenjie/article/details/6589489

http://libin52008.blog.163.com/blog/static/105327187201186981459/


先了解下MD5的加密原理:

MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余数的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后再在这个结果后面附加一个以64位二进制表示的填充前的信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍数。这样做的原因是为满足后面处理中对信息长度的要求。MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目。

将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。 主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。

再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。 以一下是每次操作中用到的四个非线性函数(每轮一个)。

F(X,Y,Z)=(X∧Y)∨(( X)∧Z)
G(X,Y,Z)=(X∧Z)∨(Y∧( Z))
H(X,Y,Z)=X?Y?Z
I(X,Y,Z)=Y?(X∨( Z))

其中,?是异或,∧是与,∨是或, 是反符号。


如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。所有这些完成之后,将A,B,C,D分别加上a,b,c,d。然后用下一分组数据继续运行算法,最后的输出是A,B,C和D的级联。最后得到的A,B,C,D就是输出结果,A是低位,D为高位,DCBA组成128位输出结果。



下面是我的实现:

用AndroidStudio新建一个Project,建立一个类,名为MD5,该类可以提供将字符串转换为MD5的方法。该类的内容如下:

package com.example.md5test;

        import java.security.MessageDigest;
        import java.security.NoSuchAlgorithmException;

/**
 * 提供getMD5(string)方法
 */
public class MD5 {
    public static String getMD5(String str) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(str.getBytes());
        byte[] m = md5.digest(); //加密
        return getString(m);
    }
    private static String getString(byte[] b){
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<b.length; i++){
            sb.append(b[i]);
        }
        return sb.toString();
    }
}
若要得到一个字符串string的MD5值,使用如下方法即可:

MD5.getMD5(string);


上述方法应该是32位的加密,16位的加密请参考:http://www.cnblogs.com/xuhongfei/p/4014749.html

我认为16位的加密输出应该是sb.toString().substring(8,24)


Base64加密

转载自:http://blog.csdn.net/huangyunzeng2008/article/details/6563711

http://blog.csdn.net/jacky_dai/article/details/4698461

http://blog.csdn.net/vicken520/article/details/9066563


Base64加密原理:

1. Base64使用A--Z,a--z,0--9,+,/ 这64个字符.
2. 编码原理:将3个字节转换成4个字节( (3 X 8) = 24 = (4 X 6) )先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了.
3. 解码原理:将4个字节转换成3个字节.先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位.这样就还原了.

    Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下。Base64并不是一种用于安全领域的加密解密算法(这类算法有DES等),尽管我们有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其变换是非常简单的,仅仅能够避免信息被直接识别。


实现:

import java.io.UnsupportedEncodingException;
import sun.misc.*;
public class Base64Test {
	// 加密
	public static String getBase64(String str){
		byte[] b = null;
		String s = null;
		try{
			b = str.getBytes("utf-8");
		}catch(UnsupportedEncodingException e){
			e.printStackTrace();
		}
		if(b != null){
			s = new BASE64Encoder().encode(b);
		}
		return s;
	}
	// 解密
	public static String getFromBase64(String s){
		byte[] b = null;
		String result = null;
		if(s != null){
			BASE64Decoder decoder = new BASE64Decoder();
			try{
				b = decoder.decodeBuffer(s);
				result = new String(b, "utf-8");
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return result;
	}
}

使用Eclipse是会报错,内容为: The method encode(byte[]) from the type CharacterEncoder is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_21\jre\lib\rt.jar

解决办法为:Window -preferences - Java - Compiler - Errors/Warnings界面的Deprecated and restricted API下。把Forbidden reference (access rules): 的规则由默认的Error改为Warning。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值