Translate

2016年3月2日 星期三

Android TripleDES encrypt/decrypt - 3DES加密(ECB Mode)

3DES
簡述 3DES,也稱為3DESede或TripleDES,是三重數據加密,且可以逆推的一種演算方案。 1975年每果IBM公司成功研究並發布了DES加密演算法,但DES密码長度容易被暴力破解,通過對DES演算法進行改版,針對每個數據塊進行三次DES加密,也就是3DES加密演算法。 但由于3DES的演算法是公開的,所以演算法本身沒有秘密可言,主要依靠唯一密鑰來確保數據加密解密的安全。 有人可能會問,那3DES到底安不安全呢?!目前為止,還沒有人能破解3DES,所以你要是能破解它,就足以震驚整個資安界了……

JAVA Code:
 
public class DESedeCrypto{
  
    private static final String Algorithm = "DESede/ECB/NoPadding";
    private static final String PASSWORD_CRYPT_KEY = "your_key";

    public static byte[] encryptMode(byte[] src) {
        try {
            //生成密鑰
            SecretKeySpec deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm); 
            //實現加解密物件   
            Cipher c1 = Cipher.getInstance(Algorithm);    
            //初始化為加密模式
            c1.init(Cipher.ENCRYPT_MODE, deskey);    
            return c1.doFinal(src);
        } catch (java.security.NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (javax.crypto.NoSuchPaddingException e2) {
            e2.printStackTrace();
        } catch (java.lang.Exception e3) {
            e3.printStackTrace();
        }
        return null;
    }

  public static byte[] decryptMode(byte[] src) {
        try {
            SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
            Cipher c1 = Cipher.getInstance(Algorithm);
            c1.init(Cipher.DECRYPT_MODE, deskey);    //初始化為解密模式
            return c1.doFinal(src);
        } catch (java.security.NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (javax.crypto.NoSuchPaddingException e2) {
            e2.printStackTrace();
        } catch (java.lang.Exception e3) {
            e3.printStackTrace();
        }
        return null;
    }

    /**
     * 修正KEY長度,3DES的密鑰長度需為24Byte,不夠補0
     *
     * @param keyStr  原KEY
     * @return
     * @throws UnsupportedEncodingException
     */
    public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {
        byte[] key = new byte[24];    //宣告一個24Byte的Key,初始值為0
        byte[] temp = keyStr.getBytes("UTF-8");    //將字串轉為位元陣列

        if (key.length > temp.length) {
            //如果原key不夠24Byte,則拷貝至原key長度
            System.arraycopy(temp, 0, key, 0, temp.length);
        } else {
            //如果原key大於24Byte,則拷貝至24Byte
            System.arraycopy(temp, 0, key, 0, key.length);
        }
        return key;
    }
}

MainActivity

 
public class MainActivity extends Activity {
    String text = "your_will_encrypto_text";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DESedeCrypto crypto = new DESedeCrypto();
        try {
            byte[] textEncode = crypto.encryptMode(text.getBytes("UTF-8"));
            System.out.println(Base64.encodeToString(textEncode, Base64.DEFAULT));
            byte[]  textDecode = crypto.decryptMode(textEncode);
            System.out.println(new String(textDecode));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

※ java.security.InvalidKeyException :通常是你的key長度不對

沒有留言:

張貼留言