最近 一个项目.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#代码

  1. /// <summary>
  2. /// DES3加密解密
  3. /// </summary>
  4. public class Des3
  5. {
  6. #region CBC模式**
  7. /// <summary>
  8. /// DES3 CBC模式加密
  9. /// </summary>
  10. /// <param name="key">密钥</param>
  11. /// <param name="iv">IV</param>
  12. /// <param name="data">明文的byte数组</param>
  13. /// <returns>密文的byte数组</returns>
  14. public static byte[] Des3EncodeCBC( byte[] key, byte[] iv, byte[] data )
  15. {
  16. //复制于MSDN
  17. try
  18. {
  19. // Create a MemoryStream.
  20. MemoryStream mStream = new MemoryStream();
  21. TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
  22. tdsp.Mode = CipherMode.CBC;             //默认值
  23. tdsp.Padding = PaddingMode.PKCS7;       //默认值
  24. // Create a CryptoStream using the MemoryStream
  25. // and the passed key and initialization vector (IV).
  26. CryptoStream cStream = new CryptoStream( mStream,
  27. tdsp.CreateEncryptor( key, iv ),
  28. CryptoStreamMode.Write );
  29. // Write the byte array to the crypto stream and flush it.
  30. cStream.Write( data, 0, data.Length );
  31. cStream.FlushFinalBlock();
  32. // Get an array of bytes from the
  33. // MemoryStream that holds the
  34. // encrypted data.
  35. byte[] ret = mStream.ToArray();
  36. // Close the streams.
  37. cStream.Close();
  38. mStream.Close();
  39. // Return the encrypted buffer.
  40. return ret;
  41. }
  42. catch ( CryptographicException e )
  43. {
  44. Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
  45. return null;
  46. }
  47. }
  48. /// <summary>
  49. /// DES3 CBC模式解密
  50. /// </summary>
  51. /// <param name="key">密钥</param>
  52. /// <param name="iv">IV</param>
  53. /// <param name="data">密文的byte数组</param>
  54. /// <returns>明文的byte数组</returns>
  55. public static byte[] Des3DecodeCBC( byte[] key, byte[] iv, byte[] data )
  56. {
  57. try
  58. {
  59. // Create a new MemoryStream using the passed
  60. // array of encrypted data.
  61. MemoryStream msDecrypt = new MemoryStream( data );
  62. TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
  63. tdsp.Mode = CipherMode.CBC;
  64. tdsp.Padding = PaddingMode.PKCS7;
  65. // Create a CryptoStream using the MemoryStream
  66. // and the passed key and initialization vector (IV).
  67. CryptoStream csDecrypt = new CryptoStream( msDecrypt,
  68. tdsp.CreateDecryptor( key, iv ),
  69. CryptoStreamMode.Read );
  70. // Create buffer to hold the decrypted data.
  71. byte[] fromEncrypt = new byte[data.Length];
  72. // Read the decrypted data out of the crypto stream
  73. // and place it into the temporary buffer.
  74. csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );
  75. //Convert the buffer into a string and return it.
  76. return fromEncrypt;
  77. }
  78. catch ( CryptographicException e )
  79. {
  80. Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
  81. return null;
  82. }
  83. }
  84. #endregion
  85. #region ECB模式
  86. /// <summary>
  87. /// DES3 ECB模式加密
  88. /// </summary>
  89. /// <param name="key">密钥</param>
  90. /// <param name="iv">IV(当模式为ECB时,IV无用)</param>
  91. /// <param name="str">明文的byte数组</param>
  92. /// <returns>密文的byte数组</returns>
  93. public static byte[] Des3EncodeECB( byte[] key, byte[] iv, byte[] data )
  94. {
  95. try
  96. {
  97. // Create a MemoryStream.
  98. MemoryStream mStream = new MemoryStream();
  99. TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
  100. tdsp.Mode = CipherMode.ECB;
  101. tdsp.Padding = PaddingMode.PKCS7;
  102. // Create a CryptoStream using the MemoryStream
  103. // and the passed key and initialization vector (IV).
  104. CryptoStream cStream = new CryptoStream( mStream,
  105. tdsp.CreateEncryptor( key, iv ),
  106. CryptoStreamMode.Write );
  107. // Write the byte array to the crypto stream and flush it.
  108. cStream.Write( data, 0, data.Length );
  109. cStream.FlushFinalBlock();
  110. // Get an array of bytes from the
  111. // MemoryStream that holds the
  112. // encrypted data.
  113. byte[] ret = mStream.ToArray();
  114. // Close the streams.
  115. cStream.Close();
  116. mStream.Close();
  117. // Return the encrypted buffer.
  118. return ret;
  119. }
  120. catch ( CryptographicException e )
  121. {
  122. Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
  123. return null;
  124. }
  125. }
  126. /// <summary>
  127. /// DES3 ECB模式解密
  128. /// </summary>
  129. /// <param name="key">密钥</param>
  130. /// <param name="iv">IV(当模式为ECB时,IV无用)</param>
  131. /// <param name="str">密文的byte数组</param>
  132. /// <returns>明文的byte数组</returns>
  133. public static byte[] Des3DecodeECB( byte[] key, byte[] iv, byte[] data )
  134. {
  135. try
  136. {
  137. // Create a new MemoryStream using the passed
  138. // array of encrypted data.
  139. MemoryStream msDecrypt = new MemoryStream( data );
  140. TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
  141. tdsp.Mode = CipherMode.ECB;
  142. tdsp.Padding = PaddingMode.PKCS7;
  143. // Create a CryptoStream using the MemoryStream
  144. // and the passed key and initialization vector (IV).
  145. CryptoStream csDecrypt = new CryptoStream( msDecrypt,
  146. tdsp.CreateDecryptor( key, iv ),
  147. CryptoStreamMode.Read );
  148. // Create buffer to hold the decrypted data.
  149. byte[] fromEncrypt = new byte[data.Length];
  150. // Read the decrypted data out of the crypto stream
  151. // and place it into the temporary buffer.
  152. csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );
  153. //Convert the buffer into a string and return it.
  154. return fromEncrypt;
  155. }
  156. catch ( CryptographicException e )
  157. {
  158. Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
  159. return null;
  160. }
  161. }
  162. #endregion
  163. /// <summary>
  164. /// 类测试
  165. /// </summary>
  166. public static void Test()
  167. {
  168. System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
  169. //key为abcdefghijklmnopqrstuvwx的Base64编码
  170. byte[] key = Convert.FromBase64String( "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" );
  171. byte[] iv = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };      //当模式为ECB时,IV无用
  172. byte[] data = utf8.GetBytes( "中国ABCabc123" );
  173. System.Console.WriteLine( "ECB模式:" );
  174. byte[] str1 = Des3.Des3EncodeECB( key, iv, data );
  175. byte[] str2 = Des3.Des3DecodeECB( key, iv, str1 );
  176. System.Console.WriteLine( Convert.ToBase64String( str1 ) );
  177. System.Console.WriteLine( System.Text.Encoding.UTF8.GetString( str2 ) );
  178. System.Console.WriteLine();
  179. System.Console.WriteLine( "CBC模式:" );
  180. byte[] str3 = Des3.Des3EncodeCBC( key, iv, data );
  181. byte[] str4 = Des3.Des3DecodeCBC( key, iv, str3 );
  182. System.Console.WriteLine( Convert.ToBase64String( str3 ) );
  183. System.Console.WriteLine( utf8.GetString( str4 ) );
  184. System.Console.WriteLine();
  185. }
  186. }

