C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密
DES加密算法
des对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。
这里直接贴代码:
加密结果为Base64字符串。
C#版本DES加密方法 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /// <summary> /// 加密 算法 /// 参考,C# php 通用加密算法。 Des加密 /// http://www.it1352.com/422514.html /// </summary> public class DESEncrypt { /// <summary> /// 加密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static string Encrypt( string Text) { return Encrypt(Text, "abcd1234" ); // 这里更新为一个至少8位长度的密码 } public static string Encrypt( string strText, string decryptKey) { string outString = "" ; string result = string .Empty; try { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Mode = CipherMode.ECB; byte [] inputByteArray = Encoding.UTF8.GetBytes(strText); des.Key = ASCIIEncoding.ASCII.GetBytes(decryptKey.Substring(0, 8)); //8位 偏移向量,一般为8位。 des.IV = ASCIIEncoding.ASCII.GetBytes(decryptKey.Substring(0, 8)); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); byte [] bytelist = ms.ToArray(); outString = Convert.ToBase64String(bytelist); // 转base64位输出 //StringBuilder ret = new StringBuilder(); //foreach (byte b in ms.ToArray()) //{ // ret.AppendFormat("{0:X2}", b); //} //return ret.ToString(); } catch (System.Exception) { outString = "" ; } return outString; } #region ========解密======== /// <summary> /// 解密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static string Decrypt( string Text) { return Decrypt(Text, "abcd1234" ); } /// <summary> /// 解密数据 /// </summary> /// <param name="Text"></param> /// <param name="sKey"></param> /// <returns></returns> public static string Decrypt( string Text, string sKey) { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); des.Mode = CipherMode.ECB; //int len; //len = Text.Length / 2; //byte[] inputByteArray = new byte[len]; //int x, i; //for (x = 0; x < len; x++) //{ // i = Convert.ToInt32(Text.Substring(x * 2, 2), 16); // inputByteArray[x] = (byte)i; //} byte [] inputByteArray; inputByteArray = Convert.FromBase64String(Text); des.Key = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8)); //8位 des.IV = ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8)); //des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); //des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8)); System.IO.MemoryStream ms = new System.IO.MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Encoding.Default.GetString(ms.ToArray()); } #endregion } |
PHP版本的des加密代码:
<?php
/* * DES加密、解密 * To change this template file, choose Tools | Templates * and open the template in the editor. */ /* 秘钥:abcd1234,des加密ecb模式。 输入: 输出: */ class Des { public static function encrypt($key, $input) { $size = mcrypt_get_block_size('des', 'ecb'); // $size = 8 ; $input = self::pkcs5_pad($input, $size); // // $key = $this->key; $td = mcrypt_module_open('des', '', 'ecb', ''); $iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); //向量随机 @mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $data; } public static function decrypt($key, $encrypted) { $encrypted = base64_decode($encrypted); // $key =$this->key; $td = mcrypt_module_open('des','','ecb',''); //使用MCRYPT_DES算法,cbc模式 $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND); $ks = mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td, $key, $iv); //初始处理 $decrypted = mdecrypt_generic($td, $encrypted); //解密 mcrypt_generic_deinit($td); //结束 mcrypt_module_close($td); $y= self::pkcs5_unpad($decrypted); return $y; } public static function pkcs5_pad($text, $blocksize) { $pad = $blocksize - (strlen($text) % $blocksize); return $text . str_repeat(chr($pad), $pad); } public static function pkcs5_unpad($text) { $pad = ord($text{strlen($text)-1}); if ($pad > strlen($text)) return false; if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; return substr($text, 0, -1 * $pad); }
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示