zoukankan      html  css  js  c++  java
  • Android AES加密算法及事实上现

           昨天老大叫我看看android加密算法。于是网上找了找,找到了AES加密算法。(当然还有MD5,BASE64什么的http://snowolf.iteye.com/blog/379860这篇文章列举了非常多,可是基本都是j2se平台的,android平台不一定支持,可是AES算法Android是自带了包的,从官方的http://developer.android.com/reference/javax/crypto/Cipher.html能够看到。

     AES加密算法是什么?大家能够自己去google,专家级程序猿写好包,project人员会用即可了。

    这个样例事实上是来自http://www.tutorials-android.com/learn/How_to_encrypt_and_decrypt_strings.rhtml

    src文件夹主文件:

    package com.qq;
    import java.security.SecureRandom;
    
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    public class SimpleCrypto extends Activity {
    	 public static String encrypt(String seed, String cleartext) throws Exception {    
    	        byte[] rawKey = getRawKey(seed.getBytes());    
    	        byte[] result = encrypt(rawKey, cleartext.getBytes());    
    	        return toHex(result);    
    	    }    
    	        
    	    public static String decrypt(String seed, String encrypted) throws Exception {    
    	        byte[] rawKey = getRawKey(seed.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");    
    	        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");    
    	        sr.setSeed(seed);    
    	        kgen.init(128, sr); // 192 and 256 bits may not be available    
    	        SecretKey skey = kgen.generateKey();    
    	        byte[] raw = skey.getEncoded();    
    	        return raw;    
    	    }    
    	   
    	        
    	    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {    
    	        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    
    	        Cipher cipher = Cipher.getInstance("AES");    
    	        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);    
    	        byte[] encrypted = cipher.doFinal(clear);    
    	        return encrypted;    
    	    }    
    	   
    	    private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {    
    	        SecretKeySpec skeySpec = new SecretKeySpec(raw, "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));    
    	    } 
    	/** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            String masterPassword = "a";
            String originalText = "0123456789";
            byte[] text = new byte[]{'0','1','2','3','4','5','6','7','8','9'};
            byte[] password = new byte[]{'a'};
            try {
        		String encryptingCode = SimpleCrypto.encrypt(masterPassword,originalText);
    //    		System.out.println("加密结果为 " + encryptingCode);
        		Log.i("加密结果为 ",encryptingCode);
        		String decryptingCode = SimpleCrypto.decrypt(masterPassword, encryptingCode);
        		System.out.println("解密结果为 " + decryptingCode);
        		Log.i("解密结果",decryptingCode);
        	   } catch (Exception e) {
        		// TODO Auto-generated catch block
        		e.printStackTrace();
        }
        }
    }

    布局文件main.xml和配置文件AndroidManifest.xml默认就好了。最后结果在Log里面看,利用adb logcat > d:1.txt定位到D盘的1.txt文件,然后用记事本打开就,查找”加密结果为“就能够看到了:

    执行结果(从log日志中看到的):

    I/加密结果为 (  190): BFB77D8F1E1EE9D5E252926A12659DE8

    I/解密结果(  190): 0123456789

  • 相关阅读:
    洛谷 P1508 Likecloud-吃、吃、吃
    Codevs 1158 尼克的任务
    2017.10.6 国庆清北 D6T2 同余方程组
    2017.10.6 国庆清北 D6T1 排序
    2017.10.3 国庆清北 D3T3 解迷游戏
    2017.10.3 国庆清北 D3T2 公交车
    2017.10.3 国庆清北 D3T1 括号序列
    2017.10.4 国庆清北 D4T1 财富
    2017.10.7 国庆清北 D7T2 第k大区间
    2017.10.7 国庆清北 D7T1 计数
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4501368.html
Copyright © 2011-2022 走看看