C#加密Java解密

Python013

C#加密Java解密,第1张

DES加密 java与 C# 可以相互加密解密

这里的KEY采用Base64编码,便用分发,因为Java的Byte范围为-128至127,c#的Byte范围是0-255

核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章

一个是C#采用CBC Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding,

另一个是C#采用ECB Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding Padding,

Java的ECB模式不需要IV

对字符加密时,双方采用的都是UTF-8编码

C# 代码

/// <summary>

/// DES3加密解密

/// </summary>

public class Des3

{

#region CBC模式**

/// <summary>

/// DES3 CBC模式加密

/// </summary>

/// <param name="key">密钥</param>

/// <param name="iv">IV</param>

/// <param name="data">明文的byte数组</param>

/// <returns>密文的byte数组</returns>

public static byte[] Des3EncodeCBC( byte[] key, byte[] iv, byte[] data )

{

//复制于MSDN

try

{

// Create a MemoryStream.

MemoryStream mStream = new MemoryStream()

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider()

tdsp.Mode = CipherMode.CBC//默认值

tdsp.Padding = PaddingMode.PKCS7 //默认值

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream cStream = new CryptoStream( mStream,

tdsp.CreateEncryptor( key, iv ),

CryptoStreamMode.Write )

// Write the byte array to the crypto stream and flush it.

cStream.Write( data, 0, data.Length )

cStream.FlushFinalBlock()

// Get an array of bytes from the

// MemoryStream that holds the

// encrypted data.

byte[] ret = mStream.ToArray()

// Close the streams.

cStream.Close()

mStream.Close()

// Return the encrypted buffer.

return ret

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message )

return null

}

}

/// <summary>

/// DES3 CBC模式解密

/// </summary>

/// <param name="key">密钥</param>

/// <param name="iv">IV</param>

/// <param name="data">密文的byte数组</param>

/// <returns>明文的byte数组</returns>

public static byte[] Des3DecodeCBC( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a new MemoryStream using the passed

// array of encrypted data.

MemoryStream msDecrypt = new MemoryStream( data )

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider()

tdsp.Mode = CipherMode.CBC

tdsp.Padding = PaddingMode.PKCS7

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream csDecrypt = new CryptoStream( msDecrypt,

tdsp.CreateDecryptor( key, iv ),

CryptoStreamMode.Read )

// Create buffer to hold the decrypted data.

byte[] fromEncrypt = new byte[data.Length]

// Read the decrypted data out of the crypto stream

// and place it into the temporary buffer.

csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length )

//Convert the buffer into a string and return it.

return fromEncrypt

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message )

return null

}

}

#endregion

#region ECB模式

/// <summary>

/// DES3 ECB模式加密

/// </summary>

/// <param name="key">密钥</param>

/// <param name="iv">IV(当模式为ECB时,IV无用)</param>

/// <param name="str">明文的byte数组</param>

/// <returns>密文的byte数组</returns>

public static byte[] Des3EncodeECB( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a MemoryStream.

MemoryStream mStream = new MemoryStream()

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider()

tdsp.Mode = CipherMode.ECB

tdsp.Padding = PaddingMode.PKCS7

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream cStream = new CryptoStream( mStream,

tdsp.CreateEncryptor( key, iv ),

CryptoStreamMode.Write )

// Write the byte array to the crypto stream and flush it.

cStream.Write( data, 0, data.Length )

cStream.FlushFinalBlock()

// Get an array of bytes from the

// MemoryStream that holds the

// encrypted data.

byte[] ret = mStream.ToArray()

// Close the streams.

cStream.Close()

mStream.Close()

// Return the encrypted buffer.

return ret

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message )

return null

}

}

/// <summary>

/// DES3 ECB模式解密

/// </summary>

/// <param name="key">密钥</param>

/// <param name="iv">IV(当模式为ECB时,IV无用)</param>

/// <param name="str">密文的byte数组</param>

