安卓使用加解密异常集合

今天在使用MD5对明文加密的时候出现异常
异常代码

MD5EncodeResult =Hex.encodeHexString(md5Bytes);
系统没报错,出现也正常运行,但在执行这条语句时,程序异常退出

情况如下

异常完整代码如下

package com.jluzh.UtilActivity;

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Hex;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.networksecurity.R;

public class MD5Activity extends Activity{
    public  static  final       String  TAG =   "MD5";
    private static Button MD5Encode;
    private static Button MD5Clear;
    private static EditText edit_src;
    private static TextView text_result;
    private static String MD5EncodeResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.md5_layout);

        MD5Encode =  (Button) findViewById(R.id.MD5Encode);
        MD5Clear =  (Button) findViewById(R.id.MD5Clear);
        edit_src = (EditText) findViewById(R.id.edit_src);
        text_result = (TextView) findViewById(R.id.text_result);


        //设置MD5 Button加密点击事件
        MD5Encode.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        try {
                            Log.d(TAG, "执行加密");
                            //取得编辑框的内容
                            String src = edit_src.getText().toString();         
                            //使用JDK MD5加密
                            MessageDigest md = MessageDigest.getInstance("MD5");
                            byte[] md5Bytes = md.digest(src.getBytes());
                            Log.d(TAG, "进行转换");
                            MD5EncodeResult =Hex.encodeHexString(md5Bytes);
                            Log.d(TAG, MD5EncodeResult);
                            //文本框显示MD5加密后的密文
                            text_result.setText(MD5EncodeResult);

                            Log.d(TAG, "加密完成");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }//MD5EncodeOnClick结束
            });//MD5EncodesetOnClickListener结束

        //设置清空内容点击事件
        MD5Clear.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        Log.d(TAG, "执行清空");
                        edit_src.setText("");
                        text_result.setText("");
                        Log.d(TAG, "已清空");
                    }//MD5ClearOnClick结束
            });//MD5ClearSetOnClickListener结束
    }//MD5ActivityOnCreate结束    
}//MD5Activity类结束

程序可以运行
这里写图片描述
点击加密出现异常
这里写图片描述
异常信息
这里写图片描述

解决方法:

MD5EncodeResult =Hex.encodeHexString(md5Bytes);

要对md5Bytes数组进行16进制转换

在MD5Activity类中添加一个方法

    private static String toHexString(byte[] bytes, String separator) { //转为十六进制 
        StringBuilder hexString = new StringBuilder(); 
        for (byte b : bytes) { 
            String hex = Integer.toHexString(0xFF & b); 
            if(hex.length() == 1){ 
                hexString.append('0'); 
            } 
            hexString.append(hex).append(separator); 
        } 
        return hexString.toString(); 
    }

然后调用方法

MD5EncodeResult =toHexString(md5Bytes,"");

成功运行
这里写图片描述

无异常代码如下

package com.jluzh.UtilActivity;

import java.security.MessageDigest;

import org.apache.commons.codec.binary.Hex;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.example.networksecurity.R;

public class MD5Activity extends Activity{
    public  static  final       String  TAG =   "MD5";
    private static Button MD5Encode;
    private static Button MD5Clear;
    private static EditText edit_src;
    private static TextView text_result;
    private static String MD5EncodeResult;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.md5_layout);

        MD5Encode =  (Button) findViewById(R.id.MD5Encode);
        MD5Clear =  (Button) findViewById(R.id.MD5Clear);
        edit_src = (EditText) findViewById(R.id.edit_src);
        text_result = (TextView) findViewById(R.id.text_result);


        //设置MD5 Button加密点击事件
        MD5Encode.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        try {
                            Log.d(TAG, "执行加密");
                            //取得编辑框的内容
                            String src = edit_src.getText().toString();         
                            //使用JDK MD5加密
                            MessageDigest md = MessageDigest.getInstance("MD5");
                            byte[] md5Bytes = md.digest(src.getBytes());
                            Log.d(TAG, "进行转换");
                            MD5EncodeResult =toHexString(md5Bytes,"");
                            Log.d(TAG, MD5EncodeResult);
                            //文本框显示MD5加密后的密文
                            text_result.setText(MD5EncodeResult);

                            Log.d(TAG, "加密完成");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }//MD5EncodeOnClick结束
            });//MD5EncodesetOnClickListener结束

        //设置清空内容点击事件
        MD5Clear.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View arg0) {
                        Log.d(TAG, "执行清空");
                        edit_src.setText("");
                        text_result.setText("");
                        Log.d(TAG, "已清空");
                    }//MD5ClearOnClick结束
            });//MD5ClearSetOnClickListener结束
    }//MD5ActivityOnCreate结束

    private static String toHexString(byte[] bytes, String separator) { //转为十六进制 
        StringBuilder hexString = new StringBuilder(); 
        for (byte b : bytes) { 
            String hex = Integer.toHexString(0xFF & b); 
            if(hex.length() == 1){ 
                hexString.append('0'); 
            } 
            hexString.append(hex).append(separator); 
        } 
        return hexString.toString(); 
    }

}//MD5Activity类结束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章