一个java的DES加解密类转换成C#

原文:一个java的DES加解密类转换成C#

一个java的des加密解密代码如下:

//package com.visionsky.util;

import java.security.*;
//import java.util.regex.Pattern;
//import java.util.Hashtable;
import javax.crypto.*;
import javax.crypto.spec.*;

import sun.misc.*;

/**
 * des加密解密
 */
public class DESPlus {
    private static String strDefaultKey = "PLFP"; //默认密钥

    private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef};//des 向量

    private static BASE64Encoder enc = new BASE64Encoder();//将byte[]转换成String

    private static BASE64Decoder dec = new BASE64Decoder(); //将String转换成byte[]

    /**
     * 加密字节数组
     *
     * @param arrB
     *            需加密的字节数组
     * @param key
     *            密钥
     * @return 加密后的字节数组
     * @throws Exception
     */
    public static byte[] encrypt(byte[] arrB, String key) throws Exception {
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv);

        Cipher encryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        encryptCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp);

        return encryptCipher.doFinal(arrB);
    }

    /**
     * 加密字符串
     *
     * @param xml
     *            需加密的字符串
     * @param key
     *            密钥
     * @return 加密后的字符串
     * @throws Exception
     */
    public static String encrypt(String xml, String key) throws Exception {
        //return DESPlus.enc.encode(encrypt(xml.getBytes(), key));
	return new String(encrypt(xml.getBytes(), key));
    }

    /**
     * 使用默认公钥加密字符串
     * @param xml 需加密的字符串
     * @return 加密后的字符串
     * @throws Exception
     */
    public static String encrypt(String xml) throws Exception {
        return encrypt(xml, strDefaultKey);
    }

    /**
     * 解密字节数组
     *
     * @param arrB
     *            需解密的字节数组
     * @param key
     *            密钥
     * @return 解密后的字节数组
     * @throws Exception
     */
    public static byte[] decrypt(byte[] arrB, String key) throws Exception {
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());

        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        IvParameterSpec ivp = new IvParameterSpec(DESPlus.iv);

        Cipher decryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        decryptCipher.init(Cipher.DECRYPT_MODE, secretKey, ivp);

        return decryptCipher.doFinal(arrB);
    }

    /**
     * 解密字符串
     *
     * @param xml
     *            需解密的字符串
     * @param key
     *            密钥
     * @return 解密后的字符串
     * @throws Exception
     */
    public static String decrypt(String xml, String key) throws Exception {
        return new String(decrypt(DESPlus.dec.decodeBuffer(xml), key));
    }

    /**
     * 使用默认公钥解密字符串
     * @param xml 需解密的字符串
     * @return 解密后的字符串
     * @throws Exception
     */
    public static String decrypt(String xml) throws Exception {
        return decrypt(xml, strDefaultKey);
    }

    /**
     * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位
     *
     * @param arrBTmp
     *            构成该字符串的字节数组
     * @return 生成的密钥
     * @throws java.lang.Exception
     */
    private Key getKey(byte[] arrBTmp) throws Exception {
        // 创建一个空的8位字节数组(默认值为0)
        byte[] arrB = new byte[8];

        // 将原始字节数组转换为8位
        for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }

        // 生成密钥
        Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");

        return key;
    }

    /**
     * 获取默认密钥
     * @return
     */
    public static String getDesKey() {
        return DESPlus.strDefaultKey;
    }

    public static void main(String[] args) {
        try {
            //测试密匙
            String key = "BOC_PLFP";
            //004交易案例
            String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><HEADER><TRANNO>004</TRANNO><BNKNO>17850</BNKNO><COMNO>COM01</COMNO><SN>1109141222222660161</SN></HEADER><BODY><TRANLOG><APPNO>0000000123</APPNO><NOTATION>客户信息不完整,请补充资料。</NOTATION></TRANLOG></BODY></ROOT>";

            System.out.println("密钥:" + key);
            System.out.println("加密前的字符串:" + xml);
            System.out.println("加密前的字符串长度:" + xml.getBytes().length);

            //加密
            xml = DESPlus.encrypt(xml, key);
            System.out.println("加密后的字符串:" + xml);
            System.out.println("加密后的字符串长度:" + xml.getBytes().length);

            //解密
            xml = DESPlus.decrypt(xml, key);
            System.out.println("解密后的字符串:" + xml);
            System.out.println("解密后的字符串长度:" + xml.getBytes().length);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上面运行结果为:

密钥:BOC_PLFP

加密前的字符串:<?xml version="1.0" encoding="UTF-8"?><ROOT><HEADER><TRANNO>004</TRANNO><BNKNO>17850</BNKNO><COMNO>COM01</COMNO><SN>1109141222222660161</SN></HEADER><BODY><TRANLOG><APPNO>0000000123</APPNO><NOTATION>客户信息不完整,请补充资料。</NOTATION></TRANLOG></BODY></ROOT>

加密前的字符串长度:262

加密后的字符串:bE5N44gjyfO3SdUs6/OhVg4I4l725S2vWcKBRxYOAd/eAnyuADKXeNNgVXJMj3aJJzndntv364rh

YW2bF33lmEABMU43HfS8DcXX7+QrcIjp3mrk7uJdiNHu4T4oHMeqetFZqU5oh2XY1sbBPPdGEgMf

/OguRVaTblzl/ylkFc6C9BNNSD0IwL0Ks7Mi73+V76P+aFdPgXQc7u4Vkq8Cd6+HgHErbHbJI729

JPJKM5L2YAAW4Q06oi4yMoEASDjYf7Aa1X/FWqclsZImSDB0okGOiuj857l94BM1zYl2RtWdXa9o

0beiL4CbEvKSC3U3PydAI0+mZbtE0sVkyP0sXTke7ifrwiMG

加密后的字符串长度:360

解密后的字符串:<?xml version="1.0" encoding="UTF-8"?><ROOT><HEADER><TRANNO>004</TRANNO><BNKNO>17850</BNKNO><COMNO>COM01</COMNO><SN>1109141222222660161</SN></HEADER><BODY><TRANLOG><APPNO>0000000123</APPNO><NOTATION>客户信息不完整,请补充资料。</NOTATION></TRANLOG></BODY></ROOT>

解密后的字符串长度:262

参考了http://www.lijingquan.net/des-c-php-java.html一文,修改里面的des向量iv,字符编码UTF8为Default等,最终

改写为C#代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

public class DES
{
    private const string defaultKey = "BOC_PLFP"; //默认密钥
    private static byte[] iv = { 0x12, 0x34, 0x56, 0x78, (byte)0x90, (byte)0xab, (byte)0xcd, (byte)0xef };//des 向量

    /// <summary>
    ///  des加密
    /// </summary>
    /// <param name="pToEncrypt">要加密的字符串。</param>
    /// <param name="sKey">密钥,且必须为8位。默认公钥加密字符串defaultKey</param>
    /// <returns>以Base64格式返回的加密字符串。</returns>
    public static string Encrypt(string pToEncrypt, string sKey = defaultKey)
    {
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = iv;  //ASCIIEncoding.ASCII.GetBytes(sKey);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                cs.Close();
            }
            string str = Convert.ToBase64String(ms.ToArray());
            ms.Close();
            return str;
        }
    }

    /// <summary>
    ///  des解密
    /// </summary>
    /// <param name="pToDecrypt">要解密的以Base64</param>
    /// <param name="sKey">密钥,且必须为8位。默认公钥解密字符串defaultKey</param>
    /// <returns>已解密的字符串。</returns>
    public static string Decrypt(string pToDecrypt, string sKey = defaultKey)
    {
        byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
        {
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
            des.IV = iv; // ASCIIEncoding.ASCII.GetBytes(sKey);
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                cs.FlushFinalBlock();
                cs.Close();
            }
            string str = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return str;
        }
    }
}

