您的位置:首页 > 移动开发 > Android开发

AES加解密算法在Android中的应用及Android4.2以上版本调用问题

2017-05-04 22:02 387 查看
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之。

 要区别4.2以上版本的调用方法,否则将会出现意想不到的问题。

AESCipher.java

package com.test;  

  

import java.security.SecureRandom;  

  

import javax.crypto.Cipher;  

import javax.crypto.KeyGenerator;  

import javax.crypto.SecretKey;  

import javax.crypto.spec.SecretKeySpec;  

  

public class AESCipher {  

    public static String encrypt(String key, String src) throws Exception {     

        byte[] rawKey = getRawKey(key.getBytes());     

        byte[] result = encrypt(rawKey, src.getBytes());     

        return toHex(result);     

    }     

         

    public static String decrypt(String key, String encrypted) throws Exception {     

        byte[] rawKey = getRawKey(key.getBytes());     

        byte[] enc = toByte(encrypted);     

        byte[] result = decrypt(rawKey, enc);     

        return new String(result);     

    }     

    

    private static byte[] getRawKey(byte[] seed) throws Exception {     

        KeyGenerator kgen = KeyGenerator.getInstance("AES");   

        // SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法  

         SecureRandom sr = null;  

       if (android.os.Build.VERSION.SDK_INT >=  17) {  

         sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");  

       } else {  

         sr = SecureRandom.getInstance("SHA1PRNG");  

       }   

        sr.setSeed(seed);     

        kgen.init(256, sr); //256 bits or 128 bits,192bits  

        SecretKey skey = kgen.generateKey();     

        byte[] raw = skey.getEncoded();     

        return raw;     

    }     

    

         

    private static byte[] encrypt(byte[] key, byte[] src) throws Exception {     

        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");     

        Cipher cipher = Cipher.getInstance("AES");     

        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);     

        byte[] encrypted = cipher.doFinal(src);     

        return encrypted;     

    }     

    

    private static byte[] decrypt(byte[] key, byte[] encrypted) throws Exception {     

        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");     

        Cipher cipher = Cipher.getInstance("AES");     

        cipher.init(Cipher.DECRYPT_MODE, skeySpec);     

        byte[] decrypted = cipher.doFinal(encrypted);     

        return decrypted;     

    }     

    

    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));     

    }     

}  

TestAES.java

package com.test;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.view.View;  

import android.view.View.OnClickListener;  

import android.widget.Button;  

import android.widget.EditText;  

import android.widget.TextView;  

  

public class TestAES extends Activity implements OnClickListener {  

    private TextView tvTip = null;  

    private EditText etKey = null;  

    private EditText etStr = null;  

    private Button btnEncrypt = null;  

    private Button btnDecrypt = null;  

    //  

    String src = null;  

    String key = null;  

    String dest = null;  

  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

  

        tvTip = (TextView) findViewById(R.id.tvTip);  

        etKey = (EditText) findViewById(R.id.etKey);  

        etStr = (EditText) findViewById(R.id.etStr);  

        btnEncrypt = (Button) findViewById(R.id.btnEncrypt);  

        btnEncrypt.setOnClickListener(this);  

        btnDecrypt = (Button) findViewById(R.id.btnDecrypt);  

        btnDecrypt.setOnClickListener(this);  

        btnEncrypt.setEnabled(true);  

        btnDecrypt.setEnabled(false);  

  

    }  

  

    @Override  

    public void onClick(View v) {  

        // TODO Auto-generated method stub  

        if (v == btnEncrypt) {  

            src = etStr.getText().toString().trim();  

            key = etKey.getText().toString().trim();  

            if (!src.equals("") && !key.equals("")) {  

                try {  

                    dest = AESCipher.encrypt(key, src);  

                    tvTip.setText("Encrypted:");  

                    etStr.setText(dest);  

                    btnEncrypt.setEnabled(false);  

                    btnDecrypt.setEnabled(true);  

                } catch (Exception e) {  

                    // TODO Auto-generated catch block  

                    e.printStackTrace();  

                }  

            }  

  

        } else if (v == btnDecrypt) {  

            src = etStr.getText().toString().trim();  

            key = etKey.getText().toString().trim();  

            if (!src.equals("") && !key.equals("")) {  

                try {  

                    dest = AESCipher.decrypt(key, src);  

                    tvTip.setText("Decrypted:");  

                    etStr.setText(dest);  

                    btnDecrypt.setEnabled(false);  

                    btnEncrypt.setEnabled(true);  

                } catch (Exception e) {  

                    // TODO Auto-generated catch block  

                    e.printStackTrace();  

                }  

            }else{  

                tvTip.setText("Source:");  

                btnDecrypt.setEnabled(false);  

                btnEncrypt.setEnabled(true);  

            }  

        }  

    }  

}  

main.xml

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent"  

    android:orientation="vertical" >  

  

    <LinearLayout  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:orientation="vertical" >  

  

        <TextView  

            android:layout_width="100dp"  

            android:layout_height="wrap_content"  

            android:text="Key:" />  

  

        <EditText  

            android:id="@+id/etKey"  

            android:layout_width="200dp"  

            android:layout_height="40dp"  

            android:maxLength="32"  

            android:hint="Input the key" />  

    </LinearLayout>  

  

    <LinearLayout  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:orientation="vertical" >  

  

        <TextView  

            android:id="@+id/tvTip"  

            android:layout_width="100dp"  

            android:layout_height="wrap_content"  

            android:text="Source:" />  

  

        <EditText  

            android:id="@+id/etStr"  

            android:layout_width="400dp"  

            android:layout_height="200dp"  

            android:hint="Input the source"  

            android:inputType="textMultiLine"  

            android:maxLength="4096"  

            android:maxLines="100"  

            android:scrollHorizontally="false" />  

    </LinearLayout>  

  

    <LinearLayout  

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content"  

        android:orientation="horizontal" >  

  

        <Button  

            android:id="@+id/btnEncrypt"  

            android:layout_width="120dp"  

            android:layout_height="50dp"  

            android:text="加密字符串" />  

  

        <Button  

            android:id="@+id/btnDecrypt"  

            android:layout_width="120dp"  

            android:layout_height="50dp"  

            android:text="解密字符串" />  

          

    </LinearLayout>  

  

</LinearLayout>  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: