GVKun编程网logo

php 3Des加密解密兼容java(php aes加密 java无法解密)

14

对于想了解php3Des加密解密兼容java的读者,本文将提供新的信息,我们将详细介绍phpaes加密java无法解密,并且为您提供关于3DES加密解密、C#和PHP加密结果一致的DES加密解密算法。

对于想了解 php 3Des加密解密兼容java的读者,本文将提供新的信息,我们将详细介绍php aes加密 java无法解密,并且为您提供关于3DES加密解密、C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密、DES加密解密->java实现、Golang里的AES、DES、3DES加解密,支持ECB、CBC等多种模式组合,兼容JAVA、PHP等语言的有价值信息。

本文目录一览:

  php 3Des加密解密兼容java(php aes加密 java无法解密)

php 3Des加密解密兼容java(php aes加密 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);
    }
  
     
}
?>

3DES加密解密

3DES加密解密


请问这段java代码怎么用php实现对应的加密代码,谢谢

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


 

DES加密解密->java实现

DES加密解密->java实现

DES加密解密涉及到的JAVA类

Cipher

此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心
为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。
转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有以下形式:
“算法/模式/填充”或 “算法”
(后一种情况下,使用模式和填充方案特定于提供者的默认值)。例如,以下是有效的转换:
Cipher c = Cipher.getInstance(“DES/CBC/PKCS5Padding”);
使用 CFB 和 OFB 之类的模式,Cipher 块可以加密单元中小于该 Cipher 的实际块大小的数据。请求这样一个模式时,可以指定一次处理的位数(可选):将此数添加到模式名称中,正如 “DES/CFB8/NoPadding” 和 “DES/OFB32/PKCS5Padding” 转换所示。如果未指定该数,则将使用特定于提供者的默认值。(例如,SunJCE 提供者对 DES 使用默认的 64 位)。因此,通过使用如 CFB8 或 OFB8 的 8 位模式,Cipher 块可以被转换为面向字节的 Cipher 流。
这里写图片描述
这里写图片描述
这里写图片描述

SecretKeyFactory

此类表示秘密密钥的工厂。
密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),反之亦然。秘密密钥工厂只对秘密(对称)密钥进行操作。
密钥工厂为双工模式,即其允许根据给定密钥规范(密钥材料)构建不透明密钥对象,或以适当格式获取密钥对象的底层密钥材料。
应用程序开发人员应参阅其提供者文档,找出 generateSecret 和 getKeySpec 方法所支持的密钥规范。例如,”SunJCE” 提供者提供的 DES 秘密密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示形式,并且该提供者的 Triple DES 密钥的秘密密钥工厂支持 DESedeKeySpec 作为 Triple DES 密钥的透明表示形式。
这里写图片描述

KeySpec

public interface KeySpec组成加密密钥的密钥内容的(透明)规范。
如果密钥存储在硬件设备上,则其规范可以包含有助于标识该设备上的密钥的信息。
用特定于算法的方法或独立于算法的编码格式(例如,ASN.1)可以指定密钥。例如,DSA 专用密钥可以由其组件 x、p、q 和 g 指定(请参见 DSAPrivateKeySpec),或使用其 DER 编码指定(请参见 PKCS8EncodedKeySpec)。
此接口不包含任何方法或常量。它仅用于将所有密钥规范分组,并为其提供类型安全。所有密钥规范都必须实现此接口。

在实现类中可以看到DESKeySpec。
这里写图片描述

SecretKey

public interface SecretKeyextends Key秘密(对称)密钥。
此接口不包含方法或常量。其唯一目的是分组秘密密钥(并为其提供类型安全)。
此接口的提供者实现必须改写继承自 java.lang.Object 的 equals 和 hashCode 方法,以便根据底层密钥材料而不是根据引用进行秘密密钥比较。
实现此接口的密钥以其编码格式(请参阅 getFormat)返回字符串 RAW,并返回作为 getEncoded 方法调用结果的原始密钥字节。(getFormat 和 getEncoded 方法继承自 java.security.Key 父接口。)
利用以下方法即可获得秘钥。

SecretKey secretKey = secretKeyFactory.generateSecret(keySpec); 然后利用cipher的init方法即可初始化cipher对象,进而可以进行加密和解密操作。

cipher.init(Cipher.ENCRYPT_MODE, secretKey,new SecureRandom());

实现类DESEncryptTools

package com.david.des;
import java.security.SecureRandom;
import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/** * * 项目名称:CipherTest * 类 名 称:AESEncryptTools * 类 描 述:DES加密解密算法 * 创 建 人:david * 创建时间:2016年5月2日 下午8:00:21 * Copyright (c) david-版权所有 */
public final class DESEncryptTools {