复制代码

接着是Java代码

  1. import java.security.Key;
  2. import javax.crypto.Cipher;
  3. import javax.crypto.SecretKeyFactory;
  4. import javax.crypto.spec.DESedeKeySpec;
  5. import javax.crypto.spec.IvParameterSpec;
  6. import sun.misc.BASE64Decoder;
  7. import sun.misc.BASE64Encoder;
  8. public class Des3 {
  9. 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. System.out.println("ECB加密解密");
  14. byte[] str3 = des3EncodeECB(key,data );
  15. byte[] str4 = ees3DecodeECB(key, str3);
  16. System.out.println(new BASE64Encoder().encode(str3));
  17. System.out.println(new String(str4, "UTF-8"));
  18. System.out.println();
  19. System.out.println("CBC加密解密");
  20. byte[] str5 = des3EncodeCBC(key, keyiv, data);
  21. byte[] str6 = des3DecodeCBC(key, keyiv, str5);
  22. System.out.println(new BASE64Encoder().encode(str5));
  23. System.out.println(new String(str6, "UTF-8"));
  24. }
  25. /**
  26. * ECB加密,不要IV
  27. * @param key 密钥
  28. * @param data 明文
  29. * @return Base64编码的密文
  30. * @throws Exception
  31. */
  32. public static byte[] des3EncodeECB(byte[] key, byte[] data)
  33. throws Exception {
  34. Key deskey = null;
  35. DESedeKeySpec spec = new DESedeKeySpec(key);
  36. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
  37. deskey = keyfactory.generateSecret(spec);
  38. Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
  39. cipher.init(Cipher.ENCRYPT_MODE, deskey);
  40. byte[] bOut = cipher.doFinal(data);
  41. return bOut;
  42. }
  43. /**
  44. * ECB解密,不要IV
  45. * @param key 密钥
  46. * @param data Base64编码的密文
  47. * @return 明文
  48. * @throws Exception
  49. */
  50. public static byte[] ees3DecodeECB(byte[] key, byte[] data)
  51. throws Exception {
  52. Key deskey = null;
  53. DESedeKeySpec spec = new DESedeKeySpec(key);
  54. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
  55. deskey = keyfactory.generateSecret(spec);
  56. Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
  57. cipher.init(Cipher.DECRYPT_MODE, deskey);
  58. byte[] bOut = cipher.doFinal(data);
  59. return bOut;
  60. }
  61. /**
  62. * CBC加密
  63. * @param key 密钥
  64. * @param keyiv IV
  65. * @param data 明文
  66. * @return Base64编码的密文
  67. * @throws Exception
  68. */
  69. public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data)
  70. throws Exception {
  71. Key deskey = null;
  72. DESedeKeySpec spec = new DESedeKeySpec(key);
  73. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
  74. deskey = keyfactory.generateSecret(spec);
  75. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
  76. IvParameterSpec ips = new IvParameterSpec(keyiv);
  77. cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
  78. byte[] bOut = cipher.doFinal(data);
  79. return bOut;
  80. }
  81. /**
  82. * CBC解密
  83. * @param key 密钥
  84. * @param keyiv IV
  85. * @param data Base64编码的密文
  86. * @return 明文
  87. * @throws Exception
  88. */
  89. public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data)
  90. throws Exception {
  91. Key deskey = null;
  92. DESedeKeySpec spec = new DESedeKeySpec(key);
  93. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
  94. deskey = keyfactory.generateSecret(spec);
  95. Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
  96. IvParameterSpec ips = new IvParameterSpec(keyiv);
  97. cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
  98. byte[] bOut = cipher.doFinal(data);
  99. return bOut;
  100. }
  101. }

