ORA-28234:在Oracle中执行AES加密时密钥长度太短

ORA-28234:在Oracle中执行AES加密时密钥长度太短,oracle,encryption,aes,Oracle,Encryption,Aes,我正在尝试在Oracle中执行AES加密,并获得ORA-28234:密钥长度太短错误 然而,钥匙的长度是32,根据我的说法是正确的 选择长度('���(Df)�%{�O�E�M5���� ���M�') 来自双路; 输出: declare l_mod number; enc_val raw(2000); begin l_mod:= dbms_crypto.ENCRYPT_AES + dbms_crypto.CHAIN_CBC+ dbms_crypto.AES_CBC_PKCS5;

我正在尝试在Oracle中执行AES加密,并获得
ORA-28234:密钥长度太短
错误

然而,钥匙的长度是32,根据我的说法是正确的

选择长度('���(Df)�%{�O�E�M5���� ���M�') 来自双路;

输出:

declare
 l_mod number;
 enc_val raw(2000);
begin
     l_mod:= dbms_crypto.ENCRYPT_AES + dbms_crypto.CHAIN_CBC+ dbms_crypto.AES_CBC_PKCS5;
     enc_val := dbms_crypto.encrypt(UTL_I18N.STRING_TO_RAW ('test',  'AL32UTF8'),l_mod,UTL_RAW.CAST_TO_RAW ('���(Df�%{�O�e�M5���� ���M�'));
     DBMS_OUTPUT.PUT_LINE('enc_val='||enc_val);

end;
Error report -
ORA-28234: key length too short
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
ORA-06512: at "SYS.DBMS_CRYPTO", line 13
ORA-06512: at line 6
28234. 00000 -  "key length too short"
*Cause:    The key specified is too short for the algorithm. DES
           requires a key of at least 8 bytes. Triple DES requires a
           key of least 16 bytes in two-key mode and 24 bytes in three-key
           mode.
*Action:   Specify a longer key.
32

我在
python
postgres
中尝试了使用相同密钥的AES加密,效果很好

请建议

Oracle AES匿名块:

declare
 l_mod number;
 enc_val raw(2000);
begin
     l_mod:= dbms_crypto.ENCRYPT_AES + dbms_crypto.CHAIN_CBC+ dbms_crypto.AES_CBC_PKCS5;
     enc_val := dbms_crypto.encrypt(UTL_I18N.STRING_TO_RAW ('test',  'AL32UTF8'),l_mod,UTL_RAW.CAST_TO_RAW ('���(Df�%{�O�e�M5���� ���M�'));
     DBMS_OUTPUT.PUT_LINE('enc_val='||enc_val);

end;
Error report -
ORA-28234: key length too short
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
ORA-06512: at "SYS.DBMS_CRYPTO", line 13
ORA-06512: at line 6
28234. 00000 -  "key length too short"
*Cause:    The key specified is too short for the algorithm. DES
           requires a key of at least 8 bytes. Triple DES requires a
           key of least 16 bytes in two-key mode and 24 bytes in three-key
           mode.
*Action:   Specify a longer key.
输出:

declare
 l_mod number;
 enc_val raw(2000);
begin
     l_mod:= dbms_crypto.ENCRYPT_AES + dbms_crypto.CHAIN_CBC+ dbms_crypto.AES_CBC_PKCS5;
     enc_val := dbms_crypto.encrypt(UTL_I18N.STRING_TO_RAW ('test',  'AL32UTF8'),l_mod,UTL_RAW.CAST_TO_RAW ('���(Df�%{�O�e�M5���� ���M�'));
     DBMS_OUTPUT.PUT_LINE('enc_val='||enc_val);

end;
Error report -
ORA-28234: key length too short
ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 3
ORA-06512: at "SYS.DBMS_CRYPTO", line 13
ORA-06512: at line 6
28234. 00000 -  "key length too short"
*Cause:    The key specified is too short for the algorithm. DES
           requires a key of at least 8 bytes. Triple DES requires a
           key of least 16 bytes in two-key mode and 24 bytes in three-key
           mode.
*Action:   Specify a longer key.
根据代码,应该是这样的:

DECLARE
 l_mod NUMBER;
 enc_val RAW(2000);
 KEY VARCHAR2(80) := 'rO0ABXVyAAJbQqzzF/gGCFTgAgAAeHAAAAAgGLCRnyhEZhzJJRd7EoVPp2XWTRgDNYHq4cAghvXvTaw=';

BEGIN
    l_mod:= DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_CBC+ DBMS_CRYPTO.AES_CBC_PKCS5;
    enc_val := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW('test',  'AL32UTF8'), l_mod, UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(KEY)) );
    DBMS_OUTPUT.PUT_LINE('enc_val = '||enc_val);

END;

无论何时,当您将随机字节视为文本时,您很可能会丢失信息。Base64编码(例如在其中一个答案中)是避免这种情况的一种方法(另一种明显的方法是根本不转换为文本)。