PHP解密中的AES 128加密

PHP解密中的AES 128加密,第1张

概述我一直在尝试使用AES-128CBC解密字符串,该CBC最初使用JAVAAES加密进行加密.在java中使用PKCS7填充.我尝试使用类似的PHP代码加密和解密.但我得到了不同的结果.我的Java代码importjava.security.MessageDigest;importjava.security.spec.AlgorithmParameterSpec;importja

我一直在尝试使用AES-128 CBC解密字符串,该CBC最初使用JAVA AES加密进行加密.在java中使用PKCS7填充.我尝试使用类似的PHP代码加密和解密.但我得到了不同的结果.

我的Java代码

import java.security.MessageDigest;import java.security.spec.AlgorithmParameterSpec;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import androID.util.Base64;/** * @author vipin.cb , vipin.cb@experionglobal.com <br> *         Sep 27, 2013, 5:18:34 PM <br> *         Package:- <b>com.veebow.util</b> <br> *         Project:- <b>Veebow</b> *         <p> */public class AESCrypt {    private final Cipher cipher;    private final SecretKeySpec key;    private AlgorithmParameterSpec spec;    public static final String SEED_16_CHaraCTER = "U1MjU1M0FDOUZ.Qz";    public AESCrypt() throws Exception {        // hash password with SHA-256 and crop the output to @R_446_5028@ for key        MessageDigest digest = MessageDigest.getInstance("SHA-256");        digest.update(SEED_16_CHaraCTER.getBytes("UTF-8"));        byte[] keyBytes = new byte[32];        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);        cipher = Cipher.getInstance("AES/CBC/PKCS7padding");        key = new SecretKeySpec(keyBytes, "AES");        spec = getIV();    }    public AlgorithmParameterSpec getIV() {        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };        IvParameterSpec ivParameterSpec;        ivParameterSpec = new IvParameterSpec(iv);        return ivParameterSpec;    }    public String encrypt(String plainText) throws Exception {        cipher.init(Cipher.ENCRYPT_MODE, key, spec);        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));        String encryptedText = new String(Base64.encode(encrypted,                Base64.DEFAulT), "UTF-8");        return encryptedText;    }    public String decrypt(String cryptedText) throws Exception {        cipher.init(Cipher.DECRYPT_MODE, key, spec);        byte[] bytes = Base64.decode(cryptedText, Base64.DEFAulT);        byte[] decrypted = cipher.doFinal(bytes);        String decryptedText = new String(decrypted, "UTF-8");        return decryptedText;    }}

和我使用的等效PHP代码.

<?PHPclass MCrypt {    private $iv = '0000000000000000'; #Same as in JAVA                  private $key = 'U1MjU1M0FDOUZ.Qz'; #Same as in JAVA    function __construct() {        $this->key = hash('sha256', $this->key, true);    }    function encrypt($str) {        $iv = $this->iv;        $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');        mcrypt_generic_init($td, $this->key, $iv);        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);        $pad = $block - (strlen($str) % $block);        $str .= str_repeat(chr($pad), $pad);        $encrypted = mcrypt_generic($td, $str);        mcrypt_generic_deinit($td);        mcrypt_module_close($td);        return base64_encode($encrypted);    }    function decrypt($code) {        $iv = $this->iv;        $td = mcrypt_module_open('rijndael-128', '', 'cbc', '');        mcrypt_generic_init($td, $this->key, $iv);        $str = mdecrypt_generic($td, base64_decode($code));        $block = mcrypt_get_block_size('rijndael-128', 'cbc');        mcrypt_generic_deinit($td);        mcrypt_module_close($td);        return $str;        //return $this->strippadding($str);                 }    /*      For PKCS7 padding     */    private function addpadding($string, $blocksize = 16) {        $len = strlen($string);        $pad = $blocksize - ($len % $blocksize);        $string .= str_repeat(chr($pad), $pad);        return $string;    }    private function strippadding($string) {        $slast = ord(substr($string, -1));        $slastc = chr($slast);        $pcheck = substr($string, -$slast);        if (preg_match("/$slastc{" . $slast . "}/", $string)) {            $string = substr($string, 0, strlen($string) - $slast);            return $string;        } else {            return false;        }    }}$encryption = new MCrypt();echo $encryption->encrypt('123456') . "<br/>";echo $encryption->decrypt('tpyxISJ83dqEs3uw8bN/+w==');

在Java中
纯文本= 123456
密文= tpyxISJ83dqEs3uw8bN / w ==

在PHP中

纯文本= 123456
密文= IErqfTCktrnmWndOpq3pnQ ==

当我尝试使用PHP解密来解密Java加密文本“tpyxISJ83dqEs3uw8bN / w ==”时,如果我删除了填充,我将得到一个空数组.没有删除填充我得到“::::::::::”

我认为PHP和Java中使用的IV字节存在一些错误
谁可以帮我这个事.我尝试过很多种组合.仍然没有结果.我是Java概念的新手.

– – – 解 – – – –

我根据owlstead给出的评论修改了我的PHP类.可能有更好的方法.我在这里发帖,以便将来有人可能会发现它有用,欢迎您提出意见,以便进一步改进.

<?PHPclass MCrypt {    private $hex_iv = '00000000000000000000000000000000'; # converted Java byte code in to HEX and placed it here                   private $key = 'U1MjU1M0FDOUZ.Qz'; #Same as in JAVA    function __construct() {        $this->key = hash('sha256', $this->key, true);        //echo $this->key.'<br/>';    }    function encrypt($str) {               $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');        mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);        $pad = $block - (strlen($str) % $block);        $str .= str_repeat(chr($pad), $pad);        $encrypted = mcrypt_generic($td, $str);        mcrypt_generic_deinit($td);        mcrypt_module_close($td);                return base64_encode($encrypted);    }    function decrypt($code) {                $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');        mcrypt_generic_init($td, $this->key, $this->hexToStr($this->hex_iv));        $str = mdecrypt_generic($td, base64_decode($code));        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);        mcrypt_generic_deinit($td);        mcrypt_module_close($td);                return $this->strippadding($str);                   }    /*      For PKCS7 padding     */    private function addpadding($string, $blocksize = 16) {        $len = strlen($string);        $pad = $blocksize - ($len % $blocksize);        $string .= str_repeat(chr($pad), $pad);        return $string;    }    private function strippadding($string) {        $slast = ord(substr($string, -1));        $slastc = chr($slast);        $pcheck = substr($string, -$slast);        if (preg_match("/$slastc{" . $slast . "}/", $string)) {            $string = substr($string, 0, strlen($string) - $slast);            return $string;        } else {            return false;        }    }function hexToStr($hex){    $string='';    for ($i=0; $i < strlen($hex)-1; $i+=2)    {        $string .= chr(hexdec($hex[$i].$hex[$i+1]));    }    return $string;}}$encryption = new MCrypt();echo $encryption->encrypt('123456') . "<br/>";echo $encryption->decrypt('tpyxISJ83dqEs3uw8bN/+w==');

解决方法:

您的IV不同,值为零的字节与字符“0”不同,字符“0”将转换为十六进制值为30或十进制为48的字节(如果您假定ASCII或UTF-8编码).

总结

以上是内存溢出为你收集整理的PHP解密中的AES 128加密全部内容,希望文章能够帮你解决PHP解密中的AES 128加密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1098729.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存