加密

AES

加密
  • 密钥生成
  • 数据填充至16的倍数
  • AES 加密
  • BASE64 加密
private final static String ALGO = "AES"; // AES加密
private final static String ALGO_MODE = "AES/CBC/NoPadding"; // (算法/模式/填充)
//private final static String ALGO_MODE = "AES"; // (算法)
private static String key = "qweasdzxcqweasdz"; // 固定的密钥
private static String iv = "qweasdzxcqweasdz"; 

public static String encrypt(String text) {
        try {
            Cipher cipher = Cipher.getInstance(ALGO_MODE);
            // Cipher块的大小 16/32/...
            int blockSize = cipher.getBlockSize();
            // 将待加密的数据转成字节
            byte[] dataBytes = data.getBytes();

            // 将加密字节数组填充至Cipher的倍数,
            // 填充规则16 - (70 % 16) = 10 ,在字节数组末尾添加10个10,
            // 具体的填充规则可以根据需要修改
            int dataLength = dataBytes.length;
            int paddingLength = blockSize - dataLength % 16;
            int encryptDataLength = dataLength + paddingLength;
            // 待填充的新数组
            byte[] encryptDataBytes = new byte[encryptDataLength];
            // copy
            System.arraycopy(dataBytes, 0, encryptDataBytes, 0, dataBytes.length);
            // 填充数组至16的倍数
            byte padding = Byte.valueOf(String.valueOf(paddingLength));
            for (int i = encryptDataLength - 1; i >= dataLength; i--){
                encryptDataBytes[i] = padding;
            }

            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("utf-8"), ALGO);
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("utf-8"));
            // 加密
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(encryptDataBytes);
            // 加密后的字节码通过BASE64处理
            String EncStr = Base64.encodeToString(encrypted, Base64.DEFAULT);
            Log.d(TAG, "encrypt: before" + Arrays.toString(encryptDataBytes));
            Log.d(TAG, "encrypt: encrypt" + Arrays.toString(encrypted));
            Log.d(TAG, "encrypt: BASE " + EncStr);
            return EncStr ;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
解密
  • BASE64 解密
  • AES 解密
  • 去除填充数据
public static String decrypt(String text) {
        try {
            // BASE64 解密
            byte[] encrypt = Base64.decode(text, Base64.DEFAULT);
            Cipher cipher = Cipher.getInstance(ALGO_MODE);

            // AES 解密
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("utf-8"), ALGO);
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("utf-8"));
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
            byte[] encryptData = cipher.doFinal(encrypt);
            int encryptDataLength = encryptData.length;

            //
            int removePadding = encryptData[encryptData.length-1];
            int dataLength = encryptData.length - removePadding;
            byte[] dataBytes = new byte[dataLength];
            for (int i = 0; i< dataLength; i++){
                dataBytes[i] = encryptData[i];
            }

            String data = new String(dataBytes);

            Log.d(TAG, "decrypt: " + Arrays.toString(encryptData));
            Log.d(TAG, "decrypt: " + Arrays.toString(dataBytes));
            Log.d(TAG, "decrypt: " + data);
            return data;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,887评论 0 6
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,080评论 0 14
  • 之前的项目中接触过一些加密的方法,也没有太仔细的进行记录和研究。最近在写SDK时,加密模块的占比相当之大;借此时机...
    过半_e764阅读 641评论 0 0
  • 目录一、对称加密 1、对称加密是什么 2、对称加密的优点 3、对称加密的问题 4、对称加密的应用场景 5、对称加密...
    意一ineyee阅读 62,305评论 8 110
  • 誓言结束的时候 是忘了我们的曾经 再见 是的,不是你说的 那句我爱你
    哇咔咔咔咔咔咔咔咔咔阅读 187评论 0 0