>백엔드 개발 >PHP 튜토리얼 >Java의 AES/ECB/PKCS5Padding 암호화 방법과 인터페이스하기 위한 PHP용 샘플 코드(그림)

Java의 AES/ECB/PKCS5Padding 암호화 방법과 인터페이스하기 위한 PHP용 샘플 코드(그림)

黄舟
黄舟원래의
2017-03-28 10:07:567771검색

프로젝트 요구 사항으로 인해 API를 호출하기 위해 보험 회사와 인터페이스해야 합니다. 저희 회사는 PHP 백엔드이고, 보험 회사는 Java 백엔드입니다. 중간에 데이터 전송을 암호화하고 복호화해야 하며, 현재 널리 사용되는 암호화 AES가 권장됩니다.

접안 과정에서 산과 강을 통과하는 것이 불가피합니다.

다음은 제가 연결한 회사의 암호화 지침입니다.

Java의 AES/ECB/PKCS5Padding 암호화 방법과 인터페이스하기 위한 PHP용 샘플 코드(그림)

자신만의 암호화 방식을 명확히 해야 합니다. 그렇지 않으면 암호화 모드인 ECB와 CBC의 차이로 인해 결과가 크게 달라집니다.

사용 가능한 최종 코드 첨부:

<?php
class Security {
    public static function encrypt($input, $key) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $input = Security::pkcs5_pad($input, $size);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, &#39;&#39;, MCRYPT_MODE_ECB, &#39;&#39;);
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
    }
  
    private static function pkcs5_pad ($text, $blocksize) {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
  
    public static function decrypt($sStr, $sKey) {
        $decrypted= mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        $sKey,
        base64_decode($sStr),
        MCRYPT_MODE_ECB
    );
 
        $dec_s = strlen($decrypted);
        $padding = ord($decrypted[$dec_s-1]);
        $decrypted = substr($decrypted, 0, -$padding);
        return $decrypted;
    }  
}
  
  
  
// $key = "1234567891234567";
// $data = "example";
  
// $value = Security::encrypt($data , $key );
// echo "加密::".$value.&#39;<br/>&#39;;
// echo Security::decrypt($value, $key );

Public 함수에서 호출됨 :

/**
     * request body加密
     * @param array $content 投保人的信息
     * @return string
     */
    function hetai_encrypt($content) {
         
        // 方案七
        print_r("\r\n");
        vendor(&#39;encrypt.Security&#39;) or die("方案7引入失败");
        $sec = new \Security();
        $string = $content;
        $sec_res = $sec->encrypt($string, base64_decode("eeSvvVtUDLi5lTBHDjCeFw=="));
        $sec_res = strToHex($sec_res);// 结果转16进制并转成大写
        // 这里做了好几次的转换
        // 只是为了迎合出来我需要的结果而已
        // 根据自己的加密要求来定
        $encrypt_upper = strToHex(base64_decode(hexToStr($sec_res)));
        var_dump("\r\n方案7加密的结果\r\n" . $encrypt_upper);
        // 解密
        $sec_res_lower = strtolower($sec_res);// 转小写
        $sec_res_lower_tostr = hexToStr($sec_res);// 16进制转成string
        $sec_dec = $sec->decrypt($sec_res_lower_tostr, base64_decode("eeSvvVtUDLi5lTBHDjCeFw=="));
        var_dump("\r\n方案7解密的结果\r\n" . $sec_dec);
        return $encrypt_upper;
         
    }

BinaryString16으로 변환 16진수로 변환 16진수 문자열을 바이너리로:

/**
     * 字符串转十六进制
     * @param string $string
     * @return string
     */
    function strToHex($string)
    {
        $hex="";
        for($i=0;$i<strlen($string);$i++)
            $hex.=dechex(ord($string[$i]));
        $hex=strtoupper($hex);
        return $hex;
    }
     
    /**
     * 十六进制转字符串
     * 16进制的转为2进制字符串    
     * @param 十六进制 $hex
     * @return string
     */
    function hexToStr($hex)
    {
        $string="";
        for($i=0;$i<strlen($hex)-1;$i+=2)
            $string.=chr(hexdec($hex[$i].$hex[$i+1]));
        return  $string;
    }

3일 동안 저를 괴롭혔던 암호화 기능 블록이 첨부되어 있습니다. 참고용으로 마음에 들지 않으면 댓글을 달지 마세요~

Java의 AES/ECB/PKCS5Padding 암호화 방법과 인터페이스하기 위한 PHP용 샘플 코드(그림)

위 내용은 Java의 AES/ECB/PKCS5Padding 암호화 방법과 인터페이스하기 위한 PHP용 샘플 코드(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.