在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES。

DES和TripleDES之间的关系可以参考下面的博文。 
对称加密DES和TripleDES

重点内容是,如何分别在C#,PHP中使用TripleDES,然后可以让二者可以解密对方发送的加密内容。

废话不多说,直接上两端的代码。

C#代码

  1. using System;
  2. using System.Security.Cryptography;
  3. using System.Text;
  4. namespace TripleDes
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. //加密的字符串
  11. string source = "Happy Father's Day!";
  12. //用来加密的key 但是最终用在des加密的key
  13. //是这个key的 md5 hash
  14. string sourceKey = "home";
  15. //获取原始key值的 md5 hash
  16. byte[] keyBytes = GetKeyMd5Hash(sourceKey);
  17. string encryptedStr = DesEncrypt(source, keyBytes);
  18. Console.WriteLine("encrypted string: "+ encryptedStr);
  19. string decryptedStr = DesDecrypt(encryptedStr, keyBytes);
  20. Console.WriteLine("Decrypted String: " + decryptedStr);
  21. Console.ReadKey();
  22. }
  23. /// <summary>
  24. /// 获取加密key的 md5 hash,最终DES加密的时候使用这个hash值
  25. /// </summary>
  26. /// <param name="key">原始key值</param>
  27. /// <returns></returns>
  28. public static byte[] GetKeyMd5Hash(string key)
  29. {
  30. MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
  31. byte[] keyBytes = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
  32. hashmd5.Clear();
  33. return keyBytes;
  34. }
  35. /// <summary>
  36. /// TripleDES 加密
  37. /// </summary>
  38. /// <param name="toEncrypt"></param>
  39. /// <param name="privateKey"></param>
  40. /// <returns></returns>
  41. public static string DesEncrypt(string toEncrypt, byte[] privateKey)
  42. {
  43. byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
  44. TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
  45. {
  46. Key = privateKey,
  47. Mode = CipherMode.ECB,
  48. Padding = PaddingMode.PKCS7
  49. };
  50. ICryptoTransform cTransform = tdes.CreateEncryptor();
  51. byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
  52. tdes.Clear();
  53. return Convert.ToBase64String(resultArray, 0, resultArray.Length);
  54. }
  55. /// <summary>
  56. /// TripleDES解密
  57. /// </summary>
  58. /// <param name="toDecrypt"></param>
  59. /// <param name="privateKey"></param>
  60. /// <returns></returns>
  61. public static string DesDecrypt(string toDecrypt, byte[] privateKey)
  62. {
  63. //先base64解密 因为加密的时候最后走了一道base64加密
  64. byte[] enBytes = Convert.FromBase64String(toDecrypt);
  65. TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider
  66. {
  67. Key = privateKey,
  68. Mode = CipherMode.ECB,
  69. Padding = PaddingMode.PKCS7
  70. };
  71. ICryptoTransform cTransform = tdes.CreateDecryptor();
  72. byte[] resultArray = cTransform.TransformFinalBlock(enBytes, 0, enBytes.Length);
  73. tdes.Clear();
  74. return Encoding.UTF8.GetString(resultArray);
  75. }
  76. }
  77. }

php代码

  1. <?php
  2. /*
  3. TripleDES加密
  4. */
  5. function DesEncrypt($data)
  6. {
  7. //Pad for PKCS7
  8. $blockSize = mcrypt_get_block_size('tripledes', 'ecb');
  9. $len = strlen($data);
  10. $pad = $blockSize - ($len % $blockSize);
  11. $data .= str_repeat(chr($pad), $pad);
  12. $key = "home";
  13. $key = md5($key,TRUE);
  14. $key .= substr($key,0,8); //comment this if you use 168 bits long key
  15. //Encrypt data
  16. $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
  17. return base64_encode($encData);
  18. }
  19. /*
  20. TripleDES解密
  21. */
  22. function DesDecrypt($data)
  23. {
  24. $key = "home";
  25. $key = md5($key, TRUE);
  26. $key .= substr($key, 0, 8);
  27. //Decrypt data
  28. $fromBase64Str = base64_decode($data);
  29. $decData = mcrypt_decrypt('tripledes', $key, $fromBase64Str, 'ecb');
  30. return $decData;
  31. }
  32. /*
  33. 测试
  34. */
  35. $encryptStr = DesEncrypt("Happy Father's Day!");
  36. echo "encrypted string: $encryptStr</br>";
  37. $decryptStr = DesDecrypt($encryptStr);
  38. echo "decrypted string: $decryptStr";
  39. ?>

这样以来,PHP就可以解密C#加密后的内容,同样C#也可以解密PHP加密后的内容。

