C# 3DES加密与oracle 3DES加密结果比较

yjl49 2009-12-29 03:27:57
使用C#和oracle对同一字符串进行3DES加密为什么结果不同(key相同)?
对"aaaaaaaa"进行加密得到的结果分别如下:

C#结果为: N0p5hwmlyn+dQUWEbvwkiHl960iEfyAd
oracle结果为: F5ACE5DCAE43F640

C#程序:

public static string Encrypt3DES(string a_strString, string a_strKey)
{
try
{
byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(a_strString);
PasswordDeriveBytes pdb = new PasswordDeriveBytes(a_strKey, null);
byte[] key = pdb.GetBytes(24);
byte[] iv = pdb.GetBytes(8);
MemoryStream ms = new MemoryStream();
TripleDESCryptoServiceProvider tdesc = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(ms, tdesc.CreateEncryptor(key, iv), CryptoStreamMode.Write);
cs.Write(bt, 0, bt.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
throw ex;
}
}


oracle 存储过程:

FUNCTION Encrypt_3key_Mode
(
Ivalue IN VARCHAR2,
Imode IN PLS_INTEGER
) RETURN RAW AS
Vencrypted VARCHAR2(4000);
Vencryptedraw RAW(2048);
Rawkey RAW(240) := '';
BEGIN
Rawkey := Gen_Raw_Key(Ikey); -- encrypt input string
Vencrypted := Dbms_Obfuscation_Toolkit.Des3encrypt(Formatstr(Ivalue),
Key_String => Rawkey,
Which => Imode);
-- convert to raw as out
Vencryptedraw := Utl_Raw.Cast_To_Raw(Vencrypted);
RETURN Vencryptedraw;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END Encrypt_3key_Mode;



为什么会得到这样的结果?是不是因为编码方式有问题?
...全文
314 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjq 2009-12-29
  • 打赏
  • 举报
回复
既然oracle不能改,那么就改C#代码……

(new System.Text.UnicodeEncoding())改成System.Text.Encoding.GetEncoding("gbk")
yjl49 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wjq 的回复:]
你C#把结果还去ToBase64String~那能一样么?

另外,先确定Oracle里的编码你也选为了标准的Unicode。
把return Convert.ToBase64String(ms.ToArray());
改成
byte[] outbuffer=ms.ToArray();
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < outbuffer.Length; i++)
                {
                    sb.Append(outbuffer[i].ToString("X2"));
                }
                return sb.ToString();

[/Quote]
oracle 的编码方式前面已经说过了为ZHS16GBK,这不是我说改就能改的。另:我也试过把byte数组转为16进制字符串这种方式,结果仍旧不同。问题应该不在这里。
wjq 2009-12-29
  • 打赏
  • 举报
回复
你C#把结果还去ToBase64String~那能一样么?

另外,先确定Oracle里的编码你也选为了标准的Unicode。
把return Convert.ToBase64String(ms.ToArray());
改成
byte[] outbuffer=ms.ToArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < outbuffer.Length; i++)
{
sb.Append(outbuffer[i].ToString("X2"));
}
return sb.ToString();
thinkc 2009-12-29
  • 打赏
  • 举报
回复
帮顶
yjl49 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 caozhy 的回复:]
直接对byte编码。
[/Quote]
能讲得更详细些么?
yjl49 2009-12-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 vrhero 的回复:]
GB2312...简体中文系统直接用System.Text.Encoding.Default,或者通用的System.Text.Encoding.GetEncoding("GB2312")...
[/Quote]
我试了下
gb2312
default
utf8
ascii
这几种,得到的结果都一样,看来问题不在这一块。
vrhero 2009-12-29
  • 打赏
  • 举报
回复
GB2312...简体中文系统直接用System.Text.Encoding.Default,或者通用的System.Text.Encoding.GetEncoding("GB2312")...
yjl49 2009-12-29
  • 打赏
  • 举报
回复
我查了下,oracle 中用的是ZHS16GBK,C#有与之对应的编码格式么?
数据之巅 2009-12-29
  • 打赏
  • 举报
回复
看样子又好像有可能是编码格式的问题。。。。
threenewbee 2009-12-29
  • 打赏
  • 举报
回复
直接对byte编码。
vrhero 2009-12-29
  • 打赏
  • 举报
回复
byte[] bt = (new System.Text.UnicodeEncoding()).GetBytes(a_strString);
-----------
改成...

byte[] bt = System.Text.Encoding.Default.GetBytes(a_strString);

试试吧,不要乱设置字符编码...先去看看Oracle服务器的字符集设置,再看看Oracle客户端的字符集设置,最后在程序里选择匹配的字符编码...

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