AES 加密解密,oracle 与 C#对应代码

参考博客:感谢大佬们共享

AES加密解密算法与C#实现实战-CSDN博客

oracle AES加密 和 java AES加密 C#加密解密互通的问题 - leolzi - 博客园

1. Oracle 端

1.1 通过system授权用户

grant execute on sys.dbms_crypto to myuser
grant execute on sys.UTL_I18N to myuser;

1.2 添加oracle加密和解密方法

--加密
CREATE OR REPLACE FUNCTION AES_ENCRYPT(
    P_INPUT VARCHAR2,
    --这里注意位数,128是16位key,256需要32位key
    P_KEY VARCHAR2:= '0123456789abcdef'
) RETURN varchar2 IS
 RAW_KEY RAW(32):= UTL_I18N.STRING_TO_RAW(p_key,'UTF8');
BEGIN
    RETURN
    RAWTOHEX
    (
         DBMS_CRYPTO.ENCRYPT
         (
              SRC =>UTL_I18N.STRING_TO_RAW( P_INPUT,'UTF8'),
              TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
              KEY => RAW_KEY,
              IV => RAW_KEY
         )                   
    );
END;

--解密
CREATE OR REPLACE FUNCTION AES_DECRYPT(
    P_INPUT VARCHAR2,
    P_KEY VARCHAR2:= '0123456789abcdef'
) RETURN VARCHAR2 IS
 RAW_KEY RAW(32):= UTL_I18N.STRING_TO_RAW(p_key,'UTF8');
BEGIN
    RETURN 
    UTL_I18N.RAW_TO_CHAR
    (
          DBMS_CRYPTO.DECRYPT
          (
            SRC => HEXTORAW(P_INPUT),
            TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5,
            KEY => RAW_KEY,
            IV => RAW_KEY
          )
    ,    
     'UTF8' 
     );
END;

1.3测试结果

select aes_encrypt('111aaaaaA?') from dual;
--结果:3F109D43C9097F52FD922BF3B74213A9

select aes_decrypt('3F109D43C9097F52FD922BF3B74213A9')from dual;
--结果:111aaaaaA?

2.c#代码

  /// <summary>
  ///  AES 加密
  /// </summary>
  /// <param name="str">明文</param>
  /// <param name="aesKey">密钥</param>
  /// <returns></returns>
  private static string Encrypt(string str, string aesKey)
  {
      if (!string.IsNullOrEmpty(str) && !string.IsNullOrEmpty(aesKey))
      {
          byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
          using (Aes aes = Aes.Create())
          {
              aes.Key = Encoding.UTF8.GetBytes(aesKey);
              aes.Mode = CipherMode.ECB;
              aes.Padding = PaddingMode.PKCS7;
              aes.BlockSize = 128;
              aes.IV = aes.Key;
              var cryptoTransform = aes.CreateEncryptor();
              var resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
              return ToHexStrFromBytes(resultArray);
          }
      }
      return null;
  }

  /// <summary>
  ///  AES 解密
  /// </summary>
  /// <param name="str">密文</param>
  /// <param name="aesKey">密钥</param>
  /// <returns></returns>
  private static string Decrypt(string str, string aesKey)
  {
      if (!string.IsNullOrEmpty(str) && !string.IsNullOrEmpty(aesKey))
      {
          byte[] toEncryptArray = ToBytesFromHexString(str);
          using (Aes aes = Aes.Create())
          {
              aes.Key = Encoding.UTF8.GetBytes(aesKey);
              aes.Mode = CipherMode.ECB;
              aes.Padding = PaddingMode.PKCS7;
              aes.BlockSize = 128;
              aes.IV = aes.Key;
              var cryptoTransform = aes.CreateDecryptor();
              byte[] resultArray = cryptoTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
              return Encoding.UTF8.GetString(resultArray);
          }
      }
      return null;
  }

  /// <summary>
  /// 字节数组转16进制格式字符串
  /// </summary>
  /// <param name="byteDatas">16进制字符串</param>
  /// <returns>16进制字符串</returns>
  private static string ToHexStrFromBytes(byte[] byteDatas)
  {
      StringBuilder builder = new StringBuilder();
      for (int i = 0; i < byteDatas.Length; i++)
      {
          builder.Append(byteDatas[i].ToString("X2"));
      }
      return builder.ToString().Trim();
  }

  /// <summary>
  /// 16进制格式字符串转字节数组
  /// </summary>
  /// <param name="hexString">16进制字符串</param>
  /// <returns>16进制字符串对应的字节数组</returns>
  private static byte[] ToBytesFromHexString(string hexString)
  {
      hexString = hexString.Replace(" ", "");
      if ((hexString.Length % 2) != 0)
      {
          hexString += " ";
      }
      byte[] returnBytes = new byte[hexString.Length / 2];
      for (int i = 0; i < returnBytes.Length; i++)
      {
          returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
      }
      return returnBytes;
  }


        //测试结果
        static void Main()
        {

            string key = "0123456789abcdef";
            var res = Encrypt("111aaaaaA?", key);
            //3F109D43C9097F52FD922BF3B74213A9
            res = Decrypt("3F109D43C9097F52FD922BF3B74213A9", key);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三项超标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值