DECLARE
input_string VARCHAR2 (200) := 'PL/SQL是世界上最好的语言!'; -- 加密前字符串
output_string VARCHAR2 (200); -- 解密后字符串
encrypted_raw RAW (2000); -- 储存加密后的字节
decrypted_raw RAW (2000); -- 储存解密后的字节
num_key_bytes NUMBER := 128/8; -- 秘钥长度 128比特 (16位)
key_bytes_raw RAW (16); -- 储存秘钥 128比特 (16位)
encryption_type PLS_INTEGER := -- 加密方式 AES/CBC/PKCS5Padding
DBMS_CRYPTO.AES_CBC_PKCS5;
-- DBMS_CRYPTO.ENCRYPT_AES
-- + DBMS_CRYPTO.CHAIN_CBC
-- + DBMS_CRYPTO.PAD_PKCS5
iv_raw RAW (16); -- 向量
temp varchar2(1000); -- 临时,AES加密并Base64后的结果
BEGIN
DBMS_OUTPUT.PUT_LINE ( '原始字符串: ' || input_string);
-- 秘钥
key_bytes_raw := UTL_I18N.STRING_TO_RAW('abcdef0123456789','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
-- 向量
iv_raw := UTL_I18N.STRING_TO_RAW('9iuj87y2hbi5wxl1','AL32UTF8'); -- DBMS_CRYPTO.RANDOMBYTES (16);
-- 加密过程
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
-- Bas64 加密
encrypted_raw := utl_encode.base64_encode(r => encrypted_raw);
-- 密文
temp := utl_raw.cast_to_varchar2(r => encrypted_raw);
dbms_output.put_line(temp);
-- 密文
decrypted_raw := utl_raw.cast_to_raw(c => temp);
-- Base64 解密
decrypted_raw := utl_encode.base64_decode(r => decrypted_raw);
-- 解密解密
decrypted_raw := DBMS_CRYPTO.DECRYPT
(
src => decrypted_raw,
typ => encryption_type,
key => key_bytes_raw,
iv => iv_raw
);
--
output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE ('解密字符串: ' || output_string);
END;
Oracle 进行AES和Base64加解密
最新推荐文章于 2024-05-13 07:23:11 发布