开发者社区> 问答> 正文

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

各自独立: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('\0');
        }

        return newV;
    }

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

}

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);
        }
    }
}

展开
收起
kun坤 2020-06-03 10:32:47 641 0
1 条回答
写回答
取消 提交回答
  • 上帝 没人会吗?######会不会是不同机器上的操作系统的位数不同啊,32位和64位?

    ######DESCryptoServiceProvider? TripleDESCryptoServiceProvider();这个貌似是3DES吧~?###### 我也遇到这样的问题,这是为什么么

    ###### C# padding方式改为Zeros试试 ######这个我自己解决了 忘记怎么解决了 悲剧 !######这个我解决了 但是忘记怎么解决的了 悲剧######

    引用来自“hoho”的答案

    C# padding方式改为Zeros试试
    貌似和这一样的解决方式
    2020-06-03 10:54:58
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-深入浅出网络编程与swoole内核-吴镇宇 立即下载
量子加密通信技术 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载