    //加密算是是des
    private static final String ALGORITHM = "DES";
    //转换格式
    private static final String TRANSFORMATION = "DES/ECB/PKCS5Padding";

    //利用8个字节64位的key给src加密
    @SuppressWarnings("unused")
    public static byte[] encrypt(byte[] src,byte[]key)
    {
        try {
            //加密
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
            KeySpec keySpec = new DESKeySpec(key);
            SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey,new SecureRandom());
            byte[] enMsgBytes = cipher.doFinal(src);    
            return enMsgBytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //利用8个字节64位的key给src解密
    @SuppressWarnings("unused")
    public static byte[] decrypt(byte[] encryptBytes,byte[]key){
        try {
            //解密
            //Cipher deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            Cipher deCipher = Cipher.getInstance(TRANSFORMATION);
            SecretKeyFactory deDecretKeyFactory = SecretKeyFactory.getInstance(ALGORITHM);
            KeySpec deKeySpec = new DESKeySpec(key);
            SecretKey deSecretKey = deDecretKeyFactory.generateSecret(deKeySpec);
            deCipher.init(Cipher.DECRYPT_MODE, deSecretKey,new SecureRandom());
            byte[] deMsgBytes = deCipher.doFinal(encryptBytes);
            return deMsgBytes;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

测试类

package com.david.des;

public class DesMainTest {

    private static String key = "12345678";

    public static void main(String[] args) throws Exception{
        String msg = "hello world. 你好,DES";
        System.out.println("加密前:"+msg);
        byte[] encryptBytes = DESEncryptTools.encrypt(msg.getBytes(),key.getBytes());
        System.out.println("加密后:"+new String(encryptBytes));
        byte[] deMsgBytes = DESEncryptTools.decrypt(encryptBytes,key.getBytes());
        System.out.println("解密后:"+new String(deMsgBytes));
    }
}

测试结果

这里写图片描述

总结

学习了一下DES加密解密算法!

Golang里的AES、DES、3DES加解密,支持ECB、CBC等多种模式组合,兼容JAVA、PHP等语言

Golang里的AES、DES、3DES加解密,支持ECB、CBC等多种模式组合,兼容JAVA、PHP等语言

Openssl encryption:OpenSSL库的功能包装,用于对称和非对称加密和解密。

  • AES-ECB
  • AES-CBC
  • DES-ECB
  • DES-CBC
  • 3DES-ECB
  • 3DES-CBC

安装

go get -u github.com/forgoer/openssl

用法

AES

密钥的长度可以是16/24/32个字符(128/192/256位)。

AES-ECB:

src := []byte("123456")
key := []byte("1234567890123456")
dst , _ := openssl.AesECBEncrypt(src, key, openssl.PKCS7_PADDING)
fmt.Printf(base64.StdEncoding.EncodeToString(dst))  // yXVUkR45PFz0UfpbDB8/ew==

dst , _ = openssl.AesECBDecrypt(dst, key, openssl.PKCS7_PADDING)
fmt.Println(string(dst)) // 123456

AES-CBC:

src := []byte("123456")
key := []byte("1234567890123456")
iv := []byte("1234567890123456")
dst , _ := openssl.AesCBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
fmt.Println(base64.StdEncoding.EncodeToString(dst)) // 1jdzWuniG6UMtoa3T6uNLA==

dst , _ = openssl.AesCBCDecrypt(dst, key, iv, openssl.PKCS7_PADDING)
fmt.Println(string(dst)) // 123456

DES

密钥的长度必须为8个字符(64位)。

DES-ECB:

openssl.DesECBEncrypt(src, key, openssl.PKCS7_PADDING)
openssl.DesECBDecrypt(src, key, openssl.PKCS7_PADDING)

DES-CBC:

openssl.DesCBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
openssl.DesCBCDecrypt(src, key, iv, openssl.PKCS7_PADDING)

3DES

密钥的长度必须为24个字符(192位)。

3DES-ECB:

openssl.Des3ECBEncrypt(src, key, openssl.PKCS7_PADDING)
openssl.Des3ECBDecrypt(src, key, openssl.PKCS7_PADDING)

3DES-CBC:

openssl.Des3CBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
openssl.Des3CBCDecrypt(src, key, iv, openssl.PKCS7_PADDING)

今天关于 php 3Des加密解密兼容javaphp aes加密 java无法解密的讲解已经结束,谢谢您的阅读,如果想了解更多关于3DES加密解密、C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密、DES加密解密->java实现、Golang里的AES、DES、3DES加解密,支持ECB、CBC等多种模式组合,兼容JAVA、PHP等语言的相关知识,请在本站搜索。

本文标签: