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

初始化向量异常

凤明朗
2023-03-14

我假设使用以下元素按以下顺序构建一个字节数组:

  • 对称加密的AES密钥(对于AES 128有一个随机密钥,对于AES 128有一个随机初始化向量。在CBC模式下使用AES 128和PKCS5填充进行加密。在加密之前,文本用UTF-8进行编码)
  • AES IV
  • 加密消息(使用ECB模式下的RSA算法和PKCS1填充、先前生成的密钥和消息收件人的公钥)

我正在做的是获取每个参数的长度,以便创建新的byte[]。然后,在for循环中,我尝试按顺序添加这三个元素。

public void encrypt(String original)
{
    SecureRandom sr = new SecureRandom();

    byte [] key = new byte[16];
    byte [] iv = new byte[16];

    sr.nextBytes(key);
    sr.nextBytes(iv);

    Cipher cipher;

    try 
    {
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        IvParameterSpec IV=new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,"AES"), IV);
        byte[] utf8 = original.getBytes("UTF-8");
        byte []encryptedAES = cipher.doFinal(utf8);

        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(128);//128 bits
        KeyPair kp = kpg.genKeyPair();

        Cipher publicKeyCipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
        publicKeyCipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
        byte [] encryptedRSA = publicKeyCipher.doFinal(encryptedAES); //error here

        int length1=encryptedAES.length;
        int length2=IV.getIV().length;
        int length3=encryptedRSA.length;
        int length=length1+length2+length3;
        byte [] result= new byte[length];

        int l=0,m=0;

        for (int i=0; i<length; i++)
        {
            if(i<length1)
            {
                result[i] = encryptedAES[i];
            }
            else if(i>=length1 && i<length2)
            {
                result[i] = IV.getIV()[l];
                l++;
            }
            else if(i>=length2)
            {
                result[i] = encryptedRSA[m];
                m++;
            }
        }
        Log.i("Encrypted", "done");
        this.encryptedMessage=Base64.encodeToString(result, false);
        Log.i("Encrypted Message:", this.encryptedMessage);

    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我得到的例外是:

java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

共有1个答案

秦权
2023-03-14

显然你的IV必须是16字节,而不是128字节。(128位=16字节)

 类似资料:
  • 当我试图启动我的服务器时,我收到了几个错误。我知道这无法启动数据库,但我可以帮助解决以下问题吗? Pentaho用户控制台 检测到以下错误。 一个或多个系统侦听器失败。这些设置在systemListeners中。xml。 ERROR_0014-尝试执行QuartzSystemListener启动序列时出错org.pentaho.platform.scheduler. 有关检测到的每个错误的更多详细

  • 问题内容: 当我运行此代码时: 但是我得到警告 所以我去看了看文档,但是“没有文档”。但仍然没有提到初始化向量是什么以及如何使用它。谁能启发我? 我知道我可以做更多的Google搜索工作,但是在众多搜索结果中排在首位,我认为这个问题对其他遇到此问题的人可能很有用。 问题答案: IV通常是一个随机数,可确保加密文本是唯一的。 为了解释为什么需要它,让我们假设我们有一个用密钥“秘密”而不用IV加密的人

  • 问题内容: 我有一个关于在AES加密中使用初始化向量的问题。我引用以下文章/帖子将加密功能构建到程序中: [1] 基于Java256位AES密码的加密 [2]http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html 我最初从第一个链接开始关注erickson的解决方案,但是据我所知,我

  • 问题内容: 如何使用类型初始化变量? 因为我有错误 问题答案: 常量声明不能包含函数调用(某些例外,请参见下文),它们必须在编译时进行评估,而函数调用是在运行时进行的。 引用规格:常量: 常数值由符文,整数,浮点数,虚数或字符串文字表示,标识符表示常数,常数表达式,结果为常数的转换或某些内置结果的值函数,例如应用于任何值,或应用于某些表达式,以及应用于常量,以及应用于数字常量的复数。 并引用Spe

  • 本文向大家介绍tensorflow 初始化未初始化的变量实例,包括了tensorflow 初始化未初始化的变量实例的使用技巧和注意事项,需要的朋友参考一下 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴: 通过tf.global_variables()返回一个全局变量的列表global_vars, 然后以python列表解析式的

  • 我有以下代码: 它从“VM参数”中读取并分配给变量。 由于静态最终变量仅在类加载时初始化,因此如何在有人忘记传递参数的情况下捕获异常。 目前,当我使用“property\u file\u location”变量时,在以下情况下会遇到异常: 若值存在,并且位置错误,则会出现FileNotFound异常 如果未正确初始化(值为null),则抛出NullPointerException 我只需要在初始化