当前位置:Gxlcms > PHP教程 > php+c#如何一致实现DES加密解密的示例代码分享

php+c#如何一致实现DES加密解密的示例代码分享

时间:2021-07-01 10:21:17 帮助过:24人阅读

下面小编就为大家带来一篇php实现和c#一致的DES加密解密实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

PHP实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用。以下正确代码是我经过苦苦才找到的。希望大家在系统整合时能用的上。

注意:key的长度为8位以内。

  1. //C# 版DES 加解密算法
  2. using System;
  3. using System.Data;
  4. using System.Configuration;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11. using System.Data.SqlClient;
  12. using System.Security.Cryptography;
  13. using System.IO;
  14. using System.Text;
  15. public class Des{
  16. //加解密密钥
  17. private static string skey = "12345678";
  18. //初始化向量
  19. private static byte[] DESIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
  20. #region DESEnCode DES加密
  21. public static string DESEnCode(string pToEncrypt, string sKey)
  22. {
  23. pToEncrypt = HttpContext.Current.Server.UrlEncode(pToEncrypt);
  24. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  25. byte[] inputByteArray = Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);
  26. //建立加密对象的密钥和偏移量
  27. //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
  28. //使得输入密码必须输入英文文本
  29. des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
  30. des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
  31. MemoryStream ms = new MemoryStream();
  32. CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
  33. cs.Write(inputByteArray, 0, inputByteArray.Length);
  34. cs.FlushFinalBlock();
  35. StringBuilder ret = new StringBuilder();
  36. foreach (byte b in ms.ToArray())
  37. {
  38. ret.AppendFormat("{0:X2}", b);
  39. }
  40. ret.ToString();
  41. return ret.ToString();
  42. }
  43. #endregion
  44. /// <summary>
  45. ///
  46. /// </summary>
  47. /// <param name="pToDecrypt"> 待解密的字符串</param>
  48. /// <param name="sKey"> 解密密钥,要求为8字节,和加密密钥相同</param>
  49. /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
  50. #region DESDeCode DES解密
  51. public static string DESDeCode(string pToDecrypt, string sKey)
  52. {
  53. // HttpContext.Current.Response.Write(pToDecrypt + "<br>" + sKey);
  54. // HttpContext.Current.Response.End();
  55. DESCryptoServiceProvider des = new DESCryptoServiceProvider();
  56. byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
  57. for (int x = 0; x < pToDecrypt.Length / 2; x++)
  58. {
  59. int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
  60. inputByteArray[x] = (byte)i;
  61. }
  62. des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
  63. des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
  64. MemoryStream ms = new MemoryStream();
  65. CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
  66. cs.Write(inputByteArray, 0, inputByteArray.Length);
  67. cs.FlushFinalBlock();
  68. StringBuilder ret = new StringBuilder();
  69. return HttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
  70. }
  71. #endregion
  72. }

  1. <?php
  2. class DES
  3. {
  4. var $key;
  5. var $iv; //偏移量
  6. function DES( $key, $iv=0 ) {
  7. //key长度8例如:1234abcd
  8. $this->key = $key;
  9. if( $iv == 0 ) {
  10. $this->iv = $key; //默认以$key 作为 iv
  11. } else {
  12. $this->iv = $iv; //mcrypt_create_iv ( mcrypt_get_block_size (MCRYPT_DES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM );
  13. }
  14. }
  15. function encrypt($str) {
  16. //加密,返回大写十六进制字符串
  17. $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MODE_CBC );
  18. $str = $this->pkcs5Pad ( $str, $size );
  19. return strtoupper( bin2hex( mcrypt_cbc(MCRYPT_DES, $this->key, $str, MCRYPT_ENCRYPT, $this->iv ) ) );
  20. }
  21. function decrypt($str) {
  22. //解密
  23. $strBin = $this->hex2bin( strtolower( $str ) );
  24. $str = mcrypt_cbc( MCRYPT_DES, $this->key, $strBin, MCRYPT_DECRYPT, $this->iv );
  25. $str = $this->pkcs5Unpad( $str );
  26. return $str;
  27. }
  28. function hex2bin($hexData) {
  29. $binData = "";
  30. for($i = 0; $i < strlen ( $hexData ); $i += 2) {
  31. $binData .= chr ( hexdec ( substr ( $hexData, $i, 2 ) ) );
  32. }
  33. return $binData;
  34. }
  35. function pkcs5Pad($text, $blocksize) {
  36. $pad = $blocksize - (strlen ( $text ) % $blocksize);
  37. return $text . str_repeat ( chr ( $pad ), $pad );
  38. }
  39. function pkcs5Unpad($text) {
  40. $pad = ord ( $text {strlen ( $text ) - 1} );
  41. if ($pad > strlen ( $text ))
  42. return false;
  43. if (strspn ( $text, chr ( $pad ), strlen ( $text ) - $pad ) != $pad)
  44. return false;
  45. return substr ( $text, 0, - 1 * $pad );
  46. }
  47. }
  48. ?>

以上就是php+c#如何一致实现DES加密解密的示例代码分享的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行