加密解密 DES(200分)

  • 主题发起人 主题发起人 Neromancer
  • 开始时间 开始时间
N

Neromancer

Unregistered / Unconfirmed
GUEST, unregistred user!
最近需要与WebService(.net写的)交互
一些数据需要加密,双方约定好使用1DES 8 byte Blocksize 8 byte Keysize 56 bits relevant

问题出现了: 双方各自加密解密都很愉快,但对同一字符串使用同一KEY加密后得到的密文不同。这样即使将密文传输过去对方也不会正确的解密。 现在搞不清到底哪一边加密出了问题。
希望大家有标准1DES加密验证工具的发一份或提供一个地址。
测试数据如下
data:source
key:20061120
 
加密后的串是这个吗? E0DCD9D28EE33DCF
我也不知道这段代码是不是你要的,放上来给你看看(C#的,翻译成Delphi也比较快):
//加密方法
public string Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
//把字符串放到byte数组中
//原来使用的UTF8编码,我改成Unicode编码了,不行
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt)


//建立加密对象的密钥和偏移量
//原文使用ASCIIEncoding.ASCII方法的GetBytes方法
//使得输入密码必须输入英文文本
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey)

des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(),CryptoStreamMode.Write);
//Write the byte array into the crypto stream
//(It will end up in the memory stream)
cs.Write(inputByteArray, 0, inputByteArray.Length)

cs.FlushFinalBlock();
//Get the data back from the memory stream, and into a string
StringBuilder ret = new StringBuilder();
foreach(byte b in ms.ToArray())
{
//Format as hex
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}

//解密方法
public string Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();

//Put the input string into the byte array
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for(int x = 0
x < pToDecrypt.Length / 2
x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}

//建立加密对象的密钥和偏移量,此值重要,不能修改
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey)

MemoryStream ms = new MemoryStream()

CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(),CryptoStreamMode.Write)

//Flush the data through the crypto stream into the memory stream
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();

//Get the decrypted data back from the memory stream
//建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
StringBuilder ret = new StringBuilder();

return System.Text.Encoding.Default.GetString(ms.ToArray());
}
 
我加密出来是:08470FCFF835697E
 
我这里是{{128},{116},{176},{252},{75},{171},{6},{249}}

to 木桩: 你的结果与我这里.net那边的结果是相同的。
DESCryptoServiceProvider()
这个如果可以方便的改写拿大概就不会出现这个问题了。

to liuying1129 : 又一种答案
 
后退
顶部