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

时间:2011-11-23 19:12:15

标签: 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

产生此错误的代码如下:

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中的初始化向量问题的任何建议?

1 个答案:

答案 0 :(得分:3)

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

您的代码

hextoraw('0123456789ABCDEF')

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

另一方面,如果对每条记录使用相同的密钥,则不应使用硬编码的初始化向量。出于安全考虑,每个记录都应该使用自己的初始化向量进行加密 - 最好是随机的,但是根据操作模式(即CTR),一个唯一的记录可能就足够了(如果你在连续的记录之间留一些空间)。 / p>