使用AES / CBC / PKCS7Padding的JAVA加密

时间:2016-04-27 10:28:58

标签: java encryption aes pkcs#7

我使用java AES / CBC / PKCS7Padding加密问题。我已经搜索并关注直到使用BouncyCastle提供程序。但我仍然无法获得正确的加密

请说要求是:

加密类型:对称
算法:AES
Blocksize = 128Bit(16字节)
密码模式:CBC
填充模式:PKCS7
加密密钥长度:256位(32字节)
向量初始化长度(IV):128位(16字节)

示例:

普通数据= ABC123
加密数据(base64编码)= CtGtW4hJfXxilSfNR1xmrg ==

我的代码是......

public final class StringFunc {
    final static String key = "jb2a19ou79rws6zknjlr803fvfgiyp1k";
    final static String algorithm = "AES/CBC/PKCS7Padding";
    final static String iv = "hod74ty97wr97g83";
    private static Cipher cipher = null;
    private static SecretKeySpec skeySpec = null;
    private static IvParameterSpec  ivSpec = null;

    private static void setUp(){
        try{
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
            skeySpec = new SecretKeySpec(key.getBytes(), "AES");
            ivSpec = new IvParameterSpec(iv.getBytes());
            cipher = Cipher.getInstance(algorithm);
        }catch(NoSuchAlgorithmException | NoSuchPaddingException ex){
        }
    }

    public static String encrypt(String str){
        try{
            Integer strL = (int) Math.ceil(str.length() / 8.0);
            Integer strB = strL*8;
            str = padRight(str, '', strB);
            setUp();
            try {
                cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
            } catch (InvalidAlgorithmParameterException ex) {
                return "";
            }
            byte[] enc = cipher.doFinal(str.getBytes());
            return new String(Base64.encodeBase64(enc));
        }catch(InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex){
            return "";            
        }
    }

    public static String padRight(String msg, char x, int l) {
        String result = "";
        if (!msg.isEmpty()) {
            for (int i=0; i<(l-msg.length()); i++) {
                result = result + x;
            }
            result = msg + result;
        }
        return result;
    }
}

我仍然无法获得正确的加密。任何人都可以提供帮助或提出建议吗?

1 个答案:

答案 0 :(得分:0)

从给定的输入中猜测,你应该遇到密钥长度的Javas限制: 由于美国不允许使用硬安全密钥,因此Java的默认密钥长度限制为128位。

要启用密钥&gt; 128位,您必须使用官方的“无限制”政策更改Java版本的政策(here for SE8

使用下载覆盖lib / security中的当前策略就足够了。