一个关于BCD压缩和单DES算法的问题,请高手赐教!

cnlaojie 2008-08-25 10:37:22
我有一个16位的数据,首先要进行BCD压缩成8位,仍然后再做单DES加密。我的代码如下:

private void but_login_Click(object sender, EventArgs e)
{
string str = "8B0E5C4A224B15B1";
if (str.Length % 2 == 1)
{
str = str + "0";
}
byte[] mybyte = new byte[str.Length / 2];
byte[] mytbt = Encoding.ASCII.GetBytes(str);

for (int i = 0; i < mytbt.Length; i = i + 2)
{
int a = mytbt[i] % 16;
int b = mytbt[i + 1] % 16;
mybyte[i / 2] = Convert.ToByte((((byte)a) << 4) + (((byte)b)));
}

byte[] test = HCDESHCDES(mybyte, Encoding.ASCII.GetBytes("1111111111111111"));
}



public byte[] HCDES(byte[] Key, byte[] Data)
{

//创建一个DES算法的加密类
DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
MyServiceProvider.Mode = CipherMode.CBC;
MyServiceProvider.Padding = PaddingMode.None;
ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key, new byte[8]);

//CryptoStream对象的作用是将数据流连接到加密转换的流
MemoryStream ms = new MemoryStream();
CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
//将字节数组中的数据写入到加密流中


MyCryptoStream.Write(Data, 0, Data.Length);
//关闭加密流对象
byte[] bEncRet = new byte[8];
// Array.Copy(ms.GetBuffer(), bEncRet, ms.Length);
bEncRet = ms.ToArray(); // MyCryptoStream关闭之前ms.Length 为8, 关闭之后为16

MyCryptoStream.FlushFinalBlock();
MyCryptoStream.Close();
byte[] bTmp = ms.ToArray();
ms.Close();
// return bEncRet;
return bTmp;//
}


1.压缩后的结果是:
mybyte {维数:[8]} byte[]
[0] 130 byte
[1] 5 byte
[2] 83 byte
[3] 65 byte
[4] 34 byte
[5] 66 byte
[6] 21 byte
[7] 33 byte

2.加密以后的结果是:
test {维数:[16]} byte[]
[0] 117 byte
[1] 106 byte
[2] 57 byte
[3] 6 byte
[4] 18 byte
[5] 97 byte
[6] 236 byte
[7] 116 byte
[8] 93 byte
[9] 226 byte
[10] 203 byte
[11] 52 byte
[12] 161 byte
[13] 12 byte
[14] 211 byte
[15] 207 byte


但是我用软件计算的结果是:F8E6027CAA34A909

请问:
1.我的压缩和3DES这样写对不对。
2.我要向吧byte的压缩结果变成F8E6027CAA34A909。要怎么做?

谢谢了,在线等!急!
...全文
275 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aayyoo163 2011-11-05
  • 打赏
  • 举报
回复
今天遇到同样的问题,用楼主的方法解决了,多谢lz分享。。。
cnlaojie 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackychai 的回复:]
没有看清楚,要求结果为F8E6027CAA34A909: 要加密的数据是什么,密钥是多少,到底是要做单des还是3des啊?
[/Quote]

要加密的数据是:1111111111111111
密钥是:8B0E5C4A224B15B1压缩成BCD
单DES
优途科技 2008-08-26
  • 打赏
  • 举报
回复
没有接触过。只能帮你顶了。
此木 2008-08-26
  • 打赏
  • 举报
回复
没有看清楚,要求结果为F8E6027CAA34A909: 要加密的数据是什么,密钥是多少,到底是要做单des还是3des啊?
cnlaojie 2008-08-26
  • 打赏
  • 举报
回复

