当前位置: 首页 > 知识库问答 >
问题:

使用AES/CBC/PKCS7Padding进行JAVA加密

逄俊贤
2023-03-14

我在使用java AES/CBC/PKCS7Padding加密时遇到了问题。我已经在使用bouncycastle提供程序之前进行搜索和跟踪。但我还是无法得到正确的加密

假设要求是:

加密类型:对称
算法:AES
块大小=128Bit(16字节)
密码模式:CBC
填充模式:PKCS7
加密密钥长度:256 Bit(32字节)
向量初始化长度(IV):128 Bit(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个答案

谷梁淇
2023-03-14

根据给定的输入进行猜测,您应该遇到Javas对密钥长度的限制:由于美国不允许使用硬安全密钥,因此Java的密钥长度被限制为默认为128bit。

要启用keys>128bit,您必须使用官方的“无限”策略更改Java版本的策略(这里针对SE8)

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

 类似资料:
  • 这几天我一直在纠结。我需要使用一个接受加密参数的API。API是用C#编写的。请求的加密如下: 算法:AES 密码模式:CBC 填充模式:PKCS7 块大小:128 密钥大小:256 加密字符串的表示形式:Base64 在搜索和尝试了网上建议的那么多东西之后,我仍然无法生成相同的加密值(特别是默认情况下不支持PKCS7,而PKCS5应该工作相同,但事实并非如此)。以下是我尝试过的一些方法: 1)使

  • 我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB

  • 问题内容: 我目前正在使用 256个字节的* 密钥大小来用Java加密文件,但是在搜索时我在stackexchange PKCS#5-PKCS#7填充上发现了它,并提到: * PKCS#5填充是8个字节块大小的PKCS#7填充的子集 所以我想知道 相对于上述配置,性能会更好吗? 正如我们所提到的,我们如何在Java中配置块大小 PKCS#7填充适用于从1到255字节的任何块大小。 我的示例代码是

  • 我一直在搜索一个Java代码示例来执行以下操作,但没有成功。我正在为我的特殊情况寻找解决办法。 已使用“testtest”为密码生成密钥和IV: 我可以访问加密文件,盐,钥匙和IV。我不相信我会收到密码。此外,我还安装了无限强度JCE策略。到目前为止,我只找到了另一个java程序进行加密并生成这些参数的示例。对于我的情况,我必须使用salt、key和iv值来解密一个文件。这在Java中是可能的吗?

  • 我使用java中的模式“AES/CBC/PKCS7PADDING”在2个设备之间进行通信。 注意:这里我只放了加密代码,但我们有类似的解密代码。 在通信开始时已经发送了IV矢量。然后,我们希望这两个设备交换加密的消息,而不再发送IV。如果我们的理解是正确的,只要没有消息丢失,两个设备都应该知道在异或中使用的当前“向量”是什么。 然而,Java代码并不像我们期望的那样工作:如果我连续调用encryp

  • 我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/