1. 程式人生 > >AES/CBC/PKCS5Padding (128)

AES/CBC/PKCS5Padding (128)

    /**
     * AES/ECB/PKCS5Padding (128)
     * AES加密 ECB模式 PKCS5填充方式 金鑰長度必須為16個位元組(128位)
     */
    public static void main(String[] args) throws Exception {
        //金鑰生成器
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        //設定金鑰長度128位
        kgen.init(128, new SecureRandom());
        //生成key
        SecretKey key = kgen.generateKey();

        //長度為16的二進位制陣列,金鑰我們自己生成也可以.
        byte[] keyBytes = key.getEncoded();
        System.out.println("keyBytes長度是16 = " + keyBytes.length);

        //建立AES的金鑰
        SecretKeySpec aesKey = new SecretKeySpec(keyBytes, "AES");

        //加密 模式 填充方式
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);

        //對abc進行加密,因為明文長度不固定,所以需要先分組在加密,每一組長度16個位元組
        //不夠16的需要進行填充,abc的長度是3個位元組,所以要填充13個位元組在進行加密
        //所以encrypt的長度為16,因為在加密之前填充了
        //如果長度正好為16個位元組,那麼也要新填充一個16長度的組,那麼加密後的encrypt的長度為32
        byte[] encrypt = cipher.doFinal("abc".getBytes());
        System.out.println(encrypt.length);

        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        byte[] decrypt = cipher.doFinal(encrypt);
        System.out.println(new String(decrypt));
    }