最近有个新项目用java做的,老项目是asp.net,接口传输需要des加解密,网上查了些资料,大多数不能拿来就用,自己经过调试加工了一下,具体代码如下:
密钥一定是8位
/// <summary>
/// 利用des加密算法加密字符串(可解密)
/// </summary>
/// <param name="ptoencrypt">被加密的字符串</param>
/// <param name="key">密钥(只支持8个字节的密钥)</param>
/// <returns>加密后的字符串</returns>
public static string desencode(string ptoencrypt, string key)
{
try
{
descryptoserviceprovider provider = new descryptoserviceprovider();
provider.key = encoding.ascii.getbytes(key.substring(0, 8));
provider.iv = encoding.ascii.getbytes(key.substring(0, 8));
byte[] bytes = encoding.getencoding("gb2312").getbytes(ptoencrypt);
memorystream stream = new memorystream();
cryptostream stream2 = new cryptostream(stream, provider.createencryptor(), cryptostreammode.write);
stream2.write(bytes, 0, bytes.length);
stream2.flushfinalblock();
stringbuilder builder = new stringbuilder();
foreach (byte num in stream.toarray())
{
builder.appendformat("{0:x2}", num);
}
stream.close();
return builder.tostring();
}
catch (exception) { return "xxxx"; }
}
/// <summary>
/// 解密
/// </summary>
/// <param name="plaintext">加密后的字符串</param>
/// <param name="key">密钥(只支持8个字节的密钥)</param>
/// <returns>解密后的字符串</returns>
public static string decode(string str, string key, string enclangue)
{
try
{
//str=ruijie.pcfg.utils.desencrypt.hextostring(str);
descryptoserviceprovider provider = new descryptoserviceprovider();
provider.key = encoding.ascii.getbytes(key.substring(0, 8));
provider.iv = encoding.ascii.getbytes(key.substring(0, 8));
byte[] buffer = new byte[str.length / 2];
for (int i = 0; i < (str.length / 2); i++)
{
int num2 = convert.toint32(str.substring(i * 2, 2), 0x10);
buffer[i] = (byte)num2;
}
memorystream stream = new memorystream();
cryptostream stream2 = new cryptostream(stream, provider.createdecryptor(), cryptostreammode.write);
stream2.write(buffer, 0, buffer.length);
stream2.flushfinalblock();
stream.close();
if (enclangue == "java")
{
return encoding.getencoding("utf-8").getstring(stream.toarray());
}
else
{
return encoding.getencoding("gb2312").getstring(stream.toarray());
}
}
catch (exception) { return ""; }
}
对应java的方法如下:
package com.testspring;
import javax.crypto.cipher;
import javax.crypto.secretkey;
import javax.crypto.secretkeyfactory;
import javax.crypto.spec.deskeyspec;
import javax.crypto.spec.ivparameterspec;
public class deshelper {
/**
* 加密
*
*
* **/
public string encrypt(string message,string key)
{
return tohexstring(encryptbyte(message,key)).touppercase();
}
/**
* 明文加密后的数组
*
*
* **/
public byte[] encryptbyte(string message, string key) {
byte[] s={};
try
{
cipher cipher = cipher.getinstance("des/cbc/pkcs5padding");
deskeyspec deskeyspec = new deskeyspec(key.getbytes("utf-8"));
secretkeyfactory keyfactory = secretkeyfactory.getinstance("des");
secretkey secretkey = keyfactory.generatesecret(deskeyspec);
ivparameterspec iv = new ivparameterspec(key.getbytes("utf-8"));
cipher.init(cipher.encrypt_mode, secretkey, iv);
return cipher.dofinal(message.getbytes("utf-8"));
}
catch (exception ex) {
}
return s;
}
/**
* 数组转化成16进制
*
*
* **/
public static string tohexstring(byte b[]) {
stringbuffer hexstring = new stringbuffer();
for (int i = 0; i < b.length; i++) {
string plaintext = integer.tohexstring(0xff & b[i]);
if (plaintext.length() < 2)
plaintext = "0" + plaintext;
hexstring.append(plaintext);
}
return hexstring.tostring();
}
/**
* 解密
*ciphertext 加密字符串,key 密钥,enclangue 加密语言
*
* **/
public string decrypt(string ciphertext, string key,string enclangue) {
try {
byte[] bytesrc = converthexstring(ciphertext);
cipher cipher = cipher.getinstance("des/cbc/pkcs5padding");
deskeyspec deskeyspec = new deskeyspec(key.getbytes("utf-8"));
secretkeyfactory keyfactory = secretkeyfactory.getinstance("des");
secretkey secretkey = keyfactory.generatesecret(deskeyspec);
ivparameterspec iv = new ivparameterspec(key.getbytes("utf-8"));
cipher.init(cipher.decrypt_mode, secretkey, iv);
byte[] retbyte = cipher.dofinal(bytesrc);
if(enclangue=="java")
{
return new string(retbyte,"utf-8");
}
else
{
return new string(retbyte);
}
}
catch (exception ex)
{
}
return "";
}
/**
* 转化16进制字符串为byte数组
*
* **/
public static byte[] converthexstring(string ss) {
byte digest[] = new byte[ss.length() / 2];
for (int i = 0; i < digest.length; i++) {
string bytestring = ss.substring(2 * i, 2 * i + 2);
int bytevalue = integer.parseint(bytestring, 16);
digest[i] = (byte) bytevalue;
}
return digest;
}
}
以上就是java与asp.net之间des加密和解密的示例详解的详细内容。