Поскольку вас интересует расшифровка зашифрованной строки, в которой шифрование было выполнено с помощью Java encryptEK
-метода, а расшифровку следует выполнять с помощью PHP decrypt
-метода (или наоборот), я игнорируюкод main
-метода (который мне не очень понятен), и я сосредоточен на переносе обоих Java-методов, encryptEK
и decrypt
, на PHP-методы.
Метод Java encryptEK
принимает простой текст и ключ в виде байтового массива, шифрует простой текст с использованием AES (256-ECB) и кодирует зашифрованный текст с использованием кодировки Base64.Возможный аналог PHP:
public function encrypt($data = '', $key = NULL) {
if($key != NULL && $data != ""){
$method = "AES-256-ECB";
$encrypted = openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA);
$result = base64_encode($encrypted);
return $result;
}else{
return "String to encrypt, Key is required.";
}
}
Примечание. В режиме ECB не используется IV.
Метод Java decrypt
принимает строку в кодировке base64 и декодирует ееи затем расшифровывает это.Возможный аналог PHP:
public function decrypt($data="", $key = NULL) {
if($key != NULL && $data != ""){
$method = "AES-256-ECB";
$dataDecoded = base64_decode($data);
$decrypted = openssl_decrypt($dataDecoded, $method, $key, OPENSSL_RAW_DATA);
return $decrypted;
}else{
return "Encrypted String to decrypt, Key is required.";
}
}
Оба Java-метода encodeBase64String
и decodeBase64StringTOByte
, использующие класс java.util.Base64
, не используются Java-методами encryptEK
и decrypt
.Вместо этого используются соответствующие методы org.apache.commons.codec.binary.Base64
-класса (например, https://commons.apache.org/proper/commons-codec/download_codec.cgi). По этой причине я больше не обращаю внимания на оба метода.
В справочнике по JavaКод без 256-битного ключа AES, например, генерируется, но случайный ключ обычно генерируется следующим образом:
KEYGEN.init(256);
SecretKey secretKey = KEYGEN.generateKey();
byte[] key = secretKey.getEncoded();
В PHP это делается с помощью
$key = random_bytes(32);
Для смешанного шифрования/ decryption-testing (например, Java / PHP) на обеих сторонах должен использоваться один и тот же ключ. Например, этот ключ предоставляется в Java:
byte[] key = "This is a 256 bits = 32 byte key".getBytes(Charsets.UTF_8);
и в PHP:
$key = mb_convert_encoding("This is a 256 bits = 32 byte key", "UTF-8");
Тест 1: Шифрование / дешифрование с помощью Java (с использованием случайного сгенерированного ключа)
Plain text: The quick brown fox jumps over the lazy dog
Randomly generated key (hex): 20e9c191374b688e74e68ab6c969109e84c5c8e059d84f16f2beb07a7545cbc8
Encrypted text (base64 encoded): ZWOnSYErRxRRtqoVFTLVQMT329pOFHzN1gPDMuiZt0zFpt4n2TF/L54RB21zhVUa
Decrypted text: The quick brown fox jumps over the lazy dog
Тест 2: Шифрование / дешифрование с помощью PHP (с использованием случайного сгенерированного ключа)
Plain text: The quick brown fox jumps over the lazy dog
Randomly generated key (hex): eecd40c21e2a395f3aa3baeac19bfc8dcee04ea6e07f02dca7069397a487824f
Encrypted text (base64 encoded): 8wjusOED9TTXHjyEqvmGExLATVlvhg3hXEBHQ6Ku3Fos2OrYKbF+4XdO6cD9JJA5
Decrypted text: The quick brown fox jumps over the lazy dog
Возможные части шифрования и дешифрования:
$key = random_bytes(32);
echo bin2hex($key);
$atomAES = new AtomAES();
$encrypt = $atomAES->encrypt("The quick brown fox jumps over the lazy dog", $key);
echo $encrypt;
$decrypt = $atomAES->decrypt($encrypt, $key);
echo $decrypt;
Тест 3: Шифрование с Java / Расшифровка с помощью PHP (с помощью конкретного ключа выше)
Plain text: The quick brown fox jumps over the lazy dog
Encrypted text (base64 encoded) with Java: /XjXJc5dNk6p/h2HL8MVmmWG8Vd0Ud2x1QQWwmIQr9OG/PXZ0AzsIIMV1YmvMJho
Decrypted text with PHP: The quick brown fox jumps over the lazy dog
Возможная часть расшифровки:
$key = mb_convert_encoding("This is a 256 bits = 32 byte key", "UTF-8");
$atomAES = new AtomAES();
$decrypt = $atomAES->decrypt("/XjXJc5dNk6p/h2HL8MVmmWG8Vd0Ud2x1QQWwmIQr9OG/PXZ0AzsIIMV1YmvMJho", $key);
echo $decrypt;
Тест 4: Шифрование с помощью PHP / Расшифровка with Java (используя конкретный ключ выше)
Plain text: The quick brown fox jumps over the lazy dog
Encrypted text (base64 encoded) with PHP: /XjXJc5dNk6p/h2HL8MVmmWG8Vd0Ud2x1QQWwmIQr9OG/PXZ0AzsIIMV1YmvMJho
Decrypted text with Java: The quick brown fox jumps over the lazy dog
Возможная часть шифрования:
$key = mb_convert_encoding("This is a 256 bits = 32 byte key", "UTF-8");
$atomAES = new AtomAES();
$encrypt = $atomAES->encrypt("The quick brown fox jumps over the lazy dog", $key);
echo $encrypt;
РЕДАКТИРОВАТЬ:
Аналогк коду в методе main (в сочетании с вашим примером):
$encKey = mb_convert_encoding("VEMwcCYfFpsrXQVIFTDrA/2zP/5PYOY6JC1XEkEcLGSk/klt+HqHzGSr781Yznku", "UTF-8");
$asp_secret = mb_convert_encoding("DTosv9G179D0cY1985Uh2eF6ND80C95L", "UTF-8");
atomAES = new AtomAES();
$enc_key = $atomAES->decrypt($encKey, $asp_secret);
$enc_asp_secret = $atomAES->encrypt($asp_secret, base64_decode(base64_encode($enc_key)));
//$enc_asp_secret = $atomAES->encrypt($asp_secret, $enc_key);
echo "asp secret encrypted:\n".mb_convert_encoding($enc_asp_secret, "UTF-8")."\n";
Примечание: PHP-выражение base64_decode(base64_encode($enc_key))
эквивалентно $enc_key
, поэтому вы также можете заменить его строкойв настоящее время закомментировано.Единственная причина, по которой я его написал, заключается в том, что он также закодирован в коде Java.Здесь decodeBase64StringTOByte(encodeBase64String(enc_key)
эквивалентно enc_key
.Это потому, что один метод является обратным к другому.
Если вы запустите приведенный выше код, то вы получите:
asp secret encrypted:
zAnTcjmAezfdzrWGixyfwmb8cM0otrsmwJ8+cNDs48Axh9hYgBtCJyeSE9tCvEBz
Вы можете альтернативно определить третий метод из AtomAES
-класс:
public function main(){
$encKey = mb_convert_encoding("VEMwcCYfFpsrXQVIFTDrA/2zP/5PYOY6JC1XEkEcLGSk/klt+HqHzGSr781Yznku", "UTF-8");
$asp_secret = mb_convert_encoding("DTosv9G179D0cY1985Uh2eF6ND80C95L", "UTF-8");
$enc_key = $this->decrypt($encKey, $asp_secret);
$enc_asp_secret = $this->encrypt($asp_secret, base64_decode(base64_encode($enc_key)));
//$enc_asp_secret = $this->encrypt($asp_secret, $enc_key);
echo "asp secret encrypted:\n".mb_convert_encoding($enc_asp_secret, "UTF-8")."\n";
}
, который можно вызвать с помощью
$atomAES = new AtomAES();
$atomAES->main();