0 0

如何把下面的javaMAC校验码用c#实现0

package com.chinagpay.cgp.base.util;

import org.apache.log4j.Logger;

import com.chinagpay.cgp.base.service.Key;

public class MAC919desUtil {

private static final Logger logger = Logger.getLogger(MAC919desUtil.class);

/**
* macKey:mackey的密文(242D4FDB878DCA6A87DCA42022BF9D12),data:源数据,key:主密钥的密文(459807324AA7FCFC35C18961FB13ECDE)
*/
public String MAC(String mackey,String data,String key) {

byte[] primarykey = DesUtil.decrypt(key,"3535353535353535");  //des算法用8个5作为key解密主密钥
mackey = DesUtil.decrypt(mackey, primarykey); //用主密钥的明文解密mackey得到mackey的明文

data = CGPTool.StringToHexForDes(data); //数据转成十六进制

// 最后一组不组 16 补 0
String des = "";
try {
String[] datas = retData(data);// 将macdata 分数值,每组16位(8 byte())

for (int i = 0; i < datas.length; i++) {
if (i == 0) {
// 第一次只做DES加密
des = DesUtil.encrypt(datas[i],mackey.substring(0,16));
} else {
// 用上一次 DES加密结果对 第 i 组数据做异或
des = this.XOR(des, datas[i]);
// 对异或后的数据做DES加密
des = DesUtil.encrypt(des,mackey.substring(0,16));
}
}

// des 加密最终结果用mackey后16位解密
des = DesUtil.decrypt(des,mackey.substring(16));
// 解密后 再用mackey前16位加密
des = DesUtil.encrypt(des,mackey.substring(0,16));
} catch (Exception e) {
logger.error("MAC计算异常:",e);
}
return des;
}

/*
* 将macdata 进行分组 每 16 字符 8byte 一组
*/
public String[] retData(String data) {
int len = 0;
if (data.length() % 16 == 0) {
len = data.length() / 16;
} else {
len = (int)(data.length()/16) + 1;
}

String[] datas = new String[len];
for (int i = 0; i < datas.length; i++) {
if (data.length() >= 16) {
datas[i] = data.substring(0, 16);
data = data.substring(16);
} else {
datas[i] = this.moveRigZero(data, 16, "0");
break;
}
}
return datas;
}

// 右补 0
public String moveRigZero(String args, int len, String str) {
if (args.length() < len) {
while (args.length() < len) {
args = args + str;
}
}
return args;
}

/*
* 数据异或
*/
public String XOR(String str1, String str2) {
String hex = "";
if (str1.length() != str2.length()) {
logger.error("异或数据长度不等");
}
for (int i = 0; i < str1.length(); i++) {
hex = hex
+ Integer.toHexString((Integer.parseInt(
str1.charAt(i) + "", 16) ^ Integer.parseInt(str2
.charAt(i)
+ "", 16)));
}
return hex.toUpperCase();
}

}
2013年3月05日 15:38
目前还没有答案

相关推荐

    BouncyCastle.dll C#依赖工具,用作数据的加解密辅助类

    BouncyCastle.dll 是一个在C#环境中广泛使用的开源加密库,它为.NET Framework提供了一整套强大的加密功能。这个库是基于Bouncy Castle项目,这是一个跨平台的Java和.NET加密库,提供了各种加密算法、密码协议和PKI...

    超好资料bccrypto-csharp-1.8.6

    4. MAC(消息认证码):HMAC等,确保数据的完整性和来源的真实性。 5. PRNG(伪随机数生成器):为加密操作提供随机数。 6. TLS/SSL:用于网络通信的安全连接。 7. PKCS(公开密钥密码标准):如PKCS#7用于数据封装...

    rxtxserial.dll

    这个库不仅适用于Windows系统,还包括Linux、Mac OS X等其他操作系统,实现了真正的跨平台兼容性。 2. **串行通信基础**: 串行通信是一种数据传输方式,其中数据逐位按顺序发送。相对于并行通信,串行通信在单线上...

    所有平台usb转串口PL2303.rar

    在完成驱动安装后,系统会在设备管理器或端口设置中识别出一个新的串口,用户可以通过编程语言(如Python、C#、Java等)的串口库来访问这个端口,实现与串口设备的通信。 在压缩包"usb转串口PL2303"中,除了驱动...

    Unity项目开发过程经验摘要.pdf

    - 统一数据结构:通过策划定义的Excel表,一键导出Java、C#或Proto文件。标注公共数据、客户端专用和服务器专用参数,便于数据传输和处理。 - 减少客户端逻辑:避免客户端执行重要逻辑的条件判断和公式计算,最好...

    经典的加解密算法及demo(BASE64)

    4. **消息认证码**(MAC):结合了密钥和哈希函数,如HMAC(Hash-based Message Authentication Code),用于验证数据的完整性和来源。 **加密与BASE64的结合** 在实际应用中,为了在网络上传输加密后的数据,通常...

    实验2.zip

    许多编程语言(如Python、Java、C#)都提供了内置或第三方库来支持ZIP文件的操作。 综上所述,"实验2.zip"作为一个压缩包,其背后涉及了文件压缩技术、压缩格式标准、解压缩工具、安全策略以及在各种应用场景下的...

    .NET和Android中的加密和解密支持

    3. 对敏感数据进行完整性校验,如使用MAC或数字签名。 4. 定期更新密钥以防止长期使用的密钥被破解。 5. 在可能的情况下,使用非对称加密进行密钥交换,以增强安全性。 在实际项目中,可能还需要考虑性能、跨平台...

    4_1.zip

    6. **编程接口**:对于开发者,各种编程语言都有处理ZIP文件的库,如Python的`zipfile`,Java的`java.util.zip`,JavaScript的`adm-zip`,C#的`System.IO.Compression.ZipFile`等。这些库提供了创建、读取、写入和...

Global site tag (gtag.js) - Google Analytics