经测试,加密和解密的结果和java的一样。

时间: 2024-10-03 13:40:25

一个java的DES加解密类转换成C#的相关文章

DES加解密算法的简单实现

前几天刚写完一个简单的DES算法的实验,拿来作为第一次发到博客的随笔,填充一下空空如也的博客,献丑了 因为主要目的是Easy-To-Understand,再现一个直观的DES加解密的过程,所以很浪费地每一个数据位都用一个short整型存储,用来理ying解fu过zuo程ye就好(虽说DES这种对称加密算法十多年前就已经被淘汰了,现在一般建议用AES或者DES3 “1973 年,美国国家标准局(NBS)开始征集一种标准的数据加密标准算法(DES),以用于非机密性政府机构.商业部门和民间的对非机密的

DES加密解密类-java

import java.security.*; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * Copyright 2007 GuangZhou Cotel Co. Ltd. * All right reserved. * DES加密解密类. * @author <a

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

JAVA使用DES加密解密

在使用DES加密解密的时候,遇到了一些问题,廖记一下.如有哪位大神亲临留言指点,不胜感激. 先上代码: public DESUtil() { } //密码,长度要是8的倍数 注意此处为简单密码 简单应用 要求不高时可用此密码 /*DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究,后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,24小时内即可被破解.*/ private stati

DES加解密算法Qt实现

算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为bengold1979的网友表示感谢!本文是对DES算法代码一文代码的具体描述.该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 图片及部分解析来自 http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%9

JavaScript与C#互通的DES加解密算法

原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密,得到原始数据,以起到一定的保密作用.但基于算法本身和密钥保密程度方面的考虑,使用本算法加密后的数据,其保密程度不是很高,故请酌情使用. 声明:本文中的JavaScript版的DES加解密算法来自于互联网,但为了方便于转化成C#版本的代码,本人对其进行了细微调整. JavaScri

PHP 基础篇 - PHP 中 DES 加解密详解

一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符. 跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对.编码不一致或者加密解密模式没有对应上造成.常见的填充模式有: pkcs5.pkcs7.iso10126.ansix9

Java和PHP加解密

PHP代码 1 <?php 2 //DES加解密工具 3 class DesEncrypt { 4 var $key; 5 var $iv; 6 function DesEncrypt($key, $iv=0) { 7 $this->key = $key; 8 if($iv == 0){ 9 $this->iv = $key; 10 }else{ 11 $this->iv = $iv; 12 } 13 } 14 function encrypt($input) { 15 $size

PHP版3DES加解密类

<?php /** * * PHP版3DES加解密类 * * 可与java的3DES(DESede)加密方式兼容 * * @Author:蓝凤(ilanfeng.com) * * @version: V0.1 2011.02.18 * */ class Cc3des{ //加密的时候只用替换key就行了,ecb模式不需要提供iv值 public $key = "0123456789QWEQWEEWQQ1234"; public $iv = "33889955"