参考博客:感谢大佬们共享
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);
}

1011

被折叠的 条评论
为什么被折叠?



