Java Oracle DBMS_CRYPTO.ENCRYPT AES256的初始化向量长度

Java Oracle DBMS_CRYPTO.ENCRYPT AES256的初始化向量长度,java,sql,encryption,plsql,aes,Java,Sql,Encryption,Plsql,Aes,使用DBMS_CRYPTO.ENCRYPT过程时,初始化向量是否有最小/最大长度?我得到以下错误: ORA-28817: PL/SQL function returned an error. ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3 ORA-06512: at "SYS.DBMS_CRYPTO", line 13 ORA-06512: at "Test_Encryption", line 14 ORA-06512: at line 3 生成此错误的

使用DBMS_CRYPTO.ENCRYPT过程时,初始化向量是否有最小/最大长度?我得到以下错误:

ORA-28817: PL/SQL function returned an error.
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
ORA-06512: at "SYS.DBMS_CRYPTO", line 13
ORA-06512: at "Test_Encryption", line 14
ORA-06512: at line 3
生成此错误的代码如下所示:

raw_encrypted_token := DBMS_CRYPTO.ENCRYPT( src => UTL_I18N.STRING_TO_RAW( input_token, 'AL32UTF8' ),
                                            typ => encryption_type,
                                            key => key_raw_form,
                                            iv => hextoraw('0123456789ABCDEF') );

当我将密钥从16字节更改为32字节时,我没有任何问题。但是,我正在使用Cipher对象在Java中进行解码实验,初始化向量的长度只能为16字节。关于如何在pl/sql中解决初始化向量问题的任何建议?

对于大多数分组密码操作模式,初始化向量的长度应与块大小相同。对于AES,这是128位=16字节

你的代码

hextoraw('0123456789ABCDEF')
实际上产生一个16·4=64位的值,因为每个十六进制数字对应4位,而不是8位字节。 因此,对于128位初始化向量,32个十六进制数字字符串的长度是正确的


另一方面,如果对每个记录使用相同的键,则不应使用硬编码的初始化向量。出于安全目的,每个记录都应使用其自己的初始化向量进行加密-最好是随机向量,尽管根据操作模式(即CTR),唯一的一个就足够了(如果您在连续的记录之间留出一些空间)。

感谢您的解释,我不再得到上述错误。但是,当我尝试用Java解密时,我得到了以下信息:
javax.crypto.BadPaddingException:给定最后一个块没有正确填充
,这可能意味着您使用了不同的填充类型、不同的操作模式、不同的密钥或不同的初始化向量。如果没有更多的细节,就无法做出决定。