什么是dbms_obfuscation_toolkit.des3encrypt()的dbms_crypto.encrypt()?

发布于 2025-01-27 09:38:34 字数 1750 浏览 3 评论 0原文

我正在编辑一些包括dbms_obfuscation_toolkit参考的Oracle代码。我读到 dbms_obfuscation_toolkit软件包是de-support的我应该升级我的代码以使用dmbs_crypto。

我有这个代码...

dbms_obfuscation_toolkit.DES3Encrypt(
    input => UTL_I18N.STRING_TO_RAW(v_input,  'AL32UTF8'),
    key => UTL_I18N.STRING_TO_RAW(v_key,  'AL32UTF8'),
    encrypted_data => v_temp_raw
);
--039053190040155118183231113102022222017082162099111241054160152245207112101203096142122226097245
v_temp := UTL_RAW.CAST_TO_VARCHAR2(v_temp_raw);

...它期望长度为8的v_input可以在8时均匀地分辨,并产生96个字符结果(“ 039053 ...”)。

3DES“默认为2键实现”,在外部密码块链(CBC)模式中。但是,当我尝试编写dbms_crypto.encrypt()等效...

    --050127133161074179059208056044163133102098061207107114089045105193049199029095204025170130139068
    v_temp := UTL_RAW.CAST_TO_VARCHAR2(
            DBMS_Crypto.encrypt(
                src => UTL_I18N.STRING_TO_RAW(v_input,  'AL32UTF8'), -- Cleartext
                typ => DBMS_Crypto.ENCRYPT_3DES_2key + DBMS_Crypto.CHAIN_CBC + DBMS_Crypto.PAD_NONE,
                key => UTL_I18N.STRING_TO_RAW(v_key,  'AL32UTF8') -- Key
            )
        );

...我恢复了不同的96个字符结果(“ 050127 ...”)。

出于上述目的,v_input(“树摇摆到25mph的风!”)和v_key('Stackoverflow123456PSRV235KGNKNVEFHEF3404757543MNVOVCNVOVCNADNNC6579')是相同的。

要获得dbms_crypto.encrypt()获得相同的结果,我应该传递哪些参数? 什么是dbms_crypto.encrypt()等效的dbms_obfuscation_toolkit.des3encrypt()?

I am editing some Oracle code that includes DBMS_Obfuscation_Toolkit references. I read that the DBMS_Obfuscation_Toolkit package is de-supported as of Oracle 10.2, and that I should upgrade my code to instead be use DMBS_Crypto.

I have this code...

dbms_obfuscation_toolkit.DES3Encrypt(
    input => UTL_I18N.STRING_TO_RAW(v_input,  'AL32UTF8'),
    key => UTL_I18N.STRING_TO_RAW(v_key,  'AL32UTF8'),
    encrypted_data => v_temp_raw
);
--039053190040155118183231113102022222017082162099111241054160152245207112101203096142122226097245
v_temp := UTL_RAW.CAST_TO_VARCHAR2(v_temp_raw);

...which expects length v_input to be evenly-divisible by 8, and yields a 96 character result ("039053...").

The DBMS_Obfuscation_Toolkit documentation says that "Oracle's implementation of 3DES" defaults to the 2-key implementation, "in outer cipher-block-chaining (CBC) mode". But when I attempt to write a DBMS_Crypto.encrypt() equivalent...

    --050127133161074179059208056044163133102098061207107114089045105193049199029095204025170130139068
    v_temp := UTL_RAW.CAST_TO_VARCHAR2(
            DBMS_Crypto.encrypt(
                src => UTL_I18N.STRING_TO_RAW(v_input,  'AL32UTF8'), -- Cleartext
                typ => DBMS_Crypto.ENCRYPT_3DES_2key + DBMS_Crypto.CHAIN_CBC + DBMS_Crypto.PAD_NONE,
                key => UTL_I18N.STRING_TO_RAW(v_key,  'AL32UTF8') -- Key
            )
        );

...I get back a different 96 character result ("050127...").

For the purposes of above, v_input ('Trees sway into 25MPH winds! ') and v_key ('STACKOVERFLOW123456PSRV235KGNKNVEFHEF3404757543MNVOVCNALADNC6579') are the same.

To get the same result with DBMS_Crypto.encrypt(), what parameters should I be passing? What is the DBMS_Crypto.encrypt() equivalent of DBMS_Obfuscation_Toolkit.DES3Encrypt()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

反话 2025-02-03 09:38:34

您需要提供匹配的初始化向量(IV)。如果没有原始IV,请使用dbms_crypto.legacy_default_iv = 0123456789abcdef

declare
  v_input    char(32) := 
    'Trees sway into 25MPH winds! ';
  v_temp_raw raw(32);
  v_key      varchar2(64) := 
    'STACKOVERFLOW123456PSRV235KGNKNVEFHEF3404757543MNVOVCNALADNC6579';
begin
  sys.dbms_obfuscation_toolkit.DES3Encrypt(
    input => UTL_I18N.STRING_TO_RAW ( v_input, 'AL32UTF8' ),
    key => UTL_I18N.STRING_TO_RAW ( v_key, 'AL32UTF8' ),
    encrypted_data => v_temp_raw
  );
  dbms_output.put_line ( v_temp_raw );
  
  v_temp_raw :=  sys.DBMS_Crypto.encrypt (
    src => UTL_I18N.STRING_TO_RAW ( v_input ,  'AL32UTF8' ), 
    typ => DBMS_Crypto.ENCRYPT_3DES_2key + DBMS_Crypto.CHAIN_CBC + DBMS_Crypto.PAD_NONE,
    key => UTL_I18N.STRING_TO_RAW ( v_key ,  'AL32UTF8' ),
    iv  => hextoraw ( '0123456789ABCDEF' )
  );
  dbms_output.put_line ( v_temp_raw );
end;
/

2735BE289B76B7E7716616DE1152A2636FF136A098F5CF7065CB608E7AE261F5
2735BE289B76B7E7716616DE1152A2636FF136A098F5CF7065CB608E7AE261F5

You need to supply a matching initialization vector (IV). If there was no original IV, then use DBMS_CRYPTO.LEGACY_DEFAULT_IV = 0123456789ABCDEF:

declare
  v_input    char(32) := 
    'Trees sway into 25MPH winds! ';
  v_temp_raw raw(32);
  v_key      varchar2(64) := 
    'STACKOVERFLOW123456PSRV235KGNKNVEFHEF3404757543MNVOVCNALADNC6579';
begin
  sys.dbms_obfuscation_toolkit.DES3Encrypt(
    input => UTL_I18N.STRING_TO_RAW ( v_input, 'AL32UTF8' ),
    key => UTL_I18N.STRING_TO_RAW ( v_key, 'AL32UTF8' ),
    encrypted_data => v_temp_raw
  );
  dbms_output.put_line ( v_temp_raw );
  
  v_temp_raw :=  sys.DBMS_Crypto.encrypt (
    src => UTL_I18N.STRING_TO_RAW ( v_input ,  'AL32UTF8' ), 
    typ => DBMS_Crypto.ENCRYPT_3DES_2key + DBMS_Crypto.CHAIN_CBC + DBMS_Crypto.PAD_NONE,
    key => UTL_I18N.STRING_TO_RAW ( v_key ,  'AL32UTF8' ),
    iv  => hextoraw ( '0123456789ABCDEF' )
  );
  dbms_output.put_line ( v_temp_raw );
end;
/

2735BE289B76B7E7716616DE1152A2636FF136A098F5CF7065CB608E7AE261F5
2735BE289B76B7E7716616DE1152A2636FF136A098F5CF7065CB608E7AE261F5
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文