/// <returns>明文的byte数组</returns>

public static byte[] Des3DecodeECB( byte[] key, byte[] iv, byte[] data )

{

try

{

// Create a new MemoryStream using the passed

// array of encrypted data.

MemoryStream msDecrypt = new MemoryStream( data )

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider()

tdsp.Mode = CipherMode.ECB

tdsp.Padding = PaddingMode.PKCS7

// Create a CryptoStream using the MemoryStream

// and the passed key and initialization vector (IV).

CryptoStream csDecrypt = new CryptoStream( msDecrypt,

tdsp.CreateDecryptor( key, iv ),

CryptoStreamMode.Read )

// Create buffer to hold the decrypted data.

byte[] fromEncrypt = new byte[data.Length]

// Read the decrypted data out of the crypto stream

// and place it into the temporary buffer.

csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length )

//Convert the buffer into a string and return it.

return fromEncrypt

}

catch ( CryptographicException e )

{

Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message )

return null

}

}

#endregion

/// <summary>

/// 类测试

/// </summary>

public static void Test()

{

System.Text.Encoding utf8 = System.Text.Encoding.UTF8

//key为abcdefghijklmnopqrstuvwx的Base64编码

byte[] key = Convert.FromBase64String( "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" )

byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 } //当模式为ECB时,IV无用

byte[] data = utf8.GetBytes( "中国ABCabc123" )

System.Console.WriteLine( "ECB模式:" )

byte[] str1 = Des3.Des3EncodeECB( key, iv, data )

byte[] str2 = Des3.Des3DecodeECB( key, iv, str1 )

System.Console.WriteLine( Convert.ToBase64String( str1 ) )

System.Console.WriteLine( System.Text.Encoding.UTF8.GetString( str2 ) )

System.Console.WriteLine()

System.Console.WriteLine( "CBC模式:" )

byte[] str3 = Des3.Des3EncodeCBC( key, iv, data )

byte[] str4 = Des3.Des3DecodeCBC( key, iv, str3 )

System.Console.WriteLine( Convert.ToBase64String( str3 ) )

System.Console.WriteLine( utf8.GetString( str4 ) )

System.Console.WriteLine()

}

}

java 代码:

import java.security.Key

import javax.crypto.Cipher

import javax.crypto.SecretKeyFactory

import javax.crypto.spec.DESedeKeySpec

import javax.crypto.spec.IvParameterSpec

import sun.misc.BASE64Decoder

import sun.misc.BASE64Encoder

public class Des3 {

public static void main(String[] args) throws Exception {

byte[] key=new BASE64Decoder().decodeBuffer("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4")

byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 }

byte[] data="中国ABCabc123".getBytes("UTF-8")

System.out.println("ECB加密解密")

byte[] str3 = des3EncodeECB(key,data )

byte[] str4 = ees3DecodeECB(key, str3)

System.out.println(new BASE64Encoder().encode(str3))

System.out.println(new String(str4, "UTF-8"))

System.out.println()

System.out.println("CBC加密解密")

byte[] str5 = des3EncodeCBC(key, keyiv, data)

byte[] str6 = des3DecodeCBC(key, keyiv, str5)

System.out.println(new BASE64Encoder().encode(str5))

System.out.println(new String(str6, "UTF-8"))

}

/**

* ECB加密,不要IV

* @param key 密钥

* @param data 明文

* @return Base64编码的密文

* @throws Exception

*/

public static byte[] des3EncodeECB(byte[] key, byte[] data)

throws Exception {

Key deskey = null

DESedeKeySpec spec = new DESedeKeySpec(key)

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede")

deskey = keyfactory.generateSecret(spec)

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding")

cipher.init(Cipher.ENCRYPT_MODE, deskey)

byte[] bOut = cipher.doFinal(data)

return bOut

}

/**

* ECB解密,不要IV

* @param key 密钥

* @param data Base64编码的密文

* @return 明文

* @throws Exception

*/