虽然都是TripleDES加密算法,但是因为C#,PHP两种语言加密使用的默认mode,padding都不一样,如果直接使用各自语言自带的TripleDES,会导致双方使用同样的密钥,加密同样的内容后,加密结果不一样,进而就不能相互解密了。

关于各种语言使用的加密模式等内容,可以多多Google。就像RSA加密算法,C#,Java,PHP三者使用的密钥格式都不一样,JAVA惯用ASN,C#惯用XML,而PHP惯用PEM。这样就导致各自不能互通。 
p.s.还没研究出三者RSA互通的方法。

参考文章:

加密算法模式 填充

PHP padding PKCS7

How to add/remove PKCS7 padding from an AES encrypted string

Triple DES with PCSK7 and ECB between PHP and .NET

今天父亲节,祝老爸节日快乐!

TripleDES之C#和PHP之间加密解密的更多相关文章

  1. C与C#之间使用AES加密解密算法

    目的:C语言写的客户端加密数据,数据发送到C#写的服务端,服务端解密. 保证C与C#之间加密解密AES的配置和模式一直. AES: AES是对称加密算法,关键点: 密钥长度,明文长度,密文长度 密钥长 ...

  2. mysql中DES加密解密

      DES_DECRYPT(crypt_str[,key_str]) 使用DES_ENCRYPT()加密一个字符串.若出现错误,这个函数会返回 NULL. 注意,这个函数只有当MySQL在SSL 的支 ...

  3. js加密后台加密解密以及验证码

    该文档为转载内容: 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 ...

  4. 使用X.509数字证书加密解密实务(三)-- 使用RSA证书结合对称加密技术加密长数据

    一.  使用证书结合对称加密算法加.解密长数据 上一章节讨论了如何使用RSA证书加密数据,文中提到:“Dotnet的RSA实现有个特点,它必须要在明文中添加一些随机数,所以明文不能把128字节占满,实 ...

  5. PHP的学习--RSA加密解密

    PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...

  6. PHP AES的加密解密

    AES加密算法 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  7. .Net中的加密解密

    返回博客列表 转 .Net中的加密解密 李朝强 发布时间: 2015/11/23 12:55 阅读: 33 收藏: 3 点赞: 0 评论: 0 在一些比较重要的应用场景中,通过网络传递数据需要进行加密 ...

  8. 【代码笔记】iOS-3DES+Base64加密解密

    一,工程目录. 二,代码. RootViewController.m #import "RootViewController.h" #import "NSString+T ...

  9. Base64加密解密原理以及代码实现(VC++)

    Base64加密解密原理以及代码实现 转自:http://blog.csdn.net/jacky_dai/article/details/4698461 1. Base64使用A--Z,a--z,0- ...

随机推荐

  1. maven 打包可执行jar的方法

    转自:http://blog.csdn.net/johnnywww/article/details/7964326 1.修改pom.xml增加如下内容 <plugin> <group ...

  2. ecshop中smarty最常用的6大基本语法

    模板制作比较核心的其实就是变量的使用,因为这些就是数据的根本,想从数据库里获取数据并显示在界面就必须使用smarty来展示,下面是关于smarty的介绍和使用.Smarty是一个php模板引擎,它分开 ...

  3. GB2312码表

    GB2312码表 code +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F A1A0 . . · ˉ ˇ ¨ " 々 — - | … ‘ ’ ...

  4. 2014秋C++ 第9周项目 循环程序设计

    课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703.课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课 ...

  5. javascript数组操作大全,数组方法总汇

    1. shift:删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4,5] ...

  6. 【Ubuntu】Ubuntu bug “Reached target Shutdown”

    在使用 Ubuntu-16.04.3-server-amd64.iso 版本(参考官方,iso下载地址)的时候,遇到一个Ubuntu的Bug,后来查了一下,在官方看到,目前还是Unassigned: ...

  7. 微信小程序 - 时间轴(组件)

    更新日期: 2019/3/6:首次发布 2019/3/7:增加content和date自定义(具体使用看示例) 时间轴 参数: 1. data(新闻列表数据)- 2019/3/6 2. content ...

  8. AndroidStudio不自己主动加入新创建的文件到VCS

    从远程仓库下载了一份源代码,版本号控制是用的SVN.但发现了一个问题.改动和删除文件时,版本号管理都有记录. 可是假设我新建一个文件时.却发现没有自己主动关联到VCS,也不能手动加入到VCS中,这样我 ...

  9. Eclipse经常使用快捷键

    Eclipse经常使用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(中文简体操作系统是Alt+/) 高速修正:Ctrl+1 单词补全:Alt+/ 打开外部Java文档:Shift+F2 ...

  10. PC版收音机—龙卷风收音机

      龙卷风收音机-龙卷风   文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论