DES加密算法javac#

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DES加密算法javac#
项⽬中⽤到的数据加密⽅式是ECB模式的DES加密得到的⼗六进制字符串。

技术⽀持让写⼀个.net版的加密算法。

这⾥做⼀下记录。

java版:
16进制使⽤的是bouncycastle。

import com.emaxcard.codec.CodecException;
import com.emaxcard.codec.Hex;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class DESEncrypt {
public static String encodeECB(String src, String key) throws CodecException {
try {
SecretKey deskey = new SecretKeySpec(key.getBytes("UTF-8"), "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] cipherInfo = cipher.doFinal(src.getBytes("UTF-8"));
System.out.println("cipherInfo:"+new BASE64Encoder().encode(cipherInfo));
return Hex.encode(cipherInfo);
} catch (Exception var5) {
throw new CodecException(var5);
}
}
public static String decodeECB(String src, String key) throws CodecException {
try {
SecretKey deskey = new SecretKeySpec(key.getBytes("UTF-8"), "DESede");
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, deskey);
byte[] decodeRes = cipher.doFinal(Hex.decode(src));
return new String(decodeRes, "UTF-8");
} catch (Exception var5) {
throw new CodecException(var5);
}
}
}
public class Hex {
public Hex() {
}
public static byte[] decode(String data) throws CodecException {
try {
return org.bouncycastle.util.encoders.Hex.decode(data);
} catch (Exception var2) {
throw new CodecException(var2.getMessage(), var2);
}
}
public static String encode(byte[] data) {
return new String(org.bouncycastle.util.encoders.Hex.encode(data));
}
public static void main(String[] args) throws CodecException {
System.out.println(encode("a张y".getBytes()));
System.out.println(new String(decode("")));
}
}
.net(c#)版:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApplication1
{
class DESEncrypt
{
public static string encodeECB(string encryptString, String key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] keyIV = keyBytes;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
//return Convert.ToBase64String(mStream.ToArray());
return Hex.encode(mStream.ToArray());
}
public static string DesDecrypt(string decryptString, String key)
{
byte[] keyBytes = Encoding.UTF8.GetBytes(key.Substring(0, 8));
byte[] keyIV = keyBytes;
//byte[] inputByteArray = Convert.FromBase64String(decryptString);
byte[] inputByteArray = Hex.decode(decryptString);
DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
provider.Mode = CipherMode.ECB;
provider.Padding = PaddingMode.PKCS7;
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write); cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
}
}
using System;
using System.Globalization;
using System.Text;
namespace ConsoleApplication1
{
sealed class Hex
{
public static byte[] decode(String mHex)
{
mHex = mHex.Replace("", "");
if (mHex.Length <= 0) return null;
byte[] vBytes = new byte[mHex.Length / 2];
for (int i = 0; i < mHex.Length; i += 2)
if (!byte.TryParse(mHex.Substring(i, 2), NumberStyles.HexNumber, null, out vBytes[i / 2]))
vBytes[i / 2] = 0;
return vBytes;
}
public static String encode(byte[] data)
{
//** 以下两种⽅式都可以
//⽅式1
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
hexString.AppendFormat("{0:x2}", data[i]); //System.Convert.ToString(data[i], 16);
}
return hexString.ToString();
//⽅式2
//return BitConverter.ToString(data).Replace("-", "").ToLower();
}
}
}
BitConverter.ToString⽅法签名:
//
// 摘要:
// 将指定的字节数组的每个元素的数值转换为它的等效⼗六进制字符串表⽰形式。

//
// 参数:
// value:
// 字节数组。

//
// 返回结果:
// 由以连字符分隔的⼗六进制对构成的字符串,其中每⼀对表⽰ value 中对应的元素;例如“7F-2C-4A”。

//
// 异常:
// System.ArgumentNullException:
// value 为 null。

public static string ToString(byte[] value);
关于DES
DES是⼀种对称加密算法,所谓对称加密算法即:加密和解密使⽤相同密钥的算法。

与之对应的是⾮对称加密算法,例如RSA,RSA是⼀组密钥对,使⽤公钥加密、私钥解密。

des加密算法有如下⼏个要素:
1. DES加密模式:这⾥选ECB
2. 填充:java是pkcs5padding,.net是pkcs7padding。

⽹上说PKCS5Padding与PKCS7Padding基本上是可以通⽤的。

3. 字符集:默认是使⽤环境的,不过可能会有潜在的坑,因为不同环境的编码会不⼀样。

所以程序最好显式指定,⽐如:utf-8/gb2312
4. 输出:、hex。

由于加密算法加密后得到的密⽂是8位的字节数组(Byte[ ]),所以需要做编码转换为字符串进⾏输出。

5. 密码/Key:8个字符(共64位)------java要求传24个字符,不过加密也是截取的前8位,jdk1.8下可参见jce.jar⾥
DESKeySpec.class:25。

6. 待加密/解密的⽂本
注意:当DES加密使⽤的key与解密使⽤的key不⼀样时,会报这个异常。

javax.crypto.BadPaddingException: Given final block not properly padded
at com.emaxcard.codec.Desede.decodeECB(Desede.java:151)。

相关文档
最新文档