JavaDes传入Key长度不定 因此C#Des key长度(8)就有可能与java传入key长度不等 在java加密 C#解密的项目中就会有问题
因此查看Java文档 对加密类参数Key的解释
地址:https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/DESKeySpec.html
DESKeySpec(byte[] key) Creates a DESKeySpec object using the first 8 bytes in |
DESKeySpec(byte[] key, int offset) Creates a DESKeySpec object using the first 8 bytes in |
得知实际参与加密的字节也是只有8bytes
因此在C#解密中对长字符串Key设置前需要转化为byte数组后截取前8位
并且由于java使用模式默认位ECB模式 因此在C#中需要设置
ECB模式默认可不使用VI偏移量 因此可以不加
具体如下:
/// <summary>
/// 加密
/// </summary>
/// <param name="inEncrypt"></param>
/// <returns></returns>
static string Encrypt(byte[] inEncrypt)
{
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(token).Skip(0).Take(8).ToArray();
des.Mode = CipherMode.ECB;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inEncrypt, 0, inEncrypt.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="outEncrypt"></param>
/// <returns></returns>
static string Decrypt(byte[] outEncrypt)
{
try
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(token).Skip(0).Take(8).ToArray();
des.Mode = CipherMode.ECB;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(outEncrypt, 0, outEncrypt.Length);
cs.FlushFinalBlock();
return Encoding.UTF8.GetString(ms.ToArray());
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}