Data encryption and decryption using PL/SQL

Data encryption is the one of the key feature for security. It can be used for several purposes. I used DBMS_CRYPTO package for this. DBMS_CRYPTO.ENCRYPT function requires the input to be RAW datatype. Also, it it requires a specific character set which is AL32UTF8. UTL_I18N.STRING_TO_RAW is used instead of UTL_RAW.CAST_TO_RAW. Because, you can also format the character set while casting.

DECLARE

    V_SECRETDATA VARCHAR2(100) := 'This is secret message';
    V_ENCRYPTED VARCHAR2(500);
    V_DECRYPTED VARCHAR2(500);
    
    FUNCTION ENCRYPT_DATA(P_DATA VARCHAR2, P_KEY VARCHAR2 DEFAULT '1234567890123456')
    RETURN VARCHAR2
    IS    
        V_ENCRYPTED_RAW RAW(2048);
        V_ENCRYPTION_TYPE  PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;     
    BEGIN

      V_ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT(SRC => UTL_I18N.STRING_TO_RAW(P_DATA, 'AL32UTF8'), 
                                             KEY => UTL_I18N.STRING_TO_RAW(P_KEY, 'AL32UTF8'),
                                             TYP => V_ENCRYPTION_TYPE);
      
      RETURN RAWTOHEX(V_ENCRYPTED_RAW);
                                             
    END;
    
    FUNCTION DECRYPT_DATA(P_DATA RAW, P_KEY VARCHAR2 DEFAULT '1234567890123456')
    RETURN VARCHAR2
    IS
        V_DECRYPTED_RAW RAW(2048);
        V_ENCRYPTION_TYPE  PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;       
    BEGIN
  
      V_DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT(SRC => HEXTORAW(P_DATA), 
                                             KEY => UTL_I18N.STRING_TO_RAW(P_KEY, 'AL32UTF8'),
                                             TYP => V_ENCRYPTION_TYPE
                                             );
      
      RETURN UTL_I18N.RAW_TO_CHAR(V_DECRYPTED_RAW);
               
    END; 

BEGIN

    DBMS_OUTPUT.PUT_LINE('TEXT: '||V_SECRETDATA);

    V_ENCRYPTED := ENCRYPT_DATA(P_DATA => V_SECRETDATA);

    DBMS_OUTPUT.PUT_LINE('ENCRYPTED DATA: '||V_ENCRYPTED);

    V_DECRYPTED :=DECRYPT_DATA(P_DATA => V_ENCRYPTED);

    DBMS_OUTPUT.PUT_LINE('DECREYPTED DATA: '||V_DECRYPTED);

END;

Output is showing below

TEXT: This is secret message
ENCRYPTED DATA: 0074D6E08B0E80F030C33D2A707032B2494929F674AE0BF054BCAB939E7330E8
DECREYPTED DATA: This is secret message
Leave a Reply

Your email address will not be published.