Результат шифрования AES / CBC / PKCS5Padding в PHP и Java отличается - PullRequest
0 голосов
/ 09 октября 2018

Я разрабатываю REST API, в котором данные, которые должны быть переданы на сервер, должны быть зашифрованы с помощью AES / CBC / PKCS5Padding.Клиентская сторона REST API использует Java для шифрования и дешифрования данных, в то время как на моей стороне я использую PHP.

Секретный ключ, используемый здесь, - это хеш с sha1.У меня такое же значение секретного ключа на стороне клиента, а также значение IV такое же, но когда я пытаюсь зашифровать и сравнить его с клиентом, оно отличается.

Код JAVA:

import java.util.Arrays;
import java.security.*;
import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.lang.Object;

class Main {

      public static String stringToHex(String base)
        {
         StringBuffer buffer = new StringBuffer();
         int intValue;
         for(int x = 0; x < base.length(); x++)
             {
             int cursor = 0;
             intValue = base.charAt(x);
             String binaryChar = new String(Integer.toBinaryString(base.charAt(x)));
             for(int i = 0; i < binaryChar.length(); i++)
                 {
                 if(binaryChar.charAt(i) == '1')
                     {
                     cursor += 1;
                 }
             }
             if((cursor % 2) > 0)
                 {
                 intValue += 128;
             }
             buffer.append(Integer.toHexString(intValue) + " ");
         }
         return buffer.toString();
      }

      public static String bytesToHex(byte[] a) {
       StringBuilder sb = new StringBuilder(a.length * 2);
       for(byte b: a)
          sb.append(String.format("%02x", b));
       return sb.toString();
      } 

      public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException,
        InvalidAlgorithmParameterException,
        NoSuchProviderException,
        NoSuchPaddingException,
        InvalidKeyException,
        IllegalBlockSizeException,
        BadPaddingException
        {
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        String secretKey = "mysecretkey102018";
        String message = "00155001C"
        byte[] key = sha.digest(secretKey.getBytes("UTF-8"));
        byte[] value = message.getBytes();
        key = Arrays.copyOf(key, 16);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        IvParameterSpec iv = new IvParameterSpec("AAAAAAAAAAAAAAAA".getBytes("UTF-8"));
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
        System.out.println(bytesToHex(cipher.doFinal(value)));
      }

Код PHP:

class IDebit
{
    private $iv = "AAAAAAAAAAAAAAAA";
    private $secret_key = "mysecretkey102018";
    private $message = "00155001C";        
    public function generateEncrytedKeyId()
    {
        $hashPassword = substr(hash("SHA1", $secret_key), 0, 32);
        $blocksize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $str = $this->pkcs5_pad($message, $blocksize);
        $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $hashPassword, $str, MCRYPT_MODE_CBC, self::IV);
        return bin2hex($encrypted);
    }

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

Результат шифрования на Java равен c1e7af770d9d0af59cc75d1c76aa78f6, а на PHP это d67a15a027be7e7ab68ea6ab88ea4f2f

Мне интересно, что не так с моим кодом.Я гуглил и проверял на этом форуме десятки раз, но я не могу получить тот же результат.Я перепроверил свой код с ответами, опубликованными людьми на этом форуме, и он идентичен.

...