php-关于DES加密 求帮助!

问题描述

关于DES加密 求帮助!

对接方des加密 是用.net 写的

我用的是php 就大侠把.net的加密程序帮我 转换成 php的

下面是 .NET 的加密程序:

 public class DESEncryptDecrypt
    {
        private string Key;
        private string IV;
        private DESCryptoServiceProvider IDes;
        private byte[] GetKey;
        private byte[] GetIV;
        public DESEncryptDecrypt()
        {
            this.Key = "%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7&*^$^&*%&*%$@#@^";
            this.IV = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            this.Init();
        }

        public DESEncryptDecrypt(string Key)
        {
            this.Key = Key;
            this.IV = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            this.Init();
        }

        public DESEncryptDecrypt(string Key,string IV)
        {
            this.Key = Key;
            this.IV = IV;
            this.Init();
        }

        private void Init()
        {
            this.IDes = new DESCryptoServiceProvider();
            this.IDes.GenerateKey();
            this.GetKey = this.IDes.Key;
            this.IDes.GenerateIV();
            this.GetIV = this.IDes.IV;
        }

        /// <summary>
        /// 获得密钥
        /// </summary>
        /// <returns>密钥</returns>
        private byte[] GetLegalKey()
        {
            string sTemp = this.Key;

            byte[] bytTemp = this.GetKey;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
            {
                sTemp = sTemp.Substring(0, KeyLength);
            }
            else
            {
                if (sTemp.Length < KeyLength)
                {
                    sTemp = sTemp.PadRight(KeyLength, ' ');
                }
            }
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        private byte[] GetLegalIV()
        {
            string sTemp = this.Key;
            byte[] bytTemp = this.GetIV;
            int IVLength = bytTemp.Length;
            if (sTemp.Length > IVLength)
            {
                sTemp = sTemp.Substring(0, IVLength);
            }
            else
            {
                if (sTemp.Length < IVLength)
                {
                    sTemp = sTemp.PadRight(IVLength, ' ');
                }
            }
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }

        /// <summary>
        /// 加密算法
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string Encrypt(string data)
        {

            //将要加密的数据编码为字节数组
            byte[] encrypt_data = System.Text.Encoding.UTF8.GetBytes(data);    //如果使用Unicode编码,支持中文加密
            //创建流,保存加密后的数据
            MemoryStream ms = new MemoryStream();
            //创建加密流
            CryptoStream cs = new CryptoStream(ms, this.IDes.CreateEncryptor(this.GetLegalKey(), this.GetLegalIV()), CryptoStreamMode.Write);
            //调用Write方法将加密后的结果写到 流 中
            cs.Write(encrypt_data, 0, encrypt_data.Length);
            //将数据从流写入内存(这句不能少,否则在从内存导出到字符串的时候会出现字符丢失)
            cs.FlushFinalBlock();
            //ms.ToString(); ==>将流写入字节数组中
            string result = Convert.ToBase64String(ms.ToArray());
            ms.Close();
            cs.Close();
            return result;
        }

        /// <summary>
        /// 解密算法
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public string Decrypt(string data)
        {

            byte[] decrypt_data = Convert.FromBase64String(data);

            MemoryStream ms = new MemoryStream();

            CryptoStream cs = new CryptoStream(ms, this.IDes.CreateDecryptor(this.GetLegalKey(), this.GetLegalIV()), CryptoStreamMode.Write);
            cs.Write(decrypt_data, 0, decrypt_data.Length);
            cs.FlushFinalBlock();
            string result = System.Text.Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            cs.Close();

            return result;
        }
    }

解决方案

http://php.net/manual/en/function.mcrypt-encrypt.php

http://stackoverflow.com/questions/7314901/how-to-add-remove-pkcs7-padding-from-an-aes-encrypted-string/7324793#7324793

解决方案二:

http://www.cnblogs.com/cocowool/archive/2009/01/07/1371309.html

时间: 2024-10-03 04:46:40

php-关于DES加密 求帮助!的相关文章

des 加解密-DES加密不一致问题,求大神解决

问题描述 DES加密不一致问题,求大神解决 各位大神 小弟在做一个文件传输项目 对方系统用的是c#写的des加解密算法 密钥:Bank2014 加密偏移量:Bank2014 加密模式:CipherMode.CBC.PaddingMode.PKCS5 块长度:64 文件编码:GBK 小弟这边用的是c写的加解密算法我就只设置了密钥:Bank2014 代码是参照大赛写的 位置在:http://www.iteye.com/topic/478024 目前的问题就是对方公司加密出来的文件跟我加密出来的文件不

des加密时密钥问题-关于C# DES加密时密钥问题 求解答

问题描述 关于C# DES加密时密钥问题 求解答 为什么有些des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 是这样写 而有一些是这样写 des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s

求C#DES加密的key可为任意长度字符或为空代码

问题描述 其它java,C代码的DES的KEY可任意长度字符或为空,现在我使用的C#des加密算法,当key为空时出错,请高手支招,贴出key可任意长度字符的代码网上的代码,key不可为空,必须要8位尹学渊用VC++写的,可key为空,加密结果到到其它工具或其它语言写的工具上去 反解,并且一切正常尹学渊用VC++写的(http://www.cnblogs.com/erwin/archive/2009/04/14/1435288.html#2346568),key为空得到的密文可到其它标准DES上

关于java解密的问题,C#DES加密过的数据,用java解密

问题描述 关于java解密的问题,C#DES加密过的数据,用java解密 C#加密解密代码如下 public static String sKey = "xxxxxx"; /// <summary> /// 加密 /// </summary> /// <param name="Text"></param> /// <returns></returns> public static String

DES加密解密

问题描述 上面是加密,下面是解密加密正常,解密有错误,求大神指导publicvoidSEnc(Stringstr)throwsException{FileInputStreamf=newFileInputStream("D:/key.dat");intnum=f.available();byte[]keybyte=newbyte[num];f.read(keybyte);SecretKeykk=newSecretKeySpec(keybyte,"DESede");C

C# des加密解密

问题描述 java的DES加密解密转成C#的des加密解密java的DES加密解密代码/****使用DES加密与解密,可对byte[],String类型进行加密与解密密文可使用String,byte[]存储.**方法:voidgetKey(StringstrKey)从strKey的字条生成一个Key*setKey()从默认defaultKey的字条生成一个Key*StringgetEncString(StringstrMing)对strMing进行加密,返回String密文String*getD

银联-c++ des加密出现的问题

问题描述 c++ des加密出现的问题 `这是DESCode.h的代码 #include #include #include #ifndef DESCODE #define DESCODE #define DES_ENCODE 0 #define DES_DECODE 1 class DESCODE { private: char Key[16][48]; char PassWord[8]; int InitKey(); int IPChange(char *Source,char *L,cha

源码推荐:使用C#编写DES加密程序的framework

程序|加密                    源码推荐:使用C#编写DES加密程序的framework                                Batman    还是我的老观点,对于新东西我们要不断练习才能够掌握它.所以我就不写些抽象的概念了,打算以后不定期给出一些实际的代码,呵呵在微软的帮助中,喜欢把它带的例子称为它的新技术的framework,我在实际编程中确实感觉如此,我们往往是根据这些实例代码来编写自己的实际应用的,所以我也用了framework这个名词. :

用DES加密数据库信息,增强Asp.net的安全性(1)--分析

asp.net|安全|安全性|加密|数据|数据库 在实际的数据库系统开发中,我们一般都是把数据库的连接字符串放在了Asp.net的配置文件Config.web中,连接字符串一般如下:  <appSettings>    <add key="ConnStr" value="server=192.168.2.36;database=Mdata;uid=sa;password=111000" />  </appSettings>