GVKun编程网logo

相当于Java三重DES加密/解密的PHP(三重des加密过程)

11

此处将为大家介绍关于相当于Java三重DES加密/解密的PHP的详细内容,并且为您解答有关三重des加密过程的相关问题,此外,我们还将为您介绍关于php3Des加密解密兼容java、c#–在.NET中

此处将为大家介绍关于相当于Java三重DES加密/解密的PHP的详细内容,并且为您解答有关三重des加密过程的相关问题,此外,我们还将为您介绍关于 php 3Des加密解密兼容java、c# – 在.NET中,如何解密使用Java中的PBEWithMD5AndDES加密的值?、C# 加密 Java 解密的问题(DES 加密)、C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密的有用信息。

本文目录一览:

相当于Java三重DES加密/解密的PHP(三重des加密过程)

相当于Java三重DES加密/解密的PHP(三重des加密过程)

我正在尝试使用PHP mcrypt函数解密由Java Triple DES函数加密的密钥,但是没有运气。在下面找到Java代码

import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;public class Encrypt3DES {     private byte[] key;     private byte[] initializationVector;    public Encrypt3DES(){    }    public String encryptText(String plainText, String key) throws Exception{         //----  Use specified 3DES key and IV from other source --------------        byte[] plaintext = plainText.getBytes();        byte[] myIV = key.getBytes();        byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62,        (byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF,        (byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67,        (byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95};        Cipher c3des = Cipher.getInstance("DESede/CBC/PKCS5Padding");        SecretKeySpec    myKey = new SecretKeySpec(tdesKeyData, "DESede");        IvParameterSpec ivspec = new IvParameterSpec(myIV);           c3des.init(Cipher.ENCRYPT_MODE, myKey, ivspec);        byte[] cipherText = c3des.doFinal(plaintext);        sun.misc.BASE64Encoder obj64=new sun.misc.BASE64Encoder();        return obj64.encode(cipherText);    }    public String decryptText(String encryptText, String key) throws Exception{        byte[] initializationVector = key.getBytes();        byte[] tdesKeyData = {(byte)0xA2, (byte)0x15, (byte)0x37, (byte)0x08, (byte)0xCA, (byte)0x62,        (byte)0xC1, (byte)0xD2, (byte)0xF7, (byte)0xF1, (byte)0x93, (byte)0xDF,        (byte)0xD2, (byte)0x15, (byte)0x4F, (byte)0x79, (byte)0x06, (byte)0x67,        (byte)0x7A, (byte)0x82, (byte)0x94, (byte)0x16, (byte)0x32, (byte)0x95};          byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(encryptText);          Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");          SecretKeySpec myKey = new SecretKeySpec(tdesKeyData, "DESede");          IvParameterSpec ivspec = new IvParameterSpec(initializationVector);          decipher.init(Cipher.DECRYPT_MODE, myKey, ivspec);          byte[] plainText = decipher.doFinal(encData);          return new String(plainText);    }}

我想编写一个与上面的cryptoText Java函数等效的PHP函数。在生成由Java代码生成的用于加密的精确IV值时遇到困难,这是解密所必需的。

答案1

小编典典

这等效于Java代码的PHP(我从The
reference的注释20-Sep-200607:56中复制了PKCS#5-padding )mcrypt

function encryptText($plainText, $key) {    $keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2"        . "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06"        . "\x67\x7A\x82\x94\x16\x32\x95";    $padded = pkcs5_pad($plainText,        mcrypt_get_block_size("tripledes", "cbc"));    $encText = mcrypt_encrypt("tripledes", $keyData, $padded, "cbc", $key);    return base64_encode($encText);}function decryptText($encryptText, $key) {    $keyData = "\xA2\x15\x37\x08\xCA\x62\xC1\xD2"        . "\xF7\xF1\x93\xDF\xD2\x15\x4F\x79\x06"        . "\x67\x7A\x82\x94\x16\x32\x95";    $cipherText = base64_decode($encryptText);    $res = mcrypt_decrypt("tripledes", $keyData, $cipherText, "cbc", $key);    $resUnpadded = pkcs5_unpad($res);    return $resUnpadded;}function pkcs5_pad ($text, $blocksize){    $pad = $blocksize - (strlen($text) % $blocksize);    return $text . str_repeat(chr($pad), $pad);}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);}

但是,您应该注意一些问题:

  • 在您的Java代码中,您调用时String.getBytes()未指明编码。如果您的明文包含非ASCII字符(如变音符号),则这会使代码不可移植,因为Java使用系统默认的字符集。如果您可以更改,我当然会这样做。我建议您在Java和PHP的两面都使用utf-8。
  • 您已经对密码密钥进行了硬编码,并将IV用作“密钥”。我绝不是加密专家,但对我来说,这只是感觉不对,而且可能会造成巨大的安全漏洞。
  • 创建一个随机IV,然后将其串联在消息的开头或结尾。由于IV的大小等于密码的块大小,因此您只需从开头或结尾删除那么多字节,就可以轻松地将IV与消息分开。
  • 至于密钥,最好使用某种密钥派生方法从“人工生成”的密码中生成大小合适的密钥。

当然,如果必须满足某些给定的要求,则无法更改方法。

  php 3Des加密解密兼容java

php 3Des加密解密兼容java

<?php
classCrypt3Des
{
    public$key="xxxxxxxxxxxxxxx";//密钥 要与java的转化成的16进制字符串对应
         
    //数据加密
    functionencrypt($input)
    {
        $size= mcrypt_get_block_size(MCRYPT_3DES,''ecb'');
        $input=$this->pkcs5_pad($input,$size);
        $key=str_pad($this->key,24,''0'');
        $td= mcrypt_module_open(MCRYPT_3DES,'''',''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;
    }
    //数据解密
    functiondecrypt($encrypted)
    {
        $encrypted=base64_decode($encrypted);
        $key=str_pad($this->key,24,''0'');
        $td= mcrypt_module_open(MCRYPT_3DES,'''',''ecb'','''');
        $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=$this->pkcs5_unpad($decrypted);
        return$y;
    }
     
    functionpkcs5_pad ($text,$blocksize)
    {
        $pad=$blocksize- (strlen($text) %$blocksize);
        return$text.str_repeat(chr($pad),$pad);
    }
     
    functionpkcs5_unpad($text)
    {
        $pad= ord($text{strlen($text)-1});
        if($pad>strlen($text))
        {
        returnfalse;
        }
        if(strspn($text,chr($pad),strlen($text) -$pad) !=$pad)
        {
            returnfalse;
        }
        returnsubstr($text, 0, -1 *$pad);
    }
  
     
}
?>

c# – 在.NET中,如何解密使用Java中的PBEWithMD5AndDES加密的值?

c# – 在.NET中,如何解密使用Java中的PBEWithMD5AndDES加密的值?

我们正在将遗留 Java应用程序中的数据迁移到我们较新的.NET应用程序中. Java应用程序有一个 MySQL后端,而.NET应用程序有一个sql Server后端.我们有完整的源代码和配置文件,但是没有一个开发Java应用程序的开发人员仍在公司,我们不得不对一些逻辑进行逆向工程以迁移数据.在我们的测试中,我们已经将大部分数据正确地移动了.但是有一列加密值我们遇到了麻烦.

据我所知,Java应用程序中没有显式调用任何方法来在访问列时对列进行加密或解密.相反,加密似乎是在用于访问数据的ORM内自动发生的(Hibernate).我发现了一个名为/entities/TABLENAME.hbm.xml的XML文件,我认为该文件是Hibernate对该列的模型定义. XML文件中的相关行如下:

<property name="columnname" type="stringEncrypted">
    <column name="TBL_COLUMNNAME" not-null="false" unique="false" sql-type="VARCHAR(255)"/>
</property>

请注意,类型是stringEncrypted. stringEncrypted的定义似乎位于/entities/global/User.hbm.xml中,如下所示:

<typedef name="stringEncrypted">
    <param name="encryptorRegisteredname">stringEncrypter</param>
</typedef>

然后stringEncrypter设置显示在/webapp/resources/spring/CompanyName-encryption.xml中,如下所示(当然,已清理):

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans>
        <bean id="stringEncryptor">
            <property name="password">
                <value>PASSWORD</value>
            </property>
            <property name="algorithm">
                <value>PBEWithMD5AndDES</value>
            </property>
            <property name="saltGenerator">
                <ref bean="fixedStringSaltGenerator"/>
            </property>
        </bean>

        <bean id="fixedStringSaltGenerator">
            <property name="salt">
                <value>SALTSALTSALTSALTSALTSALTSALTSALTSALT</value>
            </property>
        </bean>

        <bean id="hibernateEncryptor">
            <property name="registeredname">
                <value>stringEncrypter</value>
            </property>
            <property name="encryptor">
                <ref bean="stringEncryptor" />
            </property>
        </bean>
    </beans>

因此,我认为这告诉我,该列是使用密码PASSWORD和SALTSALTSALTSALTSALTSALTSALTSALTSALT盐加密PBEWithMD5AndDES方法加密的.那么,问题是我如何解密.NET中的列值?

到目前为止,我最好的领先是由汤姆亨德利发布的PKCSKeyGenerator class.使用它,我在.NET中尝试了以下内容:

string encryptedInput = "mG5bz6duwBL3jVCLKyI8Zw=="; // This is an encrypted value copied from MysqL Workbench
string saltString = "SALTSALTSALTSALTSALTSALTSALTSALTSALT";
string keyString = "PASSWORD";
byte[] saltBytes = new byte[saltString.Length * sizeof(char)];

System.Buffer.Blockcopy(saltString.tochararray(),saltBytes,saltBytes.Length);

PKCSKeyGenerator crypto = new PKCSKeyGenerator(
    keyString,// key
    saltBytes,// salt
    13,1); // Magic numbers. I don't really get 'em.
ICryptoTransform ct = crypto.Decryptor;

byte[] cipherBytes = Convert.FromBase64String(encryptedInput);
byte[] clearBytes = ct.TransformFinalBlock(cipherBytes,cipherBytes.Length);
string clearString = Encoding.Unicode.GetString(clearBytes);

当我运行这个时,我得到:

CryptographicException: Bad Data

我查看了其他解密方法,扫描了Java代码以查找可能正在使用的任何其他代码,并修改了PKCSKeyGenerator中的参数,但我没有取得任何进展.我似乎无法使这个解密工作.你有什么建议吗?提前致谢.

解决方法

问题中提到的Tom Hundley的 PKCSGenerator类似乎正确地实现了非标准的“PBEwithMD5andDES”密钥推导算法.您缺少的部分是迭代次数,您在问题中显示为13. (对于DES,segment参数应该为1;对于三重DES,这将增加,具体取决于使用的键控选项.)

在我检查的版本中,Jasypt的密钥派生算法的默认迭代次数仅为1000(StandardPBEByteEncryptor.DEFAULT_KEY_OBTENTION_IteraTIONS的值).

由于您要删除加密,这应该足以让您继续使用.NET.如果您想保留加密,我强烈建议您迁移加密列,以便它们使用PKCS#5中的PBKDF2和AES进行加密.如果你这样做,我会使用更多的迭代,可能是50,000到100,000,具体取决于你可用的资源.

C# 加密 Java 解密的问题(DES 加密)

C# 加密 Java 解密的问题(DES 加密)

@红薯大哥 你好,想跟你请教个问题:

项目需求:C# 加密 Java 解密的问题(DES 加密)可是我以前没弄过加密解密这一方面所以想请教下你

C# 的加密代码:    

 public  static string Encode(string str, string key_64, string IV_64)
          {
             try
             {
                 DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
                 provider.Key = Encoding.ASCII.GetBytes(key_64);
                 provider.IV = Encoding.ASCII.GetBytes(IV_64);
                 byte[] bytes = Encoding.GetEncoding("UTF-8").GetBytes(str);
                 MemoryStream stream = new MemoryStream();
                 CryptoStream stream2 = new CryptoStream(stream, provider.CreateEncryptor(),                     CryptoStreamMode.Write);   
                 stream2.Write(bytes, 0, bytes.Length);
                 stream2.FlushFinalBlock();
                 StringBuilder builder = new StringBuilder();
                 foreach (byte num in stream.ToArray())
                 {
                     builder.AppendFormat("{0:X2}", num);
                 }
                 stream.Close();
                 return builder.ToString();
             }
             catch (Exception) { return null; }
         }

先在我要用 Java 把他加密的字段进行解密不知道该怎么做

----------------------------------------------------- 地下是他给我的加密字段

DES 密文:D15E8C540AA80EB13B0E849774581E68

key1:/SNbdbqW// 密钥
key2:u873T6pp// 向量
ASCII 编码格式

C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

DES加密算法

des对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法。

这里直接贴代码:

 加密结果为Base64字符串。

C#版本DES加密方法 :

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


 

今天关于相当于Java三重DES加密/解密的PHP三重des加密过程的讲解已经结束,谢谢您的阅读,如果想了解更多关于 php 3Des加密解密兼容java、c# – 在.NET中,如何解密使用Java中的PBEWithMD5AndDES加密的值?、C# 加密 Java 解密的问题(DES 加密)、C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密的相关知识,请在本站搜索。

本文标签: