Saya ingin menulis kelas penyulitan dalam Java menggunakan PHP, tetapi saya melihat cara menulisnya dalam Java dan ia membuatkan saya sakit kepala yang teruk. Tidak logik sama sekali. Saya menjumpai kelas yang lengkap dan ingin merujuknya Selepas banyak percubaan, saya tidak dapat menterjemah kelas penyulitan yang saya muat naik ke dalam PHP. Tolong saya. Terima kasih.
/**
3Des membantu kelas
*/
kelas awam 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
}
}
Di atas ialah kelas java yang saya perlu tukar kepada PHP,
Dilampirkan artikel rujukan di bawah
/q/10...
Berikut ialah kod PHP yang saya tulis selepas rujukan.
<?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;
}
}
Masalah telah diselesaikan, sila rujuk artikel sebelumnya:
1 Aksara yang disulitkan tidak ditukar kepada aksara, jadi ia tidak boleh dinyahsulit.
2 Rujuk pautan artikel yang saya siarkan, kelas PHP adalah universal. Anda boleh mengabaikan kod yang saya siarkan sebelum ini, saya akan menyusun satu lagi yang betul.
java
import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
kelas awam ThreeDES {
Algoritma String akhir statik peribadi = "DESede"; //Tentukan algoritma penyulitan, tersedia DES, DESede, Blowfish
}
Kod di atas diambil sepenuhnya dari /q/10...
Berikut ialah kod PHP.
<?php
kelas EasyCrypt3Des {
}
$EasyCrypt3Des = EasyCrypt3Des baharu();
$kod = $EasyCrypt3Des->encrypt('12345678');
echo $code .'<br/>';
-Crypt; $3Descrypt $kod);
keluar;
Terutamanya terletak pada penukaran watak.