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

xiaoxiao2021-02-27  228

密码学中的高级加密标准(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>  
转载请注明原文地址: https://www.6miu.com/read-10640.html

最新回复(0)