Преобразование Java в php - шифрование AES с помощью файла keystore.jks - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь преобразовать метод Java шифрования и дешифрования в PHP.

Это метод шифрования / дешифрования AES с файлом keystore.jks .Мне трудно этого добиться.

Я пытался конвертировать, используя метод mcrypt_encrypt в PHP.Но не смог найти способ сделать это с файлом keystore.jks .

Было бы здорово, если бы вы, ребята, могли прокомментировать, что делает каждая важная строка.

function my_aes_encrypt($key, $data) {
 if(16 !== strlen($key)) $key = hash('MD5', $key, true);
 $padding = 16 - (strlen($data) % 16);
     $data .= str_repeat(chr($padding), $padding);
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB, str_repeat("\0", 16)));
 }
function my_aes_decrypt($str, $key){ 
     $str = base64_decode($str);
     $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
     $block = mcrypt_get_block_size('rijndael_128', 'ecb');
     $pad = ord($str[($len = strlen($str)) - 1]);
     $len = strlen($str);
     $pad = ord($str[$len-1]);
     return substr($str, 0, strlen($str) - $pad);
}
public class MainClass {
 public static void main(String[] args) {
  try {
  String ALIAS = "alias";
  String KEYSTORE_PASSWORD = "key_pass";
  String KEY_PASSWORD = "k_pass";

  KeyStore keyStore = KeyStore.getInstance("JCEKS");
  FileInputStream stream = new FileInputStream("path/to/keyFile.jks");
  keyStore.load(stream, KEYSTORE_PASSWORD.toCharArray());
  Key key = keyStore.getKey(ALIAS, KEY_PASSWORD.toCharArray());

   String data = "text to encrypt";

   //Encrypt Data
   String encryptedData = encryptWithAESKey(data, key.getEncoded());

   System.out.println("Encrypted Data : " + encryptedData);

   //Decrypt Data
   System.out.println("Decrypted Data : " +decryptWithAESKey(encryptedData, key.getEncoded()));

  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 public static String encryptWithAESKey(String data, byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException,
   InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
  SecretKey secKey = new SecretKeySpec(key, "AES");

  Cipher cipher = Cipher.getInstance("AES");

  cipher.init(Cipher.ENCRYPT_MODE, secKey);
  byte[] newData = cipher.doFinal(data.getBytes());

  return Base64.encodeBase64String(newData);
 }

 public static String decryptWithAESKey(String inputData, byte[] key) throws NoSuchAlgorithmException,
   NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
  Cipher cipher = Cipher.getInstance("AES");
  SecretKey secKey = new SecretKeySpec(key, "AES");

  cipher.init(Cipher.DECRYPT_MODE, secKey);
  byte[] newData = cipher.doFinal(Base64.decodeBase64(inputData.getBytes()));
  return new String(newData);

 }
}

1 Ответ

0 голосов
/ 22 мая 2019

PHP-код ничего не делает - это только процедуры шифрования и дешифрования;

Java-код шифрует данные с помощью encryptWithAESKey (), а затем расшифровывает их с помощью decryptWithAESKey (). Ключ загружается из файла "путь / к / keyFile.jks" (поддельный путь, вы можете изменить его) У вас есть этот файл ключей? Посмотрите на мой класс кодировщика:

<?php
class AES {

const M_CBC = 'cbc';
const M_CFB = 'cfb';
const M_ECB = 'ecb';
const M_NOFB = 'nofb';
const M_OFB = 'ofb';
const M_STREAM = 'stream';

protected $key;
protected $cipher;
protected $data;
protected $mode;
protected $IV;

/**
 * 
 * @param type $data
 * @param type $key
 * @param type $blockSize
 * @param type $mode
 */
function __construct($data = null, $key = null, $blockSize = null, $mode = null) {
    $this->setData($data);
    $this->setKey($key);
    $this->setBlockSize($blockSize);
    $this->setMode($mode);
$this->setIV("");
}

/**
 * 
 * @param type $data
 */
public function setData($data) {
    $this->data = $data;
}

/**
 * 
 * @param type $key
 */
public function setKey($key) {
    $this->key = $key;
}

/**
 * 
 * @param type $blockSize
 */
public function setBlockSize($blockSize) {
    switch ($blockSize) {
        case 128:
            $this->cipher = MCRYPT_RIJNDAEL_128;
            break;

        case 192:
            $this->cipher = MCRYPT_RIJNDAEL_192;
            break;

        case 256:
            $this->cipher = MCRYPT_RIJNDAEL_256;
            break;
    }
}

/**
 * 
 * @param type $mode
 */
public function setMode($mode) {
    switch ($mode) {
        case AES::M_CBC:
            $this->mode = MCRYPT_MODE_CBC;
            break;
        case AES::M_CFB:
            $this->mode = MCRYPT_MODE_CFB;
            break;
        case AES::M_ECB:
            $this->mode = MCRYPT_MODE_ECB;
            break;
        case AES::M_NOFB:
            $this->mode = MCRYPT_MODE_NOFB;
            break;
        case AES::M_OFB:
            $this->mode = MCRYPT_MODE_OFB;
            break;
        case AES::M_STREAM:
            $this->mode = MCRYPT_MODE_STREAM;
            break;
        default:
            $this->mode = MCRYPT_MODE_ECB;
            break;
    }
}

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


/**
 * 
 * @return boolean
 */
public function validateParams() {
    if ($this->data != null && $this->key != null && $this->cipher != null) {
    if(strlen($this->key) > 16) $this->setKey(substr($this->key, 0, 16));
    if(strlen($this->key) < 16){ $n = 1 + intval(16 / strlen($this->key)); $this->setKey(substr(str_repeat($this->key, $n), 0, 16));}
    $size = mcrypt_get_block_size($this->cipher, $this->mode); 
    $this->data = $this->pkcs5_pad($this->data, $size);
        return true;
    } else {
        return FALSE;
    }
}

 public function setIV($IV) {
    $this->IV = $IV;
}

 protected function getIV() {
if ($this->IV == "") {
    $this->IV = mcrypt_create_iv(mcrypt_get_iv_size($this->cipher, $this->mode), MCRYPT_RAND);
}
    return $this->IV;
}

/**
 * @return type
 * @throws Exception
 */
public function encrypt() {

    if ($this->validateParams()) {
        return trim(base64_encode(
                        mcrypt_encrypt(
                                $this->cipher, $this->key, $this->data, $this->mode, $this->getIV())));
    } else {
        throw new Exception('Invlid params!');
    }
}

/**
 * 
 * @return type
 * @throws Exception
 */
public function decrypt() {
    if ($this->validateParams()) {
        return trim(mcrypt_decrypt(
                        $this->cipher, $this->key, base64_decode($this->data), $this->mode, $this->getIV()));
    } else {
        throw new Exception('Invlid params!');
    }
  }
}

и пример использования:

    $crypt = new AES('{"username":"Tiger","amount":20,"source":1,"ttime":1517405737}', "49c50ba2129b7730", 128);
$encdata = $crypt->encrypt();


$crypt = new AES($encdata, "49c50ba2129b7730", 128);
$data = $crypt->decrypt();
...