Über PHP- und JAVA-3DES-Verschlüsselungsprobleme
给我你的怀抱
给我你的怀抱 2017-06-15 09:21:44
0
1
914

Ich möchte eine Verschlüsselungsklasse in Java mit PHP schreiben, aber ich habe diese Art, sie in Java zu schreiben, gesehen und sie bereitete mir große Kopfschmerzen. Völlig unlogisch. Ich habe eine vollständige Klasse gefunden und wollte darauf verweisen. Nach vielen Experimenten konnte ich die von mir hochgeladene Verschlüsselungsklasse nicht in PHP übersetzen. Bitte hilf mir. Danke.

/**

  • 3Des-Hilfsklasse

  • */

öffentliche Klasse ThreeDESUtil {

private static final String Algorithm = "DESede"; // 定义 加密算法,可用
                                                    // DES,DESede,Blowfish
private static byte[] keybyte = { 0x11, 0x28, 0x4F, 0x58, (byte) 0x88,
        0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51, (byte) 0xCB, (byte) 0xDD,
        0x55, 0x66, 0x77, 0x29, 0x74, (byte) 0x98, 0x30, 0x40, 0x36,
        (byte) 0xE2 }; // 24字节的密钥

public static String encryptMode(String src) {
    String encrypt = null;
    try {
        byte[] ret = encryptMode(src.getBytes("UTF-8"));
        encrypt = new String(Base64.encode(ret));
        encrypt = encrypt.replaceAll("=", "Q");
    } catch (Exception e) {
        logger.error("ThreeDES Error");
    }
    return encrypt;
}



/**
 * 加密
 * 
 * @param src
 * @return
 */
private static byte[] encryptMode(byte[] src) {
    try {
        // 生成密钥
        SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
        // 加密
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, deskey);
        return c1.doFinal(src);
    } catch (Exception e) {
        logger.error("ThreeDES Error");
    }
    return null;
}

// for test
public static void main(String[] args) {

    String szSrc = "12345678";

    String encoded = encryptMode(szSrc);
    System.out.println("加密后的字符串:" + encoded);
    //1xZ9Hssih5z0pegyf7aUcgQQ

}

}

Das Obige ist die Java-Klasse, die ich in PHP konvertieren muss,

Im Anhang finden Sie den Referenzartikel unten
/q/10...

Das Folgende ist der PHP-Code, den ich nach Referenz geschrieben habe.

<?php

$EasyCrypt3Des = new EasyCrypt3Des();
echo $EasyCrypt3Des->encrypt('12345678');
//java 结果 '1xZ9Hssih5z0pegyf7aUcgQQ';
exit;


class EasyCrypt3Des {
    private $_key = array("0x11", "0x28", "0x4F", "0x58", "0x88", "0x10", "0x40", "0x38", "0x28", "0x25", "0x79", "0x51","0xCB", "0xDD", "0x55", "0x66", "0x77", "0x29", "0x74", "0x98", "0x30", "0x40", "0x36", "0xE2");
    private $keyStr = "";
    public function __construct() {
        foreach($this->_key as $keyItem) {
            $this->keyStr .= $this->hexToStr($keyItem);
        }
    }

    public function encrypt($str) {
        $td = $this->gettd();
        $ret = mcrypt_generic($td,$str);
        mcrypt_generic_deinit($td);
        mcrypt_module_close($td);
        $result =  base64_encode($ret);
        return str_replace('=','Q',$result);
    }



    private function getiv() {
        return pack('H16','0000000000000000');
    }

    private function gettd() {
        $iv = $this->getiv();
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
        mcrypt_generic_init($td, $this->keyStr,$iv);
        return $td;
    }

    private function hexToStr($hex){
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2){
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }
}
给我你的怀抱
给我你的怀抱

Antworte allen(1)
刘奇

问题已得到解决,还是参考之前的文章:
1、加密后的字符未进行字符转换,所以无法进行解密,缺少一个步骤。
2、参考我发的文章链接,PHP类完全通用。可忽略我之前发布的代码,我会再整理一份对的。

java

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class ThreeDES {

private static final String Algorithm = "DESede"; //定义 加密算法,可用 DES,DESede,Blowfish


//keybyte为加密密钥,长度为24字节
//src为被加密的数据缓冲区(源)
public static byte[] encryptMode(byte[] keybyte, byte[] src) {
   try {
        //生成密钥
        SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

        //加密
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.ENCRYPT_MODE, deskey);
        return c1.doFinal(src);
    } catch (java.security.NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (java.lang.Exception e3) {
        e3.printStackTrace();
    }
    return null;
}

//keybyte为加密密钥,长度为24字节
//src为加密后的缓冲区
public static byte[] decryptMode(byte[] keybyte, byte[] src) {      
try {
        //生成密钥
        SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

        //解密
        Cipher c1 = Cipher.getInstance(Algorithm);
        c1.init(Cipher.DECRYPT_MODE, deskey);
        return c1.doFinal(src);
    } catch (java.security.NoSuchAlgorithmException e1) {
        e1.printStackTrace();
    } catch (javax.crypto.NoSuchPaddingException e2) {
        e2.printStackTrace();
    } catch (java.lang.Exception e3) {
        e3.printStackTrace();
    }
    return null;
}

//转换成十六进制字符串
public static String byte2hex(byte[] b) {
    String hs="";
    String stmp="";

    for (int n=0;n<b.length;n++) {
        stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
        if (stmp.length()==1) hs=hs+"0"+stmp;
        else hs=hs+stmp;
        if (n<b.length-1)  hs=hs+":";
    }
    return hs.toUpperCase();
}

public static void main(String[] args)
{
    //添加新安全算法,如果用JCE就要把它添加进去
    Security.addProvider(new com.sun.crypto.provider.SunJCE());

    final byte[] keyBytes = {0x11, 0x28, 0x4F, 0x58, (byte)0x88, 0x10, 0x40, 0x38
                           , 0x28, 0x25, 0x79, 0x51, (byte)0xCB, (byte)0xDD, 0x55, 0x66
                           , 0x77, 0x29, 0x74, (byte)0x98, 0x30, 0x40, 0x36, (byte)0xE2};    //24字节的密钥
    String szSrc = "12345678";
    
    System.out.println("加密前的字符串:" + szSrc);
    
    byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());        
    System.out.println("加密后的字符串:" + new String(encoded));
    
    byte[] srcBytes = decryptMode(keyBytes, encoded);
    System.out.println("解密后的字符串:" + (new String(srcBytes)));
}

}

以上代码完全取至 /q/10... 中

以下是PHP代码。

<?php

class EasyCrypt3Des {

private $_key = "";

public function __construct() {
    $keyItem = array(
        '0x11','0x28','0x4F','0x58','0x88','0x10','0x40','0x38','0x28','0x25','0x79','0x51',
        '0xCB','0xDD','0x55','0x66','0x77','0x29','0x74','0x98','0x30','0x40','0x36','0xE2'
    );
    foreach($keyItem as $kitem) {
        //转换成字符
        $this->_key .= chr($kitem);
    }
}

public function encrypt($str) {
    $td = $this->gettd();
    $ret = mcrypt_generic($td, $this->pkcs5_pad($str, 8));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $this->strToHex($ret);
}

public function decrypt($str) {
    $td = $this->gettd();
    $ret = $this->pkcs5_unpad(mdecrypt_generic($td, $this->hexToStr($str)));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $ret;
}

private function pkcs5_pad($text, $blocksize) {
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

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

private function getiv() {
    return pack('H16', '0000000000000000');
}

private function gettd() {
    $iv = $this->getiv();
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
    mcrypt_generic_init($td, $this->_key, $iv);
    return $td;
}

private function strToHex($string){
    $hex = '';
    for ($i=0; $i<strlen($string); $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strToUpper($hex);
}

private function hexToStr($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

}
$EasyCrypt3Des = new EasyCrypt3Des();
$code = $EasyCrypt3Des->encrypt('12345678');
echo $code .'<br/>';
echo $EasyCrypt3Des->decrypt($code);
exit;

主要在于字符转换这块。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage