[PB life extension 04] Borrow Oracle’s encryption and decryption to continue your life

[PB life extension 02] It feels a bit messy. Let’s sort it out and encapsulate an Oracle package. Put encryption and decryption together. The package name is BLM_CRYPTO.

1 Baotou

create or replace package blm_crypto is
/*
    -- Author: GROMS
    -- Created : 2023-10-20 17:24:25
    -- Purpose: Encryption and decryption toolkit
    
    --Public type declarations
    type <TypeName> is <Datatype>;
    
    --Public constant declarations
    <ConstantName> constant <Datatype> := <Value>;

    --Public variable declarations
    <VariableName> <Datatype>;

    --Public function and procedure declarations
    function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;
 */
 
 
    --MD5 encryption================================================ ================================
    function md5(plaintext varchar2) return varchar2;
    /*MD5() application example
    select blm_crypto.md5('5217') from dual
    --Result after encryption: 5A7B238BA0F6502E5D6BE14424B20DED
    */
    
    
    --Aes + Base64 encryption============================================== ==========================
    FUNCTION EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2) RETURN VARCHAR2;
    
    --Aes + Base64 decryption
    FUNCTION DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2) RETURN VARCHAR2;
    
    /*Aes application example, the key can only be 16 bits
    select blm_crypto.enaes64('白龙马5217','blma5217blma5217') from dual;
    --Encrypted result: mV4aaEnbaEllRvpH5WSiyw==
    select blm_crypto.deaes64('mV4aaEnbaEllRvpH5WSiyw==','blma5217blma5217') from dual;
    --Decrypted result: Bailongma 5217
    */
    
    --Aes192 encryption================================================ ==============================
    FUNCTION ENAES192( V_STR VARCHAR2 , V_KEY VARCHAR2) RETURN VARCHAR2;
       
    --Aes192 decryption
    FUNCTION DEAES192(V_STR VARCHAR2, V_KEY VARCHAR2) RETURN VARCHAR2;
    
    /*Aes192 application example, the key can only be 24 bits
    select blm_crypto.enaes192('白龙马5217','blma5217blma5217blma5217') from dual;
    --Encrypted result: 347F4960FA347FE45F91B97B72114F76
    select blm_crypto.deaes192('347F4960FA347FE45F91B97B72114F76','blma5217blma5217blma5217') from dual;
    --Decrypted result: Bailongma 5217
    */
    
    --DES encrypted string============================================ ==============================
     function ENDES_STRING(input8x in varchar2,key8x in varchar2) return varchar2;
     
     --DES decrypt string
     function DEDES_STRING(encrypted_str in varchar2,key8x in varchar2) return varchar2;
     
     /*DES application example, encrypt/decrypt string, the plaintext and key length of DES encryption and decryption algorithm must be a multiple of 8
      select blm_crypto.endes_string('BLMa5217','blma5217') from dual;
      --Encrypted result: D8BB696289F6177F
      select blm_crypto.dedes_string('D8BB696289F6177F','blma5217') from dual;
      --Decrypted result: BLMa5217
    */
    
     --DES encrypts RAW. RAW is a variable-length data type. When transmitted on different platforms, all binary information is transmitted. Even if the character sets are different, no conversion is required.
     function ENDES_RAW(input8x in varchar2,key8x in varchar2) return varchar2;
     
     --DES decrypt RAW
     function DEDES_RAW(encrypted_raw in varchar2,key8x in varchar2) return varchar2;
     
     /*DES application example, encrypt/decrypt RAW, the plaintext and key length of DES encryption and decryption algorithm must be a multiple of 8
      select blm_crypto.endes_raw('BLMa5217','blma5217') from dual;
      --Encrypted result: D8BB696289F6177F
      select blm_crypto.dedes_raw('D8BB696289F6177F','blma5217') from dual;
      --Decrypted result: BLMa5217
    */
     
    
end blm_crypto;

2 Package body

