经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
C#.NET与JAVA互通之DES加密V2024
来源:cnblogs  作者:runliuv  时间:2024/6/17 15:15:36  对本文有异议
C#.NET与JAVA互通之DES加密V2024
 
配置视频:
 
 
环境:
.NET Framework 4.6 控制台程序
JAVA这边:JDK8 (1.8) 控制台程序
 

注意点:

1.由于密钥、明文、密文的输入输出参数,都是byte数组(byte[]),所以:字符串转byte数组(byte[])环节,双方要约定好编码。

2. KEY 和 IV 从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8。

3.明文从字符串转byte数组(byte[])时,双方要约定好编码,一般是UTF8,.NET 这边要注意:不能用 Encoding.Default。

4.加密后的结果,从byte数组(byte[])转字符串时,双方要约定好编码,一般是Base64字符串。

5.NET 的PKCS7Padding 对应 JAVA 的:PKCS5Padding

一、 .NET DES

先看工具类:DesUtil

  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. namespace CommonUtils
  5. {
  6. /// <summary>
  7. /// 工具类,2024-06-16,runliuv。
  8. /// </summary>
  9. public class DesUtil
  10. {
  11. public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
  12. {
  13. byte[] encrypted;
  14. using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
  15. {
  16. desAlg.Key = Key;
  17. desAlg.IV = IV;
  18. desAlg.Mode = CipherMode.CBC;
  19. desAlg.Padding = PaddingMode.PKCS7;
  20. using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
  21. {
  22. encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
  23. }
  24. }
  25. return encrypted;
  26. }
  27. public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV)
  28. {
  29. byte[] plaintext = null;
  30. using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
  31. {
  32. desAlg.Key = Key;
  33. desAlg.IV = IV;
  34. desAlg.Mode = CipherMode.CBC;
  35. desAlg.Padding = PaddingMode.PKCS7;
  36. using (ICryptoTransform decryptor = desAlg.CreateDecryptor())
  37. {
  38. plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
  39. }
  40. }
  41. return plaintext;
  42. }
  43. /// <summary>
  44. /// DES CBC 加密
  45. /// </summary>
  46. /// <param name="plainText">明文</param>
  47. /// <param name="Key">密钥</param>
  48. /// <param name="IV"></param>
  49. /// <returns></returns>
  50. public static string DesEncryptCBC(string plainText, string Key, string IV)
  51. {
  52. byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
  53. string xx=Convert.ToBase64String(yy);
  54. return xx;
  55. }
  56. /// <summary>
  57. /// DES CBC 解密
  58. /// </summary>
  59. /// <param name="cipherText">密文</param>
  60. /// <param name="Key">密钥</param>
  61. /// <param name="IV"></param>
  62. /// <returns></returns>
  63. public static string DesDecryptCBC(string cipherText, string Key, string IV)
  64. {
  65. byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
  66. string xx = Encoding.UTF8.GetString(yy);
  67. return xx;
  68. }
  69. }
  70. }

.NET 使用这个工具类,做DES CBC 加密 :

  1. static void TestDesCbc()
  2. {
  3. Console.WriteLine("-- Test Cbc --");
  4. string aesKey = "12345678";// DES 密钥长度是8位
  5. string aesIV = "abcdefgh";// DES IV长度是8位
  6.  
  7. string orgStr = "hello .net 2024-06-10";
  8. string encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
  9. Console.WriteLine("加密字符串:" + encryptedStr);
  10. //自加,自解
  11. string decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
  12. Console.WriteLine("自加,自解:" + decryptedStr);
  13. }

.NET 输出结果 :

  1. -- Test Cbc --
  2. 加密字符串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
  3. 自加,自解:hello .net 2024-06-10
  4. 结束

.NET 简要说明:

