JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的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, , 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, , 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, , 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, , 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[] { , , , , , , , }; //当模式为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代码
01.import java.security.Key;
02.import javax.crypto.Cipher;
03.import javax.crypto.SecretKeyFactory;
04.import javax.crypto.spec.DESedeKeySpec;
05.import javax.crypto.spec.IvParameterSpec;
06.import sun.misc.BASE64Decoder;
07.import sun.misc.BASE64Encoder;
08.public class Des3 {
09. public static void main(String[] args) throws Exception {
10. byte[] key=new BASE64Decoder().decodeBuffer("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4");
11. byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };
12. byte[] data="中国ABCabc123".getBytes("UTF-8");
13.
14. System.out.println("ECB加密解密");
15. byte[] str3 = des3EncodeECB(key,data );
16. byte[] str4 = ees3DecodeECB(key, str3);
17. System.out.println(new BASE64Encoder().encode(str3));
18. System.out.println(new String(str4, "UTF-8"));
19. System.out.println();
20. System.out.println("CBC加密解密");
21. byte[] str5 = des3EncodeCBC(key, keyiv, data);
22. byte[] str6 = des3DecodeCBC(key, keyiv, str5);
23. System.out.println(new BASE64Encoder().encode(str5));
24. System.out.println(new String(str6, "UTF-8"));
25. }
26. /**
27. * ECB加密,不要IV
28. * @param key 密钥
29. * @param data 明文
30. * @return Base64编码的密文
31. * @throws Exception
32. */
33. public static byte[] des3EncodeECB(byte[] key, byte[] data)
34. throws Exception {
35. Key deskey = null;
36. DESedeKeySpec spec = new DESedeKeySpec(key);
37. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
38. deskey = keyfactory.generateSecret(spec);
39. Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
40. cipher.init(Cipher.ENCRYPT_MODE, deskey);
41. byte[] bOut = cipher.doFinal(data);
42. return bOut;
43. }
44. /**
45. * ECB解密,不要IV
46. * @param key 密钥
47. * @param data Base64编码的密文
48. * @return 明文
49. * @throws Exception
50. */
51. public static byte[] ees3DecodeECB(byte[] key, byte[] data)
52. throws Exception {
53. Key deskey = null;
54. DESedeKeySpec spec = new DESedeKeySpec(key);
55. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
56. deskey = keyfactory.generateSecret(spec);
57. Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
58. cipher.init(Cipher.DECRYPT_MODE, deskey);
59. byte[] bOut = cipher.doFinal(data);
60. return bOut;
61. }
62. /**
63. * CBC加密
64. * @param key 密钥
65. * @param keyiv IV
66. * @param data 明文
67. * @return Base64编码的密文
68. * @throws Exception
69. */
70. public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data)
71. throws Exception {
72. Key deskey = null;
73. DESedeKeySpec spec = new DESedeKeySpec(key);
74. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
75. deskey = keyfactory.generateSecret(spec);
76. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
77. IvParameterSpec ips = new IvParameterSpec(keyiv);
78. cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
79. byte[] bOut = cipher.doFinal(data);
80. return bOut;
81. }
82. /**
83. * CBC解密
84. * @param key 密钥
85. * @param keyiv IV
86. * @param data Base64编码的密文
87. * @return 明文
88. * @throws Exception
89. */
90. public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data)
91. throws Exception {
92. Key deskey = null;
93. DESedeKeySpec spec = new DESedeKeySpec(key);
94. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
95. deskey = keyfactory.generateSecret(spec);
96. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
97. IvParameterSpec ips = new IvParameterSpec(keyiv);
98. cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
99. byte[] bOut = cipher.doFinal(data);
100. return bOut;
101. }
下面是运行结果
ECB模式:
rmWB4+r9Ug93WI0KAEuMig==
中国ABCabc123
CBC模式:
4aabWF8UFour/vNfnzJrjw==
中国ABCabc123
文章来自:http://blog.csdn.net/sdfkfkd/article/details/6004847 感谢作者的分享。
JAVA和C# 3DES加密解密的更多相关文章
- Android: JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...
- 分享:JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...
- .NET与 java通用的3DES加密解密方法
C#代码 private void button1_Click(object sender, EventArgs e) { string jiami = textBox1.Text; textBox2 ...
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- C# Java 3DES加密解密 扩展及修正\0 问题
注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...
- iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- 简进祥==iOS 3DES加密解密
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
- 3DES加密解密
C#3DES加密解密,JAVA.PHP可用 using System; using System.Security.Cryptography; using System.Text; namespace ...
- java 与 c# 3des 加解密
java 与 c# 3des 加解密 主要差异如下: 1. 对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...
随机推荐
- paip.点击每个网页链接都提示下载的解决。
paip.点击每个网页链接都提示下载的解决. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn. ...
- IT 需要知道的一些专业名词和解释 (长期更新)
c2c: 就是我卖东西你来买 (comsumer to comsumer个人对个人) b2c: 就是我开公司卖东西你来买 (business to comsumer 公司对个人) o2o: 就是我开 ...
- 定义一个时钟类——Clock,它包括三个int型 成员变量分别表示时、分、秒,一个构造方法用于对三个成员变量(时、分、秒) 进行初始化,还有一个成员方法show()用于显示时钟对象的时间。其次,再定义 一个主类——TestClass,在主类的main方法中创建多个时钟类的对象,使用这 些对象调用方法show()来显示时钟的时间
package java1; public class Clock { int hhh; int mmm; int sss; Clock(int h,int m,int s) { hhh=h; mmm ...
- swap函数的四种写法
swap 函数的四种写法 (1)经典型 --- 嫁衣法 void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } ( ...
- [推荐]移动H5前端性能优化指南
[推荐]移动H5前端性能优化指南 http://isux.tencent.com/h5-performance.html
- /etc/pam.d 与 /etc/security 密码策略
PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制.它通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统 ...
- iOS 9 failed for URL: "XXX://@" - error: "This app is not allowed to query for scheme XXX" iOS 从APP里启动另一APP
iOS 从C APP里启动 D APP 首先在D APP里设置 URL Schemes 在info.plist 文件里添加URL Schemes URL Types -->item0 --> ...
- 解决VS2010中在项目上右键鼠标,无“添加STS引用”菜单的问题
解决方法:将Windows Identity Foundation SDK文件夹C:\Program Files (x86)\Windows Identity Foundation SDK\v3.5\ ...
- FoxMail的Bug
Foxmail 7.2 build6.040,win7中文专业版 下载腾讯的企业邮箱的邮件, 自动配置为imap收邮件 收件箱应该为1740封 邮件 实际foxmail却只收到1500多封 改成pop ...
- how to read from __consumer_offsets topic
来自:http://grokbase.com/t/kafka/users/15bs2r0m83/kafka-0-8-2-1-how-to-read-from-consumer-offsets-topi ...