从Java到PHP的带有SecretKey的AES CBC PKCS5Padding

亚历山德罗

我需要将此代码从Java转换为PHP:

我知道我应该按照PHP的要求将iv和SALT从字节转换为字符串

$td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv_array_string);

String password = "mypass";
String encoding = "UTF-8";
String cleanString = "text to encode";

byte[] salt_array = {(byte) 0x98, (byte) 0x71, (byte) 0x1F, (byte) 0x71, (byte) 0x5D, (byte) 0x71, (byte) 0x28, (byte) 0x8F};

//Key
KeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt_array, 16, 128);
SecretKey tmp = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(keySpec);
SecretKey key = new SecretKeySpec(tmp.getEncoded(), "AES");

//ciphers
byte[] iv_array = {(byte) 0x98, (byte) 0x71, (byte) 0xF3, (byte) 0x52, (byte) 0x1A, (byte) 0x71, (byte) 0x38, (byte) 0x1F, (byte) 0x75, (byte) 0x1F, (byte) 0x1F, (byte) 0xE0, (byte) 0xEF, (byte) 0x39, (byte) 0x98, (byte) 0x1F};
Cipher encChiper = Cipher.getInstance("AES/CBC/PKCS5Padding");
AlgorithmParameterSpec params = new iv_arrayParameterSpec(iv_array);
encChiper.init(Cipher.ENCRYPT_MODE, key, params);
byte[] crypted = encChiper.doFinal(cleanString.getBytes(encoding));
//output encoded
String base64Crypted = new String(Base64.encodeBase64(crypted), encoding);
奥兰多

这是一个可能的解决方案。在PHP <5.5中,您必须使用pbkdf2()函数(php框架api中未提供)。PHP> = 5.5具有函数hash_pbkdf2(..)

<?php
     class CbcCrypt {

           private $iterations = 16;
           private $key_lenght = 16;
           private $password = "password";
           //parametro utilizzato da key per generare la chiave
           private $salt = array(0xA7, 0x71, 0x1F, 0xF5, 0x5D, 0xD2, 0x28, 0x8F);
           //parametro utilizzato dall'algoritmo per il cript
           private $iv = array(0xCB, 0x35, 0xF3, 0x52, 0x1A, 0xF7, 0x38, 0x0B, 0x75, 0x03, 0x8E, 0xE0, 0xEF, 0x39, 0x98, 0xC7);

           public function encrypt($data) {
               $ivStr = implode(array_map("chr", $this->iv));
               $saltStr = implode(array_map("chr", $this->salt));
               //key generator
               //$hash = hash_pbkdf2("sha1", $this->password, $saltStr, $this->iterations, $this->key_lenght, true);
               $hash = $this->pbkdf2($this->password, $saltStr, "sha1", $this->iterations, $this->key_lenght, true);
               $td = mcrypt_module_open('rijndael-128', '', 'cbc', $ivStr);
               //aggiunta del padding
               $toEncryptStrPadded = $this->pkcs5_pad($data);
               mcrypt_generic_init($td, $hash, $ivStr);
               $encrypted = mcrypt_generic($td, $toEncryptStrPadded);
               //print_r('base64 enc: ' . base64_encode($encrypted));
               mcrypt_generic_deinit($td);
               mcrypt_module_close($td);
               return base64_encode($encrypted);
           }

           function pbkdf2($password, $salt, $algorithm = 'sha512', $count = 20000, $key_length = 128, $raw_output = false) {
               if (!in_array($algorithm, hash_algos(), true)) {
                   exit;
               }
           if ($count <= 0 || $key_length <= 0) {
               $count = 20000;
               $key_length = 128;
           }

           $hash_length = strlen(hash($algorithm, "", true));
           $block_count = ceil($key_length / $hash_length);

           $output = "";
           for ($i = 1; $i <= $block_count; $i++) {
               $last = $salt . pack("N", $i);
               $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
               for ($j = 1; $j < $count; $j++) {
                   $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
               }
               $output .= $xorsum;
           }

           if ($raw_output) {
               return substr( $output, 0, $key_length );
           } else {
               return base64_encode(substr( $output, 0, $key_length ));
           }
       }

       function pkcs5_pad($text) {
           $blocksize = 16;
           $pad = $blocksize - (strlen( $text ) % $blocksize);
    }
}
?>

让我知道是否可以。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#中的Java AES / CBC / PKCS5Padding

来自分类Dev

使用CryptoJS解密AES / CBC / PKCS5Padding

来自分类Dev

AES / cbc / pkcs5padding加密IOS

来自分类Dev

在Dart中解密AES / CBC / PKCS5Padding加密

来自分类Dev

Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

来自分类Dev

AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

来自分类Dev

从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

来自分类Dev

为什么我收到javax.crypto.BadPaddingException(AES / CBC / PKCS5Padding)

来自分类Dev

所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

来自分类Dev

如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

用Java加密/解密“ AES / ECB / PKCS5Padding”

来自分类Dev

使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

来自分类Dev

无法复制从Java到PHP中使用AES / ECB / PKCS5Padding加密方法

来自分类Dev

将文本加密为AES / CBC / PKCS7Padding

来自分类Dev

使用 AES/CBC/PKCS7Padding 加密/解密

来自分类Dev

PHP中的AES / CBC / PKCS#5加密算法

来自分类Dev

如何使用Objective-c实现AES PKCS5Padding

来自分类Dev

Java使用aes256 / CBC / PKCS7Padding加密文件

来自分类Dev

Java Encrypt a file using aes256/ CBC/PKCS7Padding

来自分类Dev

矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

来自分类Dev

java.security.NoSuchAlgorithmException:找不到任何支持 Blowfish/ECB/PKCS5Padding 的提供程序

来自分类Dev

Java AES / CBC / PKCS5填充流加密性能与未加密相比

来自分类Dev

Java AES / CBC / PKCS5填充流加密性能与未加密相比

来自分类Dev

带有CBC的AES 128

Related 相关文章

  1. 1

    C#中的Java AES / CBC / PKCS5Padding

  2. 2

    使用CryptoJS解密AES / CBC / PKCS5Padding

  3. 3

    AES / cbc / pkcs5padding加密IOS

  4. 4

    在Dart中解密AES / CBC / PKCS5Padding加密

  5. 5

    Ruby中的Coldfusion“ AES / CBC / PKCS5Padding”解密

  6. 6

    AES / CBC / PKCS5Padding与AES / CBC / PKCS7Padding具有256键大小的性能Java

  7. 7

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  8. 8

    Android / Java AES 256 CBC与PHP中的PKCS5Padding解密

  9. 9

    从ColdFusion加密解密NodeJS中的AES / CBC / PKCS5Padding

  10. 10

    为什么我收到javax.crypto.BadPaddingException(AES / CBC / PKCS5Padding)

  11. 11

    所有类型的Android设备均可使用AES / CBC / PKCS5Padding加密解密算法和SHA-1哈希算法吗

  12. 12

    如何在dart中使用AES CBC 256位和PKCS5Padding进行加密和解密以及如何检索参数

  13. 13

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  14. 14

    用Java加密/解密“ AES / ECB / PKCS5Padding”

  15. 15

    使用 AES/ECB/NoPadding 与 PKCS5Padding 进行加密

  16. 16

    无法复制从Java到PHP中使用AES / ECB / PKCS5Padding加密方法

  17. 17

    将文本加密为AES / CBC / PKCS7Padding

  18. 18

    使用 AES/CBC/PKCS7Padding 加密/解密

  19. 19

    PHP中的AES / CBC / PKCS#5加密算法

  20. 20

    如何使用Objective-c实现AES PKCS5Padding

  21. 21

    Java使用aes256 / CBC / PKCS7Padding加密文件

  22. 22

    Java Encrypt a file using aes256/ CBC/PKCS7Padding

  23. 23

    矢量不随 Java 中的“AES/CBC/pkcs7padding”而改变

  24. 24

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  25. 25

    使用PKCS7Padding进行AES CBC加密在Java和Objective-C中具有不同的结果

  26. 26

    java.security.NoSuchAlgorithmException:找不到任何支持 Blowfish/ECB/PKCS5Padding 的提供程序

  27. 27

    Java AES / CBC / PKCS5填充流加密性能与未加密相比

  28. 28

    Java AES / CBC / PKCS5填充流加密性能与未加密相比

  29. 29

    带有CBC的AES 128

热门标签

归档