java 生成的3des和c#兼容 nopadding_JAVA安卓和C# 3DES加密解密的兼容性问题(2013年8月修改版)...

#region Des3Encrypt加密解密

/// Des3Encrypt加密解密

///

///

public class Des3Encrypt

{

#region 一点小注释

//注意,如果是在C#端自己加密,自己解密的时候,会发现一个补\0的问题,例如 原文是 abcde ,加密之后,再解密变成了 abcde\0\0\0

//

//这里的\0的次数,是看你的原文和8相差多少,如果不够8位就补几次。原文是abcde是5位,则会自动补齐\0 要补3次

//

//如果是c#端加密,发给java解密,则不会有问题,不会存在\0的问题

//

//如果是java端加密,发给c#解密,则还是会在结尾自动补\0

//我们需要人为的replace替换掉\0

#endregion

#region CBC模式加密解密

/// DES3 CBC模式加密

///

///

/// 密钥

/// IV

/// 明文的byte数组

/// 密文的byte数组

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;

}

}

///

/// DES3 CBC模式解密

///

/// 密钥

/// IV

/// 密文的byte数组

/// 明文的byte数组

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模式加密解密

///

/// DES3 ECB模式加密(不需要IV,可以传null)

///

/// 密钥

/// IV(当模式为ECB时,IV无用)

/// 明文的byte数组

/// 密文的byte数组

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;

}

}

///

/// DES3 ECB模式解密

///

/// 密钥

/// IV(当模式为ECB时,IV无用)

/// 密文的byte数组

/// 明文的byte数组

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

#region ECB模式加密(key已经设置好)

/// ECB模式加密(key已经设置好)

///

///

/// 输入需要加密的字符

///

public static string EncodeECB(string old)

{

string keyWord = "youjiao2013_fromc#tojava";

return EncodeECB(old, keyWord);

}

#endregion

#region 自己设置KeyWord,注意key必须是24位的,不然java那边加密会显示长度不够

public static string EncodeECB(string old, string keyWord)

{

Encoding utf8 = Encoding.UTF8;

byte[] key = utf8.GetBytes(keyWord); //加密的密钥

//---- 加密

string str1 = old; //准备要加密的原文

byte[] byte1 = utf8.GetBytes(str1); //获得原文的字节

byte[] byte2 = Des3EncodeECB(key, null, byte1); //已经加密过的字节

string str2 = Convert.ToBase64String(byte2); //将字节转换为 Base64位的编码

return str2;

}

#endregion

#region ECB模式解密(key已经设置好)

public static string DecodeECB(string old)

{

string keyWord = "youjiao2013_fromc#tojava";

return DecodeECB(old, keyWord);

}

#endregion

#region ECB模式解密(自己设置KeyWord,注意key必须是24位的,不然java那边加密会显示长度不够)

public static string DecodeECB(string old, string keyWord)

{

Encoding utf8 = Encoding.UTF8;

byte[] key = utf8.GetBytes(keyWord); //加密的密钥

string strJiaMi = old; //需要解密的的密码

byte[] alreadyEnCodeByte = Convert.FromBase64String(strJiaMi); //从Base64位转换为字节

byte[] toDecodeByte = Des3.Des3DecodeECB(key, null, alreadyEnCodeByte); //解密

//将解密后的字节,转换成string字符串

//(注意,如果解密出来的字符串的长度不是8的倍数,则会自动在后面补\0多次,例如解密出来是abcde,长度为5,则会变成 abc\0\0\0\0\0 加多3次)

string strShow = Encoding.Default.GetString(toDecodeByte);

strShow = strShow.Replace("\0", "");

return strShow;

}

#endregion

#region 测试

public static void MyTest()

{

Encoding utf8 = Encoding.UTF8;

byte[] key = Encoding.Default.GetBytes("youjiao2013_fromc#tojava");

//---- 加密

string str1 = "abc"; //准备要加密的原文

byte[] byte1 = utf8.GetBytes(str1); //获得原文的字节

byte[] byte2 = Des3EncodeECB(key, null, byte1); //已经加密过的字节

string str2 = Convert.ToBase64String(byte2); //将字节转换为 Base64位的编码

Console.WriteLine(str2); //Pv8WLS7RSYRD8ushCAH/Zg==

//--- 解密

string strJiaMi = "0TvZFgRLf5s="; //需要解密的的密码

byte[] alreadyEnCodeByte = Convert.FromBase64String(strJiaMi); //从Base64位转换为字节

byte[] toDecodeByte = Des3DecodeECB(key, null, alreadyEnCodeByte); //解密

//将解密后的字节,转换成string字符串

//(注意,如果解密出来的字符串的长度不是8的倍数,则会自动在后面补\0多次,例如解密出来是abcde,长度为5,则会变成 abc\0\0\0\0\0 加多3次)

string strShow = Encoding.Default.GetString(toDecodeByte);

strShow = strShow.Replace("\0", "");

Console.WriteLine(strShow);

Console.ReadKey();

}

/// 类测试

///

///

private static void Test()

{

Encoding utf8 = 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");

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

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

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

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

Console.WriteLine(Encoding.UTF8.GetString(str2));

Console.WriteLine();

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

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

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

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

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

Console.WriteLine();

}

#endregion

}

#endregion

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值