解决了,终于解决了,感谢小狼。哈哈
/// <summary>
/// BCD转换
/// </summary>
/// <param name="hexString">转换字段</param>
/// <returns></returns>
public byte[] HexStringToByte(string hexString)
{
byte[] byteResult = new byte[hexString.Length / 2];
for (int i = 0; i < hexString.Length / 2; i++)
{
byteResult[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
return byteResult;


/// <summary>
/// DES加密
/// </summary>
/// <param name="sKey">密钥</param>
/// <param name="sDate">需要加密的数据</param>
/// <returns></returns>
public string DesEncrypt(string sKey, string sDate)
{
byte[] Key = HexStringToByte(sKey);
byte[] Data = HexStringToByte(sDate);
//创建一个DES算法的加密类
DESCryptoServiceProvider MyServiceProvider = new DESCryptoServiceProvider();
MyServiceProvider.Mode = CipherMode.CBC;
MyServiceProvider.Padding = PaddingMode.None;
ICryptoTransform MyTransform = MyServiceProvider.CreateEncryptor(Key, new byte[8]);

//CryptoStream对象的作用是将数据流连接到加密转换的流
MemoryStream ms = new MemoryStream();
CryptoStream MyCryptoStream = new CryptoStream(ms, MyTransform, CryptoStreamMode.Write);
//将字节数组中的数据写入到加密流中

MyCryptoStream.Write(Data, 0, Data.Length);
//关闭加密流对象
byte[] bEncRet = new byte[8];
// Array.Copy(ms.GetBuffer(), bEncRet, ms.Length);
bEncRet = ms.ToArray(); // MyCryptoStream关闭之前ms.Length 为8, 关闭之后为16

MyCryptoStream.FlushFinalBlock();
MyCryptoStream.Close();
byte[] bTmp = ms.ToArray();
ms.Close();

//转换成16进制
string sReturn = "";
for (int i = 0; i < bTmp.Length; i++)
{
sReturn = sReturn + AcceptConvertString(bTmp[i].ToString("D2"), 10, 16);
}
return sReturn;

}

/// <summary>
/// 进制转换函数
/// </summary>
/// <param name="value">需要转换的数据</param>
/// <param name="fromBase">转换前进制</param>
/// <param name="toBase">转换后进制</param>
/// <returns></returns>
public string AcceptConvertString(string value, int fromBase, int toBase)
{
int intValue = Convert.ToInt32(value, fromBase);

string S_ConvertString = Convert.ToString(intValue, toBase);
if (intValue < 10)
{
S_ConvertString = Convert.ToInt32(S_ConvertString).ToString("D2");
}
//
S_ConvertString = S_ConvertString.ToUpper();
return S_ConvertString;
}


调用:
string str = "8B0E5C4A224B15B1";
string test = encrypt.DesEncrypt(str, "1111111111111111");

结果:F8E6027CAA34A909
此木 2008-08-26
  • 打赏
  • 举报
回复
private byte[] stringToBCD(string strdata)
{
string str = strdata;
if (str.Length % 2 == 1)
{
str = str + "0";
}
byte[] mybyte = new byte[str.Length / 2];
byte[] mytbt = Encoding.ASCII.GetBytes(str);

for (int i = 0; i < mytbt.Length; i+=2 )
{
byte a = mytbt[i] ;
byte b = mytbt[i + 1] ;

if (a >= 97) a -= 97 + 10; //a
else if (a >= 65) a -= 65-10; //A
else if (a >= 48) a -= 48; //0

if (b >= 97) b -= 97 + 10; //a
else if (b >= 65) b -= 65-10; //A
else if (b >= 48) b -= 48; //0

mybyte[i / 2] = Convert.ToByte( (a << 4)+ b );
}
return mybyte;
}

private void but_login_Click()
{
byte[] result = stringToBCD("8B0E5C4A224B15B1");

byte[] test = HCDES(
stringToBCD("8B0E5C4A224B15B1"),
stringToBCD("1111111111111111")
//new byte[] { 0x8B, 0x0E, 0x5C, 0x4A, 0x22, 0x4B, 0x15, 0xB1 },
//new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
);
}
zhangxuyu1118 2008-08-26
  • 打赏
  • 举报
回复
mark
此木 2008-08-26
  • 打赏
  • 举报
回复
有分冒得,给点分撒。
修改如下:
private void but_login_Click(object sender, EventArgs e)
{
string str = "8B0E5C4A224B15B1";
if (str.Length % 2 == 1)
{
str = str + "0";
}
byte[] mybyte = new byte[str.Length / 2];
byte[] mytbt = Encoding.ASCII.GetBytes(str);

for (int i = 0; i < mytbt.Length; i = i + 2)
{
int a = mytbt[i] % 16;
int b = mytbt[i + 1] % 16;
mybyte[i / 2] = Convert.ToByte((((byte)a) < < 4) + (((byte)b)));
}

byte[] test = HCDES(
new byte[] { 0x8B, 0x0E, 0x5C, 0x4A, 0x22, 0x4B, 0x15, 0xB1 },
new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
); }
cnlaojie 2008-08-25
  • 打赏
  • 举报
回复
一天了,有人知道没。谢谢啊!
cnlaojie 2008-08-25
  • 打赏
  • 举报
回复
自己顶下!
cnlaojie 2008-08-25
  • 打赏
  • 举报
回复
有人知道吗?

110,539

社区成员

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

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

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