zoukankan      html  css  js  c++  java
  • AES CryptoUtils

    
    
    import javax.crypto.Cipher;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;
    import java.security.SecureRandom;
    import java.util.Base64;
    
    import static java.nio.charset.StandardCharsets.UTF_8;
    
    public class CryptoUtils {
    
        private static AesCrypto textCrypto = null; // key for text data
    
        public static void init(String key) {
            if (textCrypto == null) {
                textCrypto = new AesCrypto(key);
            }
        }
    
    
        public static String decryptText(final String cypherData) {
            return new String(textCrypto.decryptBytes(TrimBase64.decode(cypherData)), UTF_8);
        }
    
        public static String encryptText(final String planData) {
            return TrimBase64.encode(textCrypto.encryptBytes(planData.getBytes(UTF_8)));
        }
    
        private static class TrimBase64 {
            private static byte[] decode(String text) {
                if (text == null) {
                    return null;
                }
                // padding trailing '='
                int length = text.length();
                switch (length % 4) {
                    case 2:
                        text += "==";
                        break;
                    case 1:
                        text += "===";
                        break;
                    case 3:
                        text += "=";
                        break;
                    default:
                        break;
                }
                return Base64.getDecoder().decode(text);
            }
    
            private static String encode(byte[] data) {
                // trim trailing '='
                return data == null ? null : Base64.getEncoder().encodeToString(data).replaceAll("=*$", "");
            }
        }
    
        private static class AesCrypto {
    
            private final SecretKeySpec keySpec;
            private final SecureRandom srandom;
    
            AesCrypto(String hexKey) {
                if (!testKeys(hexKey)) {
                    throw new RuntimeException("AES Key invalid");
                }
                keySpec = new SecretKeySpec(fromHex(hexKey), "AES");
                srandom = new SecureRandom();
            }
    
            /**
             * AES-128/192/256 allowed
             *
             * @param hexKey
             * @return
             */
            private boolean testKeys(String hexKey) {
                return hexKey != null && (hexKey.length() == 32 || hexKey.length() == 48 || hexKey.length() == 64);
            }
    
            private byte[] fromHex(String hexStr) {
                if (hexStr == null) {
                    return null;
                }
                int length = hexStr.length();
                if (length % 2 == 1) {
                    return null;
                }
                int byteLength = length / 2;
                byte[] raw = new byte[byteLength];
                for (int i = 0; i < byteLength; i++) {
                    raw[i] = (byte) Integer.parseInt(hexStr.substring(i + i, i + i + 2), 16);
                }
                return raw;
            }
    
            private byte[] decryptBytes(byte[] sBytes) {
                if (sBytes == null) {
                    return null;
                }
                try {
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                    int ivSize = cipher.getBlockSize();
                    IvParameterSpec ivSpec = new IvParameterSpec(sBytes, 0, ivSize);
                    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
                    byte[] payload = cipher.doFinal(sBytes, ivSize, sBytes.length - ivSize);
                    return payload;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
    
            private byte[] encryptBytes(byte[] sBytes) {
                if (sBytes == null) {
                    return null;
                }
                try {
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                    byte[] iv = new byte[cipher.getBlockSize()];
                    srandom.nextBytes(iv);
                    IvParameterSpec ivSpec = new IvParameterSpec(iv);
                    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
                    byte[] payload = cipher.doFinal(sBytes);
                    byte[] encrypted = new byte[iv.length + payload.length];
                    System.arraycopy(iv, 0, encrypted, 0, iv.length);
                    System.arraycopy(payload, 0, encrypted, iv.length, payload.length);
                    return encrypted;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }
    }
    

      

  • 相关阅读:
    ISO/IEC 9899:2011 条款6.10.3——宏替换
    ISO/IEC 9899:2011 条款6.10.2——源文件包含
    关于Objective-C新增的__kindof关键字
    ISO/IEC 9899:2011 条款6.10.1——条件包含
    ISO/IEC 9899:2011 条款6.10——预处理指示符
    ISO/IEC 9899:2011 条款6.9.2——外部对象定义
    Objective-C中使用不定参数个数的方法调用
    php添加数据到xml文件的例子
    nginx rewrite重写与防盗链配置
    nginx url自动加斜杠的问题
  • 原文地址:https://www.cnblogs.com/lhp2012/p/11019749.html
Copyright © 2011-2022 走看看