复制代码

下面是运行结果

ECB模式:
rmWB4+r9Ug93WI0KAEuMig==
中国ABCabc123

CBC模式:
4aabWF8UFour/vNfnzJrjw==
中国ABCabc123

另外,android下要使用3DES可考虑将BASE64Encoder替换成Base64

代码如下:

  1. public static void main(String[] args) throws Exception {
  2. byte[] key=Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4".getBytes(),Base64.DEFAULT);
  3. byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };
  4. byte[] data="中国ABCabc123".getBytes("UTF-8");
  5. System.out.println("ECB加密解密");
  6. byte[] str3 = des3EncodeECB(key,data );
  7. byte[] str4 = ees3DecodeECB(key, str3);
  8. System.out.println(new String(Base64.encode(str3,  Base64.DEFAULT),"UTF-8"));
  9. System.out.println(new String(str4, "UTF-8"));
  10. System.out.println();
  11. System.out.println("CBC加密解密");
  12. byte[] str5 = des3EncodeCBC(key, keyiv, data);
  13. byte[] str6 = des3DecodeCBC(key, keyiv, str5);
  14. System.out.println(new String(Base64.encode(str5,  Base64.DEFAULT),"UTF-8"));
  15. System.out.println(new String(str6, "UTF-8"));
  16. }

复制代码

Android: JAVA和C# 3DES加密解密的更多相关文章

  1. .NET/android/java/iOS AES通用加密解密(修正安卓)

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  2. .NET/android/java/iOS AES通用加密解密

    移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...

  3. JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题, 下面分享一下, 这里的KEY采用Base64编码,便用分发,因为Java的B ...

  4. 分享:JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...

  5. .NET与 java通用的3DES加密解密方法

    C#代码 private void button1_Click(object sender, EventArgs e) { string jiami = textBox1.Text; textBox2 ...

  6. 【推荐】JAVA基础◆浅谈3DES加密解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  7. C# Java 3DES加密解密 扩展及修正\0 问题

    注: C#已亲测及做扩展, Java 部分未做验证 /// <summary> /// 3DES加密解密 /// ------------------------------------- ...

  8. IOS, Android, Java Web Rest : RSA 加密和解密问题

    IOS, Android, Java Web Rest :  RSA 加密和解密问题 一对公钥私钥可以使用 OpenSSL创建, 通常 1024位长度够了. 注意: 1. 公钥私钥是BASE64编码的 ...

  9. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

随机推荐

  1. Spring WebSocket教程(二)

    实现目标 这一篇文章,就要直接实现聊天的功能,并且,在聊天功能的基础上,再实现缓存一定聊天记录的功能. 第一步:聊天实现原理 首先,需要明确我们的需求.通常,网页上的聊天,都是聊天室的形式,所以,这个 ...

  2. C#中[] 、List、Array、ArrayList等数据结构的差异简述

    [] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList 是针对任意类型.任意长度的. Array 和 ArrayLis ...

  3. 通过github搭建个人博客

    今天突发奇想,想用GitHub搭建一个个人博客,就大概学习了一下,特此记录. 其实非常简单,首先要知道,这里是通过GitHub Pages进行搭建的,什么?不知道什么是GitHub Pages?Git ...

  4. linux 常见错误

    yum.pid 已被锁定 rm -rf /var/run/yum.pid

  5. Javascript Notes

    Get started with Programming Javascript中的保留字,但是大部分却没在这个语言中使用.undefined,NaN,Infinity也应该算保留字. abstract ...

  6. Entity Framework Code First - Change Tracking

    In this post we will be discussing about change tracking feature of Entity Framework Code First. Cha ...

  7. mysql游标的使用

    这是一个游标的使用例子. 但是其中有几点需要注意,就是为什么要加入 declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;这 ...

  8. 如何将Mac系统OS X Yosemite装到外部磁盘?(转)

    有Mac用户想了解是否可以将 OS X Yosemite 装到替代的外部磁盘,答案是肯定的,有需求的用户,可以按照本篇教程逐步进行. 前面我已经写过一篇文章介绍了如何安装 OS X Yosemite ...

  9. 关于Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  10. 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器

    对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...