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

Posted

技术标签:

【中文标题】Oracle DBMS_CRYPTO.ENCRYPT AES256 的初始化向量长度【英文标题】:Oracle DBMS_CRYPTO.ENCRYPT initialization vector length for AES256 【发布时间】:2011-11-23 19:12:14 【问题描述】:

在使用 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】:

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

你的代码

hextoraw('0123456789ABCDEF')

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

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

【讨论】:

感谢您的解释,我不再收到上述错误。但是,当我尝试用 Java 解密时,我得到以下信息:javax.crypto.BadPaddingException: Given final block not properly padded 这可能意味着您使用了不同的填充类型、不同的操作模式、不同的键或不同的初始化向量。没有更多细节,就无法做出决定。

以上是关于Oracle DBMS_CRYPTO.ENCRYPT AES256 的初始化向量长度的主要内容,如果未能解决你的问题,请参考以下文章

windows安装oracle76%卡了

oracle 语法

oracle 是怎么收费的?

oracle的数据怎么发送到接口

oracle 查版本号,oracle怎样查版本

如何下载oracle11g