public static byte[] ees3DecodeECB(byte[] key, byte[] data)

throws Exception {

Key deskey = null

DESedeKeySpec spec = new DESedeKeySpec(key)

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede")

deskey = keyfactory.generateSecret(spec)

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding")

cipher.init(Cipher.DECRYPT_MODE, deskey)

byte[] bOut = cipher.doFinal(data)

return bOut

}

/**

* CBC加密

* @param key 密钥

* @param keyiv IV

* @param data 明文

* @return Base64编码的密文

* @throws Exception

*/

public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data)

throws Exception {

Key deskey = null

DESedeKeySpec spec = new DESedeKeySpec(key)

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede")

deskey = keyfactory.generateSecret(spec)

Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding")

IvParameterSpec ips = new IvParameterSpec(keyiv)

cipher.init(Cipher.ENCRYPT_MODE, deskey, ips)

byte[] bOut = cipher.doFinal(data)

return bOut

}

/**

* CBC解密

* @param key 密钥

* @param keyiv IV

* @param data Base64编码的密文

* @return 明文

* @throws Exception

*/

public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data)

throws Exception {

Key deskey = null

DESedeKeySpec spec = new DESedeKeySpec(key)

SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede")

deskey = keyfactory.generateSecret(spec)

Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding")

IvParameterSpec ips = new IvParameterSpec(keyiv)

cipher.init(Cipher.DECRYPT_MODE, deskey, ips)

byte[] bOut = cipher.doFinal(data)

return bOut

}

}

使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)

、解压缩openssl的包,进入openssl的目录

、perl configure VC-WIN32

尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。

、ms\do_ms

在解压目录下执行ms\do_ms命令

、nmake -f ms\ntdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件

注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:

warning treated as error - no object file generated

/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.

是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。

于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。

以下两个类可以很方便的完成字符串的加密和解密

加密 CryptHelper encrypt(password)

解密 CrypHelper decrypt(password)

代码如下

CryptUtils java

[java]

package gdie lab crypt

import java io IOException

import javax crypto Cipher

import javax crypto KeyGenerator

import javax crypto SecretKey

import apache xerces internal impl dv util Base

