我有一个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 byte2.加密以后的结果是:
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。要怎么做?谢谢了,在线等!急!
{
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 byte2.加密以后的结果是:
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。要怎么做?谢谢了,在线等!急!
解决方案 »
- 请求C# 里,我在Form1窗口里建了一个public void All_Rf() ,我如何Form2里运用All_Rf()这事件?
- 命令行中路径带空格问题
- 急,关于C#,如何将多维数据表转换成单维数据表?
- winform 读取txt文件内容
- 如何让DataGridView的列变成combobox
- 请教:label的值没有更新是什么原因啊
- [大文件中查找字符串],我的C#代码比同事的C++慢5倍左右……郁闷
- 当鼠标划过gridview的行时,该行的字体能够变色,因为是超链接列,所以还要显示下划线,当鼠标离开是字体颜色恢复并看不见下划线,请大家
- 急急急!!! webform画图c#, 动态显示液面变化
- 屏幕截图,根据文字定位或者颜色坐标!!!!!!
- 定时统计(删除)过期文件的问题
- 请问如何在注册表中设定桌面的背景颜色,或在程序中修改
要加密的数据是:1111111111111111
密钥是:8B0E5C4A224B15B1压缩成BCD
单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 = HCDES(
new byte[] { 0x8B, 0x0E, 0x5C, 0x4A, 0x22, 0x4B, 0x15, 0xB1 },
new byte[] { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }
); }
{
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 }
);
}
解决了,终于解决了,感谢小狼。哈哈
/// <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