加密:

 

  1. public static string DesEncryptCBC(string plainText, string Key, string IV)
  2. {
  3. byte[] yy= DesEncryptCBC(Encoding.UTF8.GetBytes(plainText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
  4. string xx=Convert.ToBase64String(yy);
  5. return xx;
  6. }

 

Encoding.UTF8.GetBytes(plainText),明文字符串转byte数组 使用UTF8。

Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV),KEY 和 IV 转byte数组 使用UTF8。

  1. public static byte[] DesEncryptCBC(byte[] plainText, byte[] Key, byte[] IV)
  2. {
  3. byte[] encrypted;
  4. using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
  5. {
  6. desAlg.Key = Key;
  7. desAlg.IV = IV;
  8. desAlg.Mode = CipherMode.CBC;
  9. desAlg.Padding = PaddingMode.PKCS7;
  10. using (ICryptoTransform encryptor = desAlg.CreateEncryptor())
  11. {
  12. encrypted= encryptor.TransformFinalBlock(plainText, 0, plainText.Length);
  13. }
  14. }
  15. return encrypted;
  16. }

创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 加密模式和 PADDING。

创建加密器对象:desAlg.CreateEncryptor()。

使用 TransformFinalBlock 算出加密结果。

string xx=Convert.ToBase64String(yy); 加密后的结果转字符串时,使用Base64字符串。

 

解密:

  1. public static string DesDecryptCBC(string cipherText, string Key, string IV)
  2. {
  3. byte[] yy = DesDecryptCBC(Convert.FromBase64String(cipherText), Encoding.UTF8.GetBytes(Key), Encoding.UTF8.GetBytes(IV));
  4. string xx = Encoding.UTF8.GetString(yy);
  5. return xx;
  6. }

 

 

Convert.FromBase64String(cipherText),由于加密结果集转字符串时用的base64,所以密文转byte数组时,就要用Convert.FromBase64String。

 

KEY 和 IV 就不用多说了。

  1. public static byte[] DesDecryptCBC(byte[] cipherText, byte[] Key, byte[] IV)
  2. {
  3. byte[] plaintext = null;
  4. using (DESCryptoServiceProvider desAlg = new DESCryptoServiceProvider())
  5. {
  6. desAlg.Key = Key;
  7. desAlg.IV = IV;
  8. desAlg.Mode = CipherMode.CBC;
  9. desAlg.Padding = PaddingMode.PKCS7;
  10. using (ICryptoTransform decryptor = desAlg.CreateDecryptor())
  11. {
  12. plaintext = decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
  13. }
  14. }
  15. return plaintext;
  16. }

 

创建一个DESCryptoServiceProvider对象,指定KEY 和 IV,指定 模式和 PADDING。

创建解密器对象:desAlg.CreateDecryptor()。

使用 TransformFinalBlock 解密出结果。

string xx = Encoding.UTF8.GetString(yy);  加密时,明文转byte[] 时用的UTF8,那解密出的明文结果,转byte数组时,也得用UTF8。

 

可以说,解密与加密是相反的。 

 

 

二、JAVA DES

还是简要封装个工具类DesUtil。

  1. package org.runliuv;
  2. import javax.crypto.Cipher;
  3. import javax.crypto.spec.IvParameterSpec;
  4. import javax.crypto.spec.SecretKeySpec;
  5. import java.util.Base64;
  6. public class DesUtil {
  7. private static final String charset = "UTF-8";
  8. public static String DesEncryptCBC(String content, String key, String iv)
  9. throws Exception {
  10. //明文
  11. byte[] contentBytes = content.getBytes(charset);
  12. //DES KEY
  13. byte[] keyBytes = key.getBytes(charset);
  14. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
  15. //DES IV
  16. byte[] initParam = iv.getBytes(charset);
  17. IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
  18. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  19. cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
  20. byte[] byEnd = cipher.doFinal(contentBytes);
  21. //加密后的byte数组转BASE64字符串
  22. String strEnd = Base64.getEncoder().encodeToString(byEnd);
  23. return strEnd;
  24. }
  25. /**
  26. * 解密
  27. * @param content
  28. * @param key
  29. * @param iv
  30. * @return
  31. * @throws Exception
  32. */
  33. public static String DesDecryptCBC(String content, String key, String iv)
  34. throws Exception {
  35. //反向解析BASE64字符串为byte数组
  36. byte[] encryptedBytes = Base64.getDecoder().decode(content);
  37. //DES KEY
  38. byte[] keyBytes = key.getBytes(charset);
  39. SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "DES");
  40. //DES IV
  41. byte[] initParam = iv.getBytes(charset);
  42. IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);
  43. Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
  44. cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
  45. byte[] byEnd = cipher.doFinal(encryptedBytes);
  46. //加密后的byte数组直接转字符串
  47. String strEnd = new String(byEnd, charset);
  48. return strEnd;
  49. }
  50. }

JAVA 使用工具类进行 DES CBC 加密,解密:

  1. System.out.println("-- Test Cbc --");
  2. String aesKey = "12345678";// DES 密钥长度是8位
  3. String aesIV = "abcdefgh";// DES IV长度是8位
  4. String orgStr = "hello JAVA 2024-06-10";
  5. System.out.println("待加密字符串:" + orgStr);
  6. String encryptedStr = DesUtil.DesEncryptCBC(orgStr, aesKey, aesIV);
  7. System.out.println("加密后:" + encryptedStr);
  8. //自加,自解
  9. String decryptedStr = DesUtil.DesDecryptCBC(encryptedStr, aesKey, aesIV);
  10. System.out.println("自加,自解:" + decryptedStr);

 

效果:

  1. -- Test Cbc --
  2. 待加密字符串:hello JAVA 2024-06-10
  3. 加密后:VkxvjXu1YKvQJF8MPnFvXhFzJgZI4j9I
  4. 自加,自解:hello JAVA 2024-06-10

 

 

三、.NET 加 JAVA 解

先用.NET 对"hello .net 2024-06-10",这个字符串加密,KEY是"12345678",IV为“abcdefgh”,加密结果为:

yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A

 

将这个串复制到JAVA代码,进行解密:

  1. String NETStr ="yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A";
  2. System.out.println(".NET 加密后的串:" + NETStr);
  3. String decryptedStr = DesUtil.DesDecryptCBC(NETStr, aesKey, aesIV);
  4. System.out.println("JAVA解密:" + decryptedStr);

输出结果 :

  1. -- Test Cbc --
  2. .NET 加密后的串:yxEOkYM81hdv0bC1EwgCdE1JSsFyW70A
  3. JAVA解密:hello .net 2024-06-10

 

--

DES ECB 的加密模式,请自行探索。

原文链接:https://www.cnblogs.com/runliuv/p/18250252

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号