create or replace package body blm_crypto is
/*
  --Private type declarations
  type <TypeName> is <Datatype>;
  
  --Private constant declarations
  <ConstantName> constant <Datatype> := <Value>;

  --Private variable declarations
  <VariableName> <Datatype>;

  -- Function and procedure implementations
  function <FunctionName>(<Parameter> <Datatype>) return <Datatype> is
    <LocalVariable> <Datatype>;
  begin
    <Statement>;
    return(<Result>);
  end;
*/

    --MD5 encryption function
    function md5(plaintext varchar2) return varchar2
      as --md5 encryption function
   begin
      return utl_raw.cast_to_raw(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => plaintext));
   end;
   
    --Aes + Base64 encryption
    FUNCTION EnAes64(as_ysj IN VARCHAR2,as_key In Varchar2) RETURN VARCHAR2
    IS
       encrypted_raw RAW (2000); -- store encrypted bytes
       key_bytes_raw RAW (16); -- store the secret key 128 bits (16 bits)
       --The Aes encryption and decryption methods here are: AES/ECB/PKCS5Padding. You can freely combine them by yourself, such as: AES/ECB/PKCS5Padding, etc.
       encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
       iv_raw RAW (16); -- vector
    BEGIN
       -- Secret key
       key_bytes_raw := UTL_I18N.STRING_TO_RAW(as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
       -- vector
       iv_raw := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);

       -- Encryption process
       encrypted_raw := DBMS_CRYPTO.ENCRYPT
          (
             src => UTL_I18N.STRING_TO_RAW (as_ysj, 'AL32UTF8'),
             typ => encryption_type,
             key => key_bytes_raw,
             iv => iv_raw
          );

       -- Bas64 encryption, if you only need aes and no base64, just skip this step.
       encrypted_raw := utl_encode.base64_encode(r => encrypted_raw);

       return UTL_I18N.RAW_TO_CHAR (encrypted_raw, 'AL32UTF8');
    END;
      
    
    --Aes + Base64 decryption
    FUNCTION DeAes64(as_ysj IN VARCHAR2, as_key IN VARCHAR2) RETURN VARCHAR2
      IS
         decrypted_raw RAW (2000); -- store decrypted bytes
         key_bytes_raw RAW (16); -- store the secret key 128 bits (16 bits)
         --The Aes encryption and decryption methods here are: AES/ECB/PKCS5Padding. You can freely combine them by yourself, such as: AES/ECB/PKCS5Padding, etc.
         encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;
         iv_raw RAW (16); -- vector
         temp varchar2(1000); -- Temporary, the result of AES encryption and Base64
      BEGIN
         -- Secret key
         key_bytes_raw := UTL_I18N.STRING_TO_RAW( as_key,'AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
         -- vector
         iv_raw := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);

         --Convert the encrypted string to row
         decrypted_raw := utl_raw.cast_to_raw(c => as_ysj);

         --Base64 decryption, if the source string is only aes encrypted and not base64 encoded, just skip this step.
         decrypted_raw := utl_encode.base64_decode(r => decrypted_raw);

          -- Aes decryption
          decrypted_raw := DBMS_CRYPTO.DECRYPT
            (
               src => decrypted_raw,
               typ => encryption_type,
               key => key_bytes_raw,
               iv => iv_raw
            );
         temp := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
         RETURN temp;
      END;
            
     --Aes192 encryption, key is 24 bits
     FUNCTION ENAES192( V_STR VARCHAR2 , V_KEY VARCHAR2) RETURN VARCHAR2
      AS
          V_KEY_RAW RAW(24);
          V_STR_RAW RAW(2000);
          V_RETURN_STR VARCHAR2(2000);
          V_TYPE PLS_INTEGER;
      BEGIN
          V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;
          V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR,'UTF8') ;
          V_TYPE := DBMS_CRYPTO.ENCRYPT_AES192 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
          V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW, typ => V_TYPE, key => V_KEY_RAW);
          V_RETURN_STR := RAWTOHEX(V_STR_RAW);
          RETURN V_RETURN_STR;
      END;
            
     --Aes192 decryption, the key is 24 bits
     FUNCTION DEAES192(V_STR VARCHAR2, V_KEY VARCHAR2) RETURN VARCHAR2
      AS
          V_KEY_RAW RAW(24);
          V_STR_RAW RAW(2000);
          V_RETURN_STR VARCHAR2(2000);
          V_TYPE PLS_INTEGER;
      BEGIN
          V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY,'UTF8') ;
          V_STR_RAW := HEXTORAW(V_STR);
          V_TYPE := DBMS_CRYPTO.ENCRYPT_AES192 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
          V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW, typ => V_TYPE, key => V_KEY_RAW);
          V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW,'UTF8');
          RETURN V_RETURN_STR;
      END;

     --DES encrypted string
     function ENDES_STRING(input8x in varchar2,key8x in varchar2) return varchar2
      is
        RetuenResult varchar2(4000);
        encrypted_str VARCHAR2(4000);
      begin
        --The length of input_string and key_string must be a multiple of 8
        dbms_obfuscation_toolkit.desencrypt(input_string => input8x, key_string => key8x, encrypted_string => encrypted_str);
        RetuenResult := utl_raw.cast_to_raw(encrypted_str);
        return(RetuenResult);
      end;

     --DES decrypt string
     function DEDES_STRING(encrypted_str in varchar2,key8x in varchar2) return varchar2
      is
         -- encrypted_str is the return value of FN_ENDES_STRING()
         --The length of key_string must be a multiple of 8
         
         RetuenResult varchar2(4000);
         decrypted_str VARCHAR2(4000);
      begin
         dbms_obfuscation_toolkit.desdecrypt(
           input_string => utl_raw.cast_to_varchar2(encrypted_str),
           key_string => key8x,
           decrypted_string => decrypted_str);
         RetuenResult := decrypted_str;
         return(RetuenResult);
      end;
      
     
     --DES encrypted RAW,
     function ENDES_RAW(input8x in varchar2,key8x in varchar2) return varchar2
      is
      --The length of input8x and key8x must be a multiple of 8
        RetuenResult varchar2(4000);
        
        encrypted_raw RAW(4000);
      begin
        
        dbms_obfuscation_toolkit.desencrypt
           (input => utl_raw.cast_to_raw(input8x),
            key => utl_raw.cast_to_raw(key8x),
            encrypted_data => encrypted_raw);
        RetuenResult := rawtohex(encrypted_raw);
        return(RetuenResult);
      end ;
      
      --DES decrypt RAW
      function DEDES_RAW(encrypted_raw in varchar2,key8x in varchar2) return varchar2
        is
        -- encrypted_raw is the return value of FN_ENDES_RAW()
        --The length of key8x must be a multiple of 8
          RetuenResult varchar2(4000);
          decrypted_raw RAW(4000);
        begin
          
          dbms_obfuscation_toolkit.desdecrypt
             (input => encrypted_raw,
              key => utl_raw.cast_to_raw(key8x),
              decrypted_data => decrypted_raw);
          RetuenResult := utl_raw.cast_to_varchar2(decrypted_raw);
          return(RetuenResult);
        end ;

      
end blm_crypto;