C# 如何 和php 的des 加密解密 保持一致

发布于 2021-11-18 07:27:13 字数 6105 浏览 797 评论 8

各自独立:php,。net自己加密解密是没问题的

首先测试过 MD5是一样的。

但是用php和。net加密的结果不一样
用php加密的数据用。net解密就报错
请问为什么???



php 代码是先写的 不能更改得 让c#来配合php 囧

<?php
 $keys ='key';
 echo do_mencrypt('12345678',$keys);
 echo '<br/>'.md5($keys);

 
 
 /**
*加密函数
*$input 要被加密的字符串
*$key 密钥
*/
function do_mencrypt($input, $key)
    {
        $input = base64_encode(trim($input));
        $key = substr(md5($key), 0, 24);
        $td = mcrypt_module_open('tripledes', '', 'ecb', '');
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $encrypted_data = mcrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return trim(base64_encode($encrypted_data));
    }
    
/**
*解密函数
*$input 要被解密的字符串
*$key 密钥
*/
function do_mdecrypt($input, $key)
    {
        $input = base64_decode(trim($input));
        $td = mcrypt_module_open('tripledes', '', 'ecb', '');
        $key = substr(md5($key), 0, 24);
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $decrypted_data = mdecrypt_generic($td, $input);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        return trim(base64_decode($decrypted_data));
     }
?>
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace detest
{
    public class dllEncrypt
    {
        //矢量,矢量可以为空
        private const string sIV = "qcDY6X+aPLw=";
        //构造一个对称算法
        private SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();

        public dllEncrypt() { }

        #region public string EncryptString(string Value)
        ///
        /// 加密字符串
        ///
        /// 输入的字符串
        /// 加密后的字符串
        public string EncryptString(string Value,string sKey)
        {
            ICryptoTransform ct;
            MemoryStream ms;
            CryptoStream cs;
            byte[] byt;

            sKey = Md5(sKey);
            sKey = sKey.Substring(0,24);
            mCSP.Key = Encoding.UTF8.GetBytes(sKey);
            Value = Convert.ToBase64String(Encoding.UTF8.GetBytes(Value));
            //mCSP.IV = Convert.FromBase64String(sIV);
            //指定加密的运算模式
            mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
            //获取或设置加密算法的填充模式
            mCSP.Padding = System.Security.Cryptography.PaddingMode.None;
            mCSP.GenerateIV();
            ct = mCSP.CreateEncryptor();
            byt = padding(Encoding.UTF8.GetBytes(Value));
            ms = new MemoryStream();
            cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
            cs.Write(byt, 0, byt.Length);
            cs.FlushFinalBlock();
            cs.Close();
            return Convert.ToBase64String(ms.ToArray());
        }
        #endregion

        #region public string DecryptString(string Value)
        ///
        /// 解密字符串
        ///
        /// 加过密的字符串
        /// 解密后的字符串
        public string DecryptString(string Value, string sKey)
        {
            ICryptoTransform ct;
            MemoryStream ms;
            CryptoStream cs;
            byte[] byt;
            sKey = Md5(sKey);
            sKey = sKey.Substring(0, 24);
            mCSP.Key = Encoding.UTF8.GetBytes(sKey);
            //mCSP.IV = Convert.FromBase64String(sIV);
            mCSP.Mode = System.Security.Cryptography.CipherMode.ECB;
            mCSP.Padding = System.Security.Cryptography.PaddingMode.None;
            mCSP.GenerateIV();
            ct = mCSP.CreateDecryptor();
            byt = Convert.FromBase64String(Value);
            Console.WriteLine(Encoding.UTF8.GetString(byt));
            ms = new MemoryStream();
            cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
            cs.Write(byt, 0, byt.Length);
            cs.FlushFinalBlock();
            cs.Close();
            String re = Encoding.UTF8.GetString(ms.ToArray());
            re = upPadding(re);
            re = Encoding.UTF8.GetString(Convert.FromBase64String(re));
            return re;
        }
        #endregion



        public static string Md5(string str)
        {

            string pwd = "";
            MD5 md5 = MD5.Create();//实例化一个md5对像
            // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
            // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符

                pwd = pwd + s[i].ToString("X");

            }
            return pwd.ToLower();

        }

         static byte[] padding(byte[] source)
        {
            int len = source.Length;
            int s = len / 8;
            if (len % 8 > 0)
            {
                s = s + 1;
            }

            byte[] newV = new byte[s * 8];
            for (int i = 0; i < len; i++)
            {
                newV[i] = source[i];
            }
            for (int i = len; i < s * 8 - len; i++)
            {
                newV[i] = Convert.ToByte('');
            }

            return newV;
        }

        string upPadding(string p) 
        { 
           return p = p.Replace("","");
        }
    }

}

using System;
using System.Collections.Generic;
using System.Text;
namespace detest
{
    class Program
    {
        static void Main(string[] args)
        {
            String key = "key";
            dllEncrypt ec = new dllEncrypt();
            String en = ec.EncryptString("123r", key);
            Console.WriteLine(en);
            String ot = ec.DecryptString(en, key);
            Console.WriteLine(ot);
            Console.Write(1);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

空城仅有旧梦在 2021-11-24 14:11:12

C# padding方式改为Zeros试试

尐偏执 2021-11-24 14:08:44

这个我解决了 但是忘记怎么解决的了 悲剧

南汐寒笙箫 2021-11-24 12:50:11

这个我自己解决了 忘记怎么解决了 悲剧 !

像你 2021-11-24 12:27:35

C# padding方式改为Zeros试试

坚持沉默 2021-11-24 12:04:02

我也遇到这样的问题,这是为什么么

挽清梦 2021-11-24 10:32:17

DESCryptoServiceProvider?

TripleDESCryptoServiceProvider();这个貌似是3DES吧~?

落墨 2021-11-24 07:19:51

会不会是不同机器上的操作系统的位数不同啊,32位和64位?

无法言说的痛 2021-11-22 20:29:02

上帝 没人会吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文