C#DES加密怎么设置KEY长度为64位?

空白桑 2018-08-23 04:51:36
最近在开发某个支付的接口
需要将报文通过des加密后POST传过去
和那边技术沟通说需要设置des的key长度为64个字符
但是网上找了找 C#des加密长度最多只能8位 而Java可以设置64位
这是那边给的Java的方法
private static  String  CHATSET="UTF-8" ;
//加密
public static String desEncrypt(String input, String keystr) throws Exception {

try {
byte[] datasource = input.getBytes(CHATSET);
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(keystr.getBytes((CHATSET)));
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在,获取数据并加密
//正式执行加密操作
return new sun.misc.BASE64Encoder().encode(cipher.doFinal(datasource)) ;
} catch (Throwable e) {
e.printStackTrace();
}
return null;

}


求问 这可咋整 ?
...全文
782 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
IEEE_China 2018-08-23
  • 打赏
  • 举报
回复

没时间看了,下面是百度的代码,你自己验证对错吧

C#代码:
using System.Security.Cryptography;
using System.IO;
// des加密函数
public string Encrypt(string pToEncrypt, string sKey)
{
// 创建des加密没
using (DESCryptoServiceProvider des = newDESCryptoServiceProvider())
{
// 得到UTF-8的数据源
byte[] inputByteArray =Encoding.UTF8.GetBytes(pToEncrypt);
// 设置key和iv密钥
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
//由于java是使用默认加密模式,C#默认是CBC,需要修改为ECB
des.Mode =CipherMode.ECB;
// 创建数据流并进行加密
MemoryStream ms = new MemoryStream();
using (CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
// 关闭数据流
ms.Close();
return Convert.ToBase64String(ms.ToArray());
}
}

空白桑 2018-08-23
  • 打赏
  • 举报
回复
引用 5 楼 Seilboy 的回复:
这是网上收到的资料
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 key as the key material for the DES key.
DESKeySpec(byte[] key, int offset)
Creates a DESKeySpec object using the first 8 bytes in key, beginning at offset inclusive, as the key material for the DES key.


可以看出看上去是他源码也是只取前八位处理的,你加密结果不一致可能是编码方式/填充方式的问题,不是秘钥问题

OK 我再检查下
token不能为空 2018-08-23
  • 打赏
  • 举报
回复
这是网上收到的资料
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 key as the key material for the DES key.
DESKeySpec(byte[] key, int offset)
Creates a DESKeySpec object using the first 8 bytes in key, beginning at offset inclusive, as the key material for the DES key.


可以看出看上去是他源码也是只取前八位处理的,你加密结果不一致可能是编码方式/填充方式的问题,不是秘钥问题
空白桑 2018-08-23
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
DES只能8位,3DES才是16或者24位
你的KeyString发出来看下呢

32位字符串 如 "jkdls3opjs0dpa8spzqertjxqwl9zkdw"后面再补32位的固定字符串"KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK"
"jkdls3opjs0dpa8spzqertjxqwl9zkdwKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK" 这样子
  • 打赏
  • 举报
回复
DES只能8位,3DES才是16或者24位
你的KeyString发出来看下呢
空白桑 2018-08-23
  • 打赏
  • 举报
回复
引用 1 楼 Seilboy 的回复:
截断了取前八位试试

结果不匹配 , 那边是让在32位秘钥的基础上再补32位固定的字符串 再进行加密 。。。
token不能为空 2018-08-23
  • 打赏
  • 举报
回复
截断了取前八位试试

110,539

社区成员

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

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

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