public class CryptUtils {

private static String Algorithm = DES

private static byte[] DEFAULT_KEY=new byte[] { }

private static String VALUE_ENCODING= UTF

/**

* 生成密钥

*

* @return byte[] 返回生成的密钥

* @throws exception

*             扔出异常

*/

public static byte[] getSecretKey() throws Exception {

KeyGenerator keygen = KeyGenerator getInstance(Algorithm)

SecretKey deskey = keygen generateKey()

// if (debug ) System out println ( 生成密钥 +byte hex (deskey getEncoded

// ()))

return deskey getEncoded()

}

/**

* 将指定的数据根据提供的密钥进行加密

*

* @param input

*            需要加密的数据

* @param key

*            密钥

* @return byte[] 加密后的数据

* @throws Exception

*/

public static byte[] encryptData(byte[] input byte[] key) throws Exception {

SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

// if (debug )

// {

// System out println ( 加密前的二进串 +byte hex (input ))

// System out println ( 加密前的字符串 +new String (input ))

//

// }

Cipher c = Cipher getInstance(Algorithm)

c init(Cipher ENCRYPT_MODE deskey)

byte[] cipherByte = c doFinal(input)

// if (debug ) System out println ( 加密后的二进串 +byte hex (cipherByte ))

return cipherByte

}

public static byte[] encryptData(byte[] input) throws Exception {

return encryptData(input DEFAULT_KEY)

}

/**

* 将给定的已加密的数据通过指定的密钥进行解密

*

* @param input

*            待解密的数据

* @param key

*            密钥

* @return byte[] 解密后的数据

* @throws Exception

*/

public static byte[] decryptData(byte[] input byte[] key) throws Exception {

SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

// if (debug ) System out println ( 解密前的信息 +byte hex (input ))

Cipher c = Cipher getInstance(Algorithm)

c init(Cipher DECRYPT_MODE deskey)

byte[] clearByte = c doFinal(input)

// if (debug )

// {

// System out println ( 解密后的二进串 +byte hex (clearByte ))

// System out println ( 解密后的字符串 +(new String (clearByte )))

//

// }

return clearByte

}

public static byte[] decryptData(byte[] input) throws Exception {

return decryptData(input DEFAULT_KEY)

}

/**

* 字节码转换成 进制字符串

*

* @param byte[] b 输入要转换的字节码

* @return String 返回转换后的 进制字符串

*/

public static String byte hex(byte[] bytes) {

StringBuilder hs = new StringBuilder()

for(byte b : bytes)

hs append(String format( % $ X b))

return hs toString()

}

public static byte[] hex byte(String content) {

int l=content length()》

byte[] result=new byte[l]

for(int i= i<li++) {

int j=i《

String s=content substring(j j+ )

result[i]=Integer valueOf(s ) byteValue()

}

return result

}

/**

* 将字节数组转换为base 编码字符串

* @param buffer

* @return

*/

public static String bytesToBase (byte[] buffer) {

//BASE Encoder en=new BASE Encoder()

return Base encode(buffer)

//      return encoder encode(buffer)

}

/**

* 将base 编码的字符串解码为字节数组

* @param value

* @return

* @throws IOException

*/

public static byte[] base ToBytes(String value) throws IOException {

//return Base decodeToByteArray(value)

//      System out println(decoder decodeBuffer(value))

//      return decoder decodeBuffer(value)

return Base decode(value)

}

/**

* 加密给定的字符串

* @param value

* @return 加密后的base 字符串

*/

public static String encryptString(String value) {

return encryptString(value DEFAULT_KEY)

}

/**

* 根据给定的密钥加密字符串

* @param value 待加密的字符串

* @param key 以BASE 形式存在的密钥

* @return 加密后的base 字符串

* @throws IOException

*/

public static String encryptString(String value String key) throws IOException {

return encryptString(value base ToBytes(key))

}

/**

* 根据给定的密钥加密字符串

* @param value 待加密的字符串

* @param key 字节数组形式的密钥

* @return 加密后的base 字符串

*/

public static String encryptString(String value byte[] key) {

try {

byte[] data=value getBytes(VALUE_ENCODING)

data=CryptUtils encryptData(data key)

return bytesToBase (data)

} catch (Exception e) {

// TODO Auto generated catch block

e printStackTrace()

return null

}

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @return 明文

*/

public static String decryptString(String value) {

return decryptString(value DEFAULT_KEY)

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @param key base 形式存在的密钥

* @return 明文

* @throws IOException

*/

public static String decryptString(String value String key) throws IOException {

String s=decryptString(value base ToBytes(key))

return s

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @param key 字节数据形式存在的密钥

* @return 明文

*/

public static String decryptString(String value byte[] key) {

try {

byte[] data=base ToBytes(value)

data=CryptUtils decryptData(data key)

return new String(data VALUE_ENCODING)

}catch(Exception e) {

e printStackTrace()

return null

}

}

}

package gdie lab crypt

import java io IOException

import javax crypto Cipher

import javax crypto KeyGenerator

import javax crypto SecretKey

import apache xerces internal impl dv util Base

public class CryptUtils {

private static String Algorithm = DES

private static byte[] DEFAULT_KEY=new byte[] { }

private static String VALUE_ENCODING= UTF

/**

* 生成密钥

*

* @return byte[] 返回生成的密钥

* @throws exception

*             扔出异常

*/

public static byte[] getSecretKey() throws Exception {

KeyGenerator keygen = KeyGenerator getInstance(Algorithm)

SecretKey deskey = keygen generateKey()

// if (debug ) System out println ( 生成密钥 +byte hex (deskey getEncoded

// ()))

return deskey getEncoded()

}

/**

* 将指定的数据根据提供的密钥进行加密

*

* @param input

*            需要加密的数据

* @param key

*            密钥

* @return byte[] 加密后的数据

* @throws Exception

*/

public static byte[] encryptData(byte[] input byte[] key) throws Exception {

SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

// if (debug )

// {

// System out println ( 加密前的二进串 +byte hex (input ))

// System out println ( 加密前的字符串 +new String (input ))

//

// }

Cipher c = Cipher getInstance(Algorithm)

c init(Cipher ENCRYPT_MODE deskey)

byte[] cipherByte = c doFinal(input)

// if (debug ) System out println ( 加密后的二进串 +byte hex (cipherByte ))

return cipherByte

}

public static byte[] encryptData(byte[] input) throws Exception {

return encryptData(input DEFAULT_KEY)

}

/**

* 将给定的已加密的数据通过指定的密钥进行解密

*

* @param input

*            待解密的数据

* @param key

*            密钥

* @return byte[] 解密后的数据

* @throws Exception

*/

public static byte[] decryptData(byte[] input byte[] key) throws Exception {

SecretKey deskey = new javax crypto spec SecretKeySpec(key Algorithm)

// if (debug ) System out println ( 解密前的信息 +byte hex (input ))

Cipher c = Cipher getInstance(Algorithm)

c init(Cipher DECRYPT_MODE deskey)

byte[] clearByte = c doFinal(input)

// if (debug )

// {

// System out println ( 解密后的二进串 +byte hex (clearByte ))

// System out println ( 解密后的字符串 +(new String (clearByte )))

//

// }

return clearByte

}

public static byte[] decryptData(byte[] input) throws Exception {

return decryptData(input DEFAULT_KEY)

}

/**

* 字节码转换成 进制字符串

*

* @param byte[] b 输入要转换的字节码

* @return String 返回转换后的 进制字符串

*/

public static String byte hex(byte[] bytes) {

StringBuilder hs = new StringBuilder()

for(byte b : bytes)

hs append(String format( % $ X b))

return hs toString()

}

public static byte[] hex byte(String content) {

int l=content length()》

byte[] result=new byte[l]

for(int i= i<li++) {

int j=i《

String s=content substring(j j+ )

result[i]=Integer valueOf(s ) byteValue()

}

return result

}

/**

* 将字节数组转换为base 编码字符串

* @param buffer

* @return

*/

public static String bytesToBase (byte[] buffer) {

//BASE Encoder en=new BASE Encoder()

return Base encode(buffer)

//  return encoder encode(buffer)

}

/**

* 将base 编码的字符串解码为字节数组

* @param value

* @return

* @throws IOException

*/

public static byte[] base ToBytes(String value) throws IOException {

//return Base decodeToByteArray(value)

//  System out println(decoder decodeBuffer(value))

//  return decoder decodeBuffer(value)

return Base decode(value)

}

/**

* 加密给定的字符串

* @param value

* @return 加密后的base 字符串

*/

public static String encryptString(String value) {

return encryptString(value DEFAULT_KEY)

}

/**

* 根据给定的密钥加密字符串

* @param value 待加密的字符串

* @param key 以BASE 形式存在的密钥

* @return 加密后的base 字符串

* @throws IOException

*/

public static String encryptString(String value String key) throws IOException {

return encryptString(value base ToBytes(key))

}

/**

* 根据给定的密钥加密字符串

* @param value 待加密的字符串

* @param key 字节数组形式的密钥

* @return 加密后的base 字符串

*/

public static String encryptString(String value byte[] key) {

try {

byte[] data=value getBytes(VALUE_ENCODING)

data=CryptUtils encryptData(data key)

return bytesToBase (data)

} catch (Exception e) {

// TODO Auto generated catch block

e printStackTrace()

return null

}

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @return 明文

*/

public static String decryptString(String value) {

return decryptString(value DEFAULT_KEY)

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @param key base 形式存在的密钥

* @return 明文

* @throws IOException

*/

public static String decryptString(String value String key) throws IOException {

String s=decryptString(value base ToBytes(key))

return s

}

/**

* 解密字符串

* @param value base 形式存在的密文

* @param key 字节数据形式存在的密钥

* @return 明文

*/

public static String decryptString(String value byte[] key) {

try {

byte[] data=base ToBytes(value)

data=CryptUtils decryptData(data key)

return new String(data VALUE_ENCODING)

}catch(Exception e) {

e printStackTrace()

return null

}

}

}

CryptHelper java

[java]

package gdie lab crypt

import javax crypto Cipher

import javax crypto SecretKey

import javax crypto SecretKeyFactory

import javax crypto spec DESKeySpec

import javax crypto spec IvParameterSpec

import springframework util DigestUtils

public class CryptHelper{

private static String CRYPT_KEY = zhongqian

//加密

private static Cipher ecip

//解密

private static Cipher dcip

static {

try {

String KEY = DigestUtils md DigestAsHex(CRYPT_KEY getBytes()) toUpperCase()

KEY = KEY substring( )

byte[] bytes = KEY getBytes()

DESKeySpec ks = new DESKeySpec(bytes)

SecretKeyFactory skf = SecretKeyFactory getInstance( DES )

SecretKey sk = skf generateSecret(ks)

IvParameterSpec iv = new IvParameterSpec(bytes)

ecip = Cipher getInstance( DES/CBC/PKCS Padding )

ecip init(Cipher ENCRYPT_MODE sk iv )

dcip = Cipher getInstance( DES/CBC/PKCS Padding )

dcip init(Cipher DECRYPT_MODE sk iv )

}catch(Exception ex) {

ex printStackTrace()

}

}

public static String encrypt(String content) throws Exception {

byte[] bytes = ecip doFinal(content getBytes( ascii ))

return CryptUtils byte hex(bytes)

}

public static String decrypt(String content) throws Exception {

byte[] bytes  = CryptUtils hex byte(content)

bytes = dcip doFinal(bytes)

return new String(bytes ascii )

}

//test

public static void main(String[] args) throws Exception {

String password = gly

String en = encrypt(password)

System out println(en)

System out println(decrypt(en))

}

}

package gdie lab crypt

import javax crypto Cipher

import javax crypto SecretKey

import javax crypto SecretKeyFactory

import javax crypto spec DESKeySpec

import javax crypto spec IvParameterSpec

import springframework util DigestUtils

public class CryptHelper{

private static String CRYPT_KEY = zhongqian

//加密

private static Cipher ecip

//解密

private static Cipher dcip

static {

try {

String KEY = DigestUtils md DigestAsHex(CRYPT_KEY getBytes()) toUpperCase()

KEY = KEY substring( )

byte[] bytes = KEY getBytes()

DESKeySpec ks = new DESKeySpec(bytes)

SecretKeyFactory skf = SecretKeyFactory getInstance( DES )

SecretKey sk = skf generateSecret(ks)

IvParameterSpec iv = new IvParameterSpec(bytes)

ecip = Cipher getInstance( DES/CBC/PKCS Padding )

ecip init(Cipher ENCRYPT_MODE sk iv )

dcip = Cipher getInstance( DES/CBC/PKCS Padding )

dcip init(Cipher DECRYPT_MODE sk iv )

}catch(Exception ex) {

ex printStackTrace()

}

}

public static String encrypt(String content) throws Exception {

byte[] bytes = ecip doFinal(content getBytes( ascii ))

return CryptUtils byte hex(bytes)

}

public static String decrypt(String content) throws Exception {

byte[] bytes  = CryptUtils hex byte(content)

bytes = dcip doFinal(bytes)

return new String(bytes ascii )

}

//test

public static void main(String[] args) throws Exception {

String password = gly

String en = encrypt(password)

System out println(en)

System out println(decrypt(en))

}

lishixinzhi/Article/program/Java/hx/201311/26449