高分求助,采用C#实现以下加解密的方法
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
/**
* <desc>
* DES加解密操作对象.
* </desc>
*
* @createDate 2017-11-10
*/
public class DESEncoder {
//DES算法填充方式
public static final String ALGORITHM_DES = "DES/ECB/NoPadding";
public static void main(String[] args) throws Exception{
//项目公解密过程
String projectId = "00002345";
String encryptedPubKey = "8A53228E9B225225";
System.out.println("项目ID(key):" + projectId + " 项目密钥密文(data):" + encryptedPubKey);
String pubKey = DESEncoder.decode(projectId,encryptedPubKey);
System.out.println("解密得到项目密钥:" + pubKey);
//用户密钥生成过程
String userId = "123456";
System.out.println("项目密钥(key):" + pubKey + " 用户ID(data):" + userId);
String userKey = DESEncoder.encode(pubKey,userId);
System.out.println("加密得到用户密钥:" + userKey);
/*******************示例输出结果***********************:
项目ID(key):00002345 项目密钥密文(data):8A53228E9B225225
解密得到项目密钥:C1A1B0D0A1C2C6D5
用户ID(key):123456 项目密钥(data):C1A1B0D0A1C2C6D5
加密得到用户密钥:8BFE646AC2C36C5B
**********************************************************/
}
/**
* <desc>
* DES算法,加密.
* </desc>
*
* @param data 待加密的HEX字符串
* @param key 加密密钥,HEX字符串,长度不能够小于8位
* @return 加密字符串
* @author LewisLouis
* @createDate 2017-11-10
*/
public static String encode(String key, String data) throws Exception{
try{
//key的长度不能够小于8位字节
key = fillString(key,"0",16);
data = fillString(data,"0",16);
byte[] keyBytes = hexStrToBytes(key);
byte[] dataBytes = hexStrToBytes(data);
DESKeySpec dks = new DESKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(dataBytes);
return bytesToHexStr(encryptedBytes);
} catch (Exception e){
throw new Exception(e);
}
}
/**
* <desc>
* DES算法,解密.
* </desc>
*
* @param data 待解密的HEX字符串
* @param key 解密密钥,HEX字符串,长度不能够小于8位
* @return 解密后的字符串
* @throws Exception 异常
* @author LewisLouis
* @createDate 2017-11-10
*/
public static String decode(String key,String data) throws Exception{
//key的长度不能够小于8位字节
key = fillString(key,"0",16);
data = fillString(data,"0",16);
byte[] keyBytes = hexStrToBytes(key);
byte[] dataBytes = hexStrToBytes(data);
SecureRandom sr = new SecureRandom();
DESKeySpec dks = new DESKeySpec(keyBytes);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedBytes = cipher.doFinal(dataBytes);
return bytesToHexStr(decryptedBytes);
}
/**
* <desc>
* 把16进制字符串转换成字节数组.
* </desc>
*
* @param hex 待转换的Hex字符串
* @return 转换得到的byte数组
* @author LewisLouis
* @createDate 2017-11-10
*/
public static byte[] hexStrToBytes(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
for (int i = 0; i < len; i++) {
int pos = i * 2;
result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
}
return result;
}
/**
* <desc>
* 将单个十六进制字符转换为字节
* </desc>
*
* @param c 单个字符
* @return 转换得到的byte
* @author LewisLouis
* @createDate 2017-11-10
*/
private static byte toByte(char c) {
byte b = (byte) "0123456789ABCDEF".indexOf(c);
return b;
}
/**
* 把字节数组转换成16进制字符串
*
* @param bArray
* @return
*/
/**
* <desc>
* 把字节数组转换成16进制字符串.
* </desc>
*
* @param bArray 待转换的byte数组
* @return 转换得到的Hex字符串
* @author LewisLouis
* @createDate 2017-11-10
*/
public static String bytesToHexStr(byte[] bArray) {
if(bArray == null ){
return "";
}
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(0xFF & bArray[i]);
if (sTemp.length() < 2)
sb.append(0);
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
/**
* <desc>
* 自动后补齐字符串
* </desc>
*
* @param str 字符串
* @param supply 待填充的字符
* @param length 要求填充后达到的字符串总长度
* @return 填充后的字符串
* @author LewisLouis
* @createDate 2017-11-10
*/
public static String fillString(String str, String supply,int length) {
StringBuffer sb = new StringBuffer(str);
while (sb.length() < length) {
sb.append(supply);
}
return sb.toString();
}
}
相关推荐
优道PDF阅读控件
优道PDF控件 包中含有优道PDF阅读控件、开发使用帮助、VB.NET程序代码示例、PDF数据库文件加密解密读取示例。
二手车价格预测的工业级建模方法论:LightGBM与XGBoost双模型实战
二手车价格预测是典型的结构化回归问题,其核心挑战在于车况信息的非结构化、模糊性与业务强规则耦合。传统Kaggle式建模常忽略里程真实性、事故描述歧义、保养缺失等语义噪声,导致线上误差超30%。LightGBM与XGBoost凭借天然可解释性、对稀疏/类别特征的鲁棒处理能力,成为产业落地首选——前者加速高维特征迭代,后者强化业务逻辑建模,并通过SHAP实现风控可追溯。该方法已应用于B2B车商系统,在长尾车型、事故车识别、区域定价偏差等关键场景显著提升鲁棒性与可信度,是连接数据科学与二手车风控业务的典型工程范式
CTF竞赛入门指南:从零构建安全实验室与Web、逆向、密码学实战
网络安全竞赛(CTF)是理解计算机系统安全原理与实践的重要途径。其核心在于通过模拟攻防场景,深入理解软件漏洞、加密算法和系统底层的运作机制。从技术价值看,CTF训练能系统化提升问题拆解、逻辑推理和工程实践能力,尤其有助于培养以攻击者视角审视系统脆弱性的安全意识。在应用场景上,它不仅是安全研究员的练兵场,其锤炼出的技能对软件开发、系统运维等领域同样具有高迁移价值。本文聚焦CTF中的Web安全、逆向工程和密码学三大基础方向,详细介绍了如何从零搭建包含Kali Linux和VirtualBox的虚拟化安全实验室,
高校技术转移办公室人员在技术成果离校前,如何高效完成知识产权状态审核?.docx
高校技术转移办公室人员在技术成果离校前,如何高效完成知识产权状态审核?
论文复现基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化(Simulink仿真实现)
内容概要:本文围绕“基于变频与移相协同控制的全桥LLC变换器模式切换平滑性优化”开展研究,通过Simulink仿真实现对全桥LLC谐振变换器在不同工作模式间切换时动态性能的优化。研究复现了IEEE相关文献中的先进控制策略,重点解决传统控制方式下模式切换过程中易出现的电压电流冲击、效率下降及软开关丢失等问题。通过融合变频控制(Frequency Modulation)与移相控制(Phase Shift Control)的协同机制,实现了宽范围内的软开关维持与平滑过渡,有效提升了系统在负载突变或输入波动时的动态响应能力。文中详述了控制逻辑的设计思路、仿真模型的构建过程以及关键波形的对比分析,充分验证了该协同策略在降低开关损耗、抑制瞬态冲击和增强系统稳定性方面的优越性。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事高性能电源设计的工程技术人员,尤其适合具备一定电路拓扑分析能力和Simulink/MATLAB仿真基础的学习者。; 使用场景及目标:①深入理解全桥LLC变换器在不同负载条件下的工作模态及其切换机理;②掌握变频与移相结合控制策略的设计方法,为高效率、高可靠性DC-DC变换器的研发提供关键技术支撑;③用于支撑高水平学术论文复现、科研课题攻关或工业级电源产品的控制算法验证与优化。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注变频与移相控制的时序配合、模式切换逻辑及参数整定方法。通过对比传统单一控制与协同控制下的仿真结果,深入分析电压、电流及驱动信号的动态响应差异,从而掌握实现平滑切换的核心技术要点。同时可参考文中引用的LLC先进控制文献,进一步拓展对谐振变换器多模态控制的理解。


