Je veux écrire une classe de chiffrement en Java en utilisant PHP, mais j'ai vu cette façon de l'écrire en Java et cela m'a donné un énorme mal de tête. Totalement illogique. J'ai trouvé une classe complète et j'ai voulu y faire référence. Après de nombreuses expériences, je n'ai pas pu traduire la classe de chiffrement que j'ai téléchargée en PHP. S'il vous plaît aidez-moi. Merci.
/**
3Des cours d'aide
*/
classe publique 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
}
}
Ce qui précède est la classe Java dont j'ai besoin pour convertir en PHP,
Ci-joint l'article de référence ci-dessous
/q/10...
Ce qui suit est le code PHP que j'ai écrit après référence.
<?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;
}
}
Le problème a été résolu, merci de vous référer à l'article précédent :
1. Les caractères cryptés ne sont pas convertis en caractères, ils ne peuvent donc pas être déchiffrés.
2. Reportez-vous au lien de l'article que j'ai posté, la classe PHP est totalement universelle. Vous pouvez ignorer le code que j'ai posté auparavant, j'en compilerai un autre correct.
Java
importer java.security.Security;
importer javax.crypto.Cipher;
importer javax.crypto.SecretKey;
importer javax.crypto.spec.SecretKeySpec;
classe publique ThreeDES {
Algorithme de chaîne final statique privé = "DESede" ; //Définir l'algorithme de cryptage, disponible DES, DESede, Blowfish
}
Le code ci-dessus est entièrement extrait de /q/10...
Ce qui suit est le code PHP.
<?php
classe EasyCrypt3Des {
}
$EasyCrypt3Des = new EasyCrypt3Des();
$code = $EasyCrypt3Des->encrypt('12345678');
echo $code .'<br/>';
echo $EasyCrypt3Des->decrypt( $code);
sortie;
Résiste principalement à la